Getting Started

Chapter 3


In this chapter, we'll set up the base project structure.


Create a new project and install Flask along with Flask-RESTful:

$ mkdir flask-tdd-docker && cd flask-tdd-docker
$ mkdir project
$ python3.7 -m venv env
$ source env/bin/activate
(env)$ pip install flask==1.1.1
(env)$ pip install Flask-RESTful==0.3.7

Feel free to swap out virtualenv and Pip for Pipenv if that's your tool of choice.

Add an __init__.py file to the "project" directory and configure the first endpoint:

# project/__init__.py


from flask import Flask, jsonify
from flask_restful import Resource, Api


# instantiate the app
app = Flask(__name__)

api = Api(app)


class Ping(Resource):
    def get(self):
        return {
            'status': 'success',
            'message': 'pong!'
        }


api.add_resource(Ping, '/ping')

New to Flask-RESTful? Review the Quickstart guide.

Next, let's configure the Flask CLI tool to run and manage the app from the command line.

First, add a manage.py file to the project root ("flask-tdd-docker"):

# manage.py


from flask.cli import FlaskGroup

from project import app


cli = FlaskGroup(app)


if __name__ == '__main__':
    cli()

Here, we created a new FlaskGroup instance to extend the normal CLI with commands related to the Flask app.

Run the server:

(env)$ export FLASK_APP=project/__init__.py
(env)$ python manage.py run

Navigate to http://localhost:5000/ping in your browser. You should see:

{
  "message": "pong!",
  "status": "success"
}

Kill the server. Then, add a new file called config.py to the "project" directory, where we'll define environment-specific configuration variables:

# project/config.py


class BaseConfig:
    """Base configuration"""
    TESTING = False


class DevelopmentConfig(BaseConfig):
    """Development configuration"""
    pass


class TestingConfig(BaseConfig):
    """Testing configuration"""
    TESTING = True


class ProductionConfig(BaseConfig):
    """Production configuration"""
    pass

Update __init__.py to pull in the development config on init:

# project/__init__.py


from flask import Flask, jsonify
from flask_restful import Resource, Api


# instantiate the app
app = Flask(__name__)

api = Api(app)

# set config
app.config.from_object('project.config.DevelopmentConfig')  # new


class Users(Resource):
    def get(self):
        return {
        'status': 'success',
        'message': 'pong!'
    }


api.add_resource(Users, '/ping')

Run the app again. This time, let's enable debug mode by setting the FLASK_ENV environment variable to development:

(env)$ export FLASK_APP=project/__init__.py
(env)$ export FLASK_ENV=development
(env)$ python manage.py run

* Serving Flask app "project/__init__.py" (lazy loading)
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 442-775-962

Now when you make changes to the code, the app will automatically reload. You also have access to the interactive debugger. Once done, kill the server and deactivate from the virtual environment. Then, add a requirements.txt file to the project root:

Flask==1.1.1
Flask-RESTful==0.3.7

Finally, add a .gitignore to the project root as well:

__pycache__
env

Init a git repo and commit your code.




Mark as Completed