快速创建Flask Restful API项目前言Python必学的两大web框架之一Flask,俗称微框架。它只需要一个文件,几行代码就可以完成一个简单的http请求服务。 但是我们需要用flask来提供中型甚至大型web restful api服务的时候就需要我们来规划项目结构。 Django 框架有自身的生成项目结构的命令和生成app的命令,但是Flask没有。 这篇文章主要介绍使用工具帮助我们进行一些Flask rest api项目初始化的工作 cookiecutter-flask-restful 介绍cookiecutter-flask-restful是一个基于cookiecutter的Flask rest api项目生成器,你可以用它快速生成Flask restful api项目。 目前支持的python版本:3.6 | 3.7 | 3.8 项目特性
项目名字暂且叫myproject, app名字暂且叫myapi。 运行项目如果项目使用了pipenv管理虚拟环境: 安装依赖:$ cd myproject$ pipenv install -r requirements.txt# 进入到虚拟环境$ pipenv shell$ pip install -e .$ myapi db upgrade$ myapi init$ myapi --help 启动项目:$ pipenv run flask run 测试项目:登录请求: $ curl -X POST -H "Content-Type: application/json" -d '{"username": "admin", "password": "admin"}' http://localhost:5000/auth/login 登录返回: { "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1ODYyMjUyNzIsIm5iZiI6MTU4NjIyNTI3MiwianRpIjoiZDM3NmViODktYWFkOC00ODZkLWE1NmUtZDdiNmQ3NjNhYmI2IiwiZXhwIjoxNTg2MjI2MTcyLCJpZGVudGl0eSI6MSwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.-xCHCJHS3lKeiar-Z12HSOwd2DxAb9EeKFg9zMKWHfU", "refresh_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1ODYyMjUyNzIsIm5iZiI6MTU4NjIyNTI3MiwianRpIjoiMTcyNmI0ODEtMDJjYi00NWFhLTgyOWUtOGY0ODJlYmFlZTEyIiwiZXhwIjoxNTg4ODE3MjcyLCJpZGVudGl0eSI6MSwidHlwZSI6InJlZnJlc2gifQ.fpFH_vw8Lp-_xjDVoFLjF6HnjOKXR7PCLKIp8v9gSSU"} 获取所有用户请求: curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1ODYyMjUyNzIsIm5iZiI6MTU4NjIyNTI3MiwianRpIjoiZDM3NmViODktYWFkOC00ODZkLWE1NmUtZDdiNmQ3NjNhYmI2IiwiZXhwIjoxNTg2MjI2MTcyLCJpZGVudGl0eSI6MSwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.-xCHCJHS3lKeiar-Z12HSOwd2DxAb9EeKFg9zMKWHfU" http://127.0.0.1:5000/api/v1/users 获取所有用户返回: { "total": 3, "pages": 1, "next": "/api/v1/users?page=1&per_page=50", "prev": "/api/v1/users?page=1&per_page=50", "results": [ { "active": true, "id": 1, "email": "admin@mail.com", "username": "admin" }, { "active": true, "id": 2, "email": "", "username": "" }, { "active": true, "id": 3, "email": "string", "username": "string" } ]} 刷新token请求: curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNTEwMDAwNDQxLCJ0eXBlIjoicmVmcmVzaCIsImp0aSI6IjRmMjgxOTQxLTlmMWYtNGNiNi05YmI1LWI1ZjZhMjRjMmU0ZSIsIm5iZiI6MTUxMDAwMDQ0MSwiZXhwIjoxNTEyNTkyNDQxfQ.SJPsFPgWpZqZpHTc4L5lG_4aEKXVVpLLSW1LO7g4iU0" http://127.0.0.1:5000/auth/refresh 刷新token返回: { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlIjoiYWNjZXNzIiwiaWRlbnRpdHkiOjEsImlhdCI6MTUxMDAwMDYxOCwiZnJlc2giOmZhbHNlLCJqdGkiOiIzODcxMzg4Ni0zNGJjLTRhOWQtYmFlYS04MmZiNmQwZjEyNjAiLCJuYmYiOjE1MTAwMDA2MTgsImV4cCI6MTUxMDAwMTUxOH0.cHuNf-GxVFJnUZ_k9ycoMMb-zvZ10Y4qbrW8WkXdlpw"} 如果没有使用pipenv管理虚拟环境,直接使用的系统python环境: $ cd myproject$ pip install -r requirements.txt$ pip install -e .# 初始化项目$ myapi db upgrade$ myapi init$ myapi --help 测试项目同上 项目环境变量配置环境变量在.flaskenv文件中 FLASK_ENV=developmentFLASK_APP="myapp.app:create_app"SECRET_KEY=changemeDATABASE_URI="sqlite:////tmp/myapp.db"CELERY_BROKER_URL=amqp://guest:guest@localhost/ # only present when celery is enabledCELERY_RESULT_BACKEND_URL=amqp://guest:guest@localhost/ # only present when celery is enabled 请根据你的实际情况进行配置。 测试直接用tox$ tox 使用pytest$ pip install pytest pytest-runner pytest-flask pytest-factoryboy factory_boy$ pytest 使用docker-compose 和 Makefilemake tests 如果出现连接失败,你需要更改redis | rabbitmq地址 使用wsgi服务启动gunicorn示例:$ pip install gunicorn$ gunicorn myapi.wsgi:app uwsgi示例:$ pip install uwsgi$ uwsgi --http 127.0.0.1:5000 --module myapi.wsgi:app 使用celery启动celery $ celery worker -A myapi.celery_app:app --loglevel=info 如果你的配置没有问题,在终端你会看到: [tasks] . myapi.tasks.example.dummy_task 调用task: >>> from myapi.tasks.example import dummy_task>>> result = dummy_task.delay()>>> result.get()'OK' 使用celery extension: >>> from myapi.extensions import celery>>> celery.send_task('myapi.tasks.example.dummy_task').get()'OK' 使用Docker注意:目前Docker的配置只有开发环境 构建镜像: $ docker build -t myapp . 启动镜像: $ docker run --env-file=.flaskenv myapp myapi init$ docker run --env-file=.flaskenv -p 5000:5000 myapp myapi run -h 0.0.0.0 * Serving Flask app "myapi.app:create_app" (lazy loading) * Environment: development * Debug mode: on * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 214-619-010 使用docker-compose启动: $ docker-compose up -d$ docker ps$ docker exec -it <container_id> myapi init 使用docker-compose 和 Makefile启动 make initMakefile 命令make init # 初始化环境make build # 构建镜像make run # 启动镜像make db-migrate # 迁移数据make db-upgrade # 数据映射到数据库make test # 执行测试 使用Swagger打开UI页面地址:http://localhost:5000/swagger-ui 页面如下: 在config.py文件进行配置:
|
|