2015-09-06 1 views
-1

Je configure un site en utilisant un flacon python. Quand il me confond, je suis ici pour montrer ma pauvre Situation:Activer la réponse asynchrone dans un flacon

... 
@app.route('/wanted_delay_response') 
def delay_response(): 
    def background_work(): 
     # I want to check some flags in the background 
     # this should not block, but it does as I try below 
     pass 
    gevent.spawn(background_work) 
    # the most confusing part comes: 
    return 'This is not what I really want to response' 

comme indiqué ci-dessus, le travail de fond se poursuivra en arrière-plan, mais le résultat que je veux viendrais de lui.

Cependant, je n'ai aucune idée comment notifier le serveur pour traiter d'autres demandes lorsque le travail en arrière-plan est en cours d'exécution, mais avec un résultat.

Ou est-il élégant de mettre de côté la demande en cours, et de revenir à la réponse lorsque le travail en arrière-plan se termine, dans l'intervalle, le serveur peut traiter d'autres demandes?

Répondre

0

Les requêtes HTTP entre le client et le serveur sont de courte durée et ne conviennent donc pas au cas d'utilisation que vous avez décrit. Dans le cas où le serveur envoie des données au client lorsque les données sont prêtes, l'utilisation doit utiliser la technologie push du serveur. Par exemple, vous pouvez utiliser Websockets pour implémenter la connexion entre le client et le serveur.

Toutefois, les Websockets ne sont pas faciles à gérer, car les connexions sont ouvertes pendant de longues périodes. Il existe des extensions pour Flask, ce qui pourrait simplifier l'utilisation des websockets. Par exemple, cochez https://github.com/kennethreitz/flask-sockets.

+0

Merci d'avoir fourni une solution géniale. C'est vraiment acceptable pour moi que les requêtes HTTP existent juste un court instant. Le module Websockets présente un grand avantage pour moi, non seulement pour la situation actuelle que j'ai rencontrée, mais pour fusionner d'autres parties de mon serveur. – xete