So here is a small modification of this example.
The task is to show a model from another application in Flask-Admin.
A way to do it is to overwrite
BaseModelView and get the data through HTTP request.
Here is a simple example for a sortable list with a pagination.
If there is a need to monitor several applications, there are two ways:
- run celery flower instance for each application
celery flower --app app1.celeryapp --port=5555 celery flower --app app2.celeryapp --port=5556
- run celery flower with broker option, there will be less options to control tasks
celery flower --broker=redis://redis/0
There is a good checklist to build great celery async tasks.
I want only to add how to autoreload celery worker in development mode.
Before there was an
--autoreload option, but now it’s removed. For this task I use watchdog.
pip install watchdog watchmedo auto-restart --recursive -d app -p '*.py' -i '*.pyc' -- celery worker --app app.celeryapp --queues my_query -n my_queue@%h --loglevel INFO
Another tip for Flask-Admin. The task’s requirements are:
- possibility to choose some model’s objects and download them in JSON
- possibility to upload them back
There is a ModelView property can_export, it adds an action to export in CSV or another format supported by tablib, but it does not allow to select records and there is no import. So for my task it’s not a solution.
The export is easy to do with an action decorathor.
The second line of “The Zen of Python” (try
import this) says “Explicit is better than implicit.”.
By default Flask response does not return any cache header and you can suppose that browsers will not cache, but some of them can decide for you. So it’s better to provide them, especially for API and it’s easy:
@app.after_request def set_response_headers(response): response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate' response.headers['Pragma'] = 'no-cache' response.headers['Expires'] = '0' return response