Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using flask inside class

Tags:

python

flask

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?

like image 359
George Shuklin Avatar asked Nov 07 '16 08:11

George Shuklin


People also ask

Can we use classes in Flask?

It's used with low load and never exposed to the Internet, so build-in flask web server is perfectly fine.

How does a Flask work internally?

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.


1 Answers

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
like image 67
Kostas Pelelis Avatar answered Oct 04 '22 23:10

Kostas Pelelis