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 flask web server is perfectly fine.
My current code looks like this:
class API: # ... all other stuff here, skipped def run(): app = flask.Flask('API') @app.route('/cmd1') def cmd1(): self.cmd1() @app.route('/cmd2') def cmd2() self.cmd2() app.run()
I feel I done it wrong, because all docs says 'create flask app at module level'. But I don't want to do this - it mess up with my tests, and API is small part of the larger application, which has own structure and agreements (each 'application' is separate class running in one or more threads).
How can I use Flask inside class?
It's used with low load and never exposed to the Internet, so build-in flask web server is perfectly fine.
Internally Flask maintains a mapping of URLs and view functions to execute. This mapping is created using the route decorator or add_url_rule() method of the Flask instance. We can access this mapping using the url_map attribute of the Flask instance.
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__call__
method definedIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With