Setup Environment
- Step 1:
pipenv install --python 3.8
- Step 2:
pipenv shell
- Step 3:
pipenv install flask flask-sqlalchemy flask-marshmallow marshmallow-sqlalchemy flask-migrate psycopg2
flask-sqlalchemy is the sql-alchemy with flask bindings. flask-marshmallow is like the Serializer in Django Rest Framework, marshmallow-sqlalchemy is common binding between marshmallow and sqlalchemy (for things like ModelSerializer in Django Rest Framework).flask-migrate is migration tool for Flask based on ALEMBIC.psycopg2-binary is for connecting to postgres db.
Note: If psycopg2 install gives errors use psycopg2-binary. But this is a development only binary. It is not meant for production. For production, you need to compile psycopg2 from source.
See here for installing psycopg2 if you face issues: https://tekshinobi.com/install-psycopg2-on-ubuntu-18-04/
Now create the application file.. traditionally called app.py (or main.py…whatever your taste).
touch app.py
Stick in this boilerplate code in app.py.
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World' if __name__ == '__main__': app.run()
The project structure at this moment looks like this:
proj_dir/app.py
That’s right. Just my project directory with one file called app.py.
Pycharm Configuration
Click on “Add Configuration” button on top right. Under Templates, choose Python.
Select “Module name” instead of “Script path” and type flask.
Parameters: run
Environment Variables: PYTHONUNBUFFERED=1;FLASK_APP=app.py;FLASK_ENV=development
Python Interpreter: (your location of python interpreter in your virtual environment)
Working directory: (your location of python interpreter in your virtual environment)/bin
Note: Python Interpreter and Worrking directory are already filled if you already selected Python interpreter though Pycharm settings before configuring this Flask configuration.
Give your configuration a name. I often call it Flask.
Finally, it will look something like this (note: my pipenv created virtualenv is called tutorial)
For running in terminal
Now do these steps on the console (don’t do the third step yet as app.py is still empty):
- export FLASK_APP=app.py
- export FLASK_ENV=development
- flask run
The no. 2 in above list is important. It will hot reload the server upon code changes
Pycharm debugger bug and its workaround
As of writing this post, there has been a bug with Werkzeug and Flask latest versions in PyPi and the Pycharm debugger. The bug only affects when debugger is run in development mode (FLASK_ENV=development; FLASK_DEBUG=1). If you run in production mode, there is no error. But its kinda duh. I like to run my debugger in development mode.
The workaround is to downgrade Flask to 1.0.3 and werkzeug to 0.15.4 and Python<=3.7.
Note that werkzeug 0.15.4 has known incompatibility with Python 3.8.x. Python 3.7 and 3.6 are OK.
Intellij seems to be laissez-faire about this issue and its still open. It affects both Professional and Community editions. See here:
https://intellij-support.jetbrains.com/hc/en-us/community/posts/360004300599-Debugging-a-flask-app-fails
and the actual ticket here:
https://youtrack.jetbrains.com/issue/PY-36445#focus=streamItem-27-3602876.0-0
Dealing with legacy stuff
Finally, there are some legacy exports that you might come across in older code. Even stuff like app.run()
instead of ‘flask run
‘. This excellent stackoverflow post discusses that: https://stackoverflow.com/questions/17309889/how-to-debug-a-flask-app
As a bonus that link also deals with how to setup pdb (python command-line debugger). I often use this when debugging my tests in pytest.
No Comments
You can leave the first : )