Using flask inside class

前端 未结 3 1599
攒了一身酷
攒了一身酷 2020-12-08 09:36

I have application with many threads. One of them is flask, which is used to implement (axillary) API. It used with low load and never exposed to the Internet, so build-in f

3条回答
  •  猫巷女王i
    2020-12-08 10:27

    Although this works it doesn't feel compliant with the Flask style guide. If you need to wrap a Flask application inside your project, create a separate class to your needs and add functions that should be executed

    from flask import Flask, Response
    
    
    class EndpointAction(object):
    
        def __init__(self, action):
            self.action = action
            self.response = Response(status=200, headers={})
    
        def __call__(self, *args):
            self.action()
            return self.response
    
    
    class FlaskAppWrapper(object):
        app = None
    
        def __init__(self, name):
            self.app = Flask(name)
    
        def run(self):
            self.app.run()
    
        def add_endpoint(self, endpoint=None, endpoint_name=None, handler=None):
            self.app.add_url_rule(endpoint, endpoint_name, EndpointAction(handler))
    
    
    def action():
        # Execute anything
    
    a = FlaskAppWrapper('wrap')
    a.add_endpoint(endpoint='/ad', endpoint_name='ad', handler=action)
    a.run()
    

    Some things to note here:

    • EndpointAction is supposed to be a wrapper that will execute your function and generate an empty 200 response. If you want you can edit the functionality
    • The endpoint handler can be anything that has a __call__ method defined
    • The endpoint name should be unique as it represents a view name
    • Adding endpoints after the application is not possible as the thread will block once the application starts. You can enable it by running the application on a separate thread but changing the URL map on the fly is not advised, neither thread safe

提交回复
热议问题