Flask App: Update progress bar while function runs

前端 未结 2 612
挽巷
挽巷 2020-12-02 09:58

I\'m building a fairly simple WebApp in Flask that performs functions via a website\'s API. My users fill out a form with their account URL and API token; when they submit

2条回答
  •  孤城傲影
    2020-12-02 10:26

    I run this simple but educational Flask SSE implementation on localhost. To handle 3rd party (user uploaded) library in GAE:

    1. Create a directory named lib in your root path.
    2. copy gevent library directory to lib directory.
    3. Add these lines to your main.py:

      import sys
      sys.path.insert(0,'lib')
      
    4. Thats all. If you use lib directory from a child folder, use relative reference: sys.path.insert(0, ../../blablabla/lib')

    From http://flask.pocoo.org/snippets/116/

    # author: oskar.blom@gmail.com
    #
    # Make sure your gevent version is >= 1.0
    import gevent
    from gevent.wsgi import WSGIServer
    from gevent.queue import Queue
    
    from flask import Flask, Response
    
    import time
    
    
    # SSE "protocol" is described here: http://mzl.la/UPFyxY
    class ServerSentEvent(object):
    
        def __init__(self, data):
            self.data = data
            self.event = None
            self.id = None
            self.desc_map = {
                self.data : "data",
                self.event : "event",
                self.id : "id"
            }
    
        def encode(self):
            if not self.data:
                return ""
            lines = ["%s: %s" % (v, k) 
                     for k, v in self.desc_map.iteritems() if k]
    
            return "%s\n\n" % "\n".join(lines)
    
    app = Flask(__name__)
    subscriptions = []
    
    # Client code consumes like this.
    @app.route("/")
    def index():
        debug_template = """
         
           
           
           
             

    Server sent events

    """ return(debug_template) @app.route("/debug") def debug(): return "Currently %d subscriptions" % len(subscriptions) @app.route("/publish") def publish(): #Dummy data - pick up from request for real data def notify(): msg = str(time.time()) for sub in subscriptions[:]: sub.put(msg) gevent.spawn(notify) return "OK" @app.route("/subscribe") def subscribe(): def gen(): q = Queue() subscriptions.append(q) try: while True: result = q.get() ev = ServerSentEvent(str(result)) yield ev.encode() except GeneratorExit: # Or maybe use flask signals subscriptions.remove(q) return Response(gen(), mimetype="text/event-stream") if __name__ == "__main__": app.debug = True server = WSGIServer(("", 5000), app) server.serve_forever() # Then visit http://localhost:5000 to subscribe # and send messages by visiting http://localhost:5000/publish

提交回复
热议问题