快速创建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
项目特性
- Flask应用工厂函数,使用蓝图
- 集成Flask命令行接口
- 数据迁移
- JWT登录认证
- 分页工具类
- 单元测试
- 使用环境变量配置
- 集成swagger UI
主要使用的包
- Flask
- Flask-RESTful
- Flask-Migrate
- Flask-SQLAlchemy
- Flask-Marshmallow
- Flask-JWT-Extended
- marshmallow-sqlalchemy
- passlib
- tox
- pytest
- factoryboy
- dotenv
- apispec
快速开始
安装cookiecutter
$ pip3 install cookiecutter
创建第一个项目
$ cookiecutter https://github.com/karec/cookiecutter-flask-restful
一路按回车键,就会生成一个新项目。
项目名字暂且叫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=development
FLASK_APP="myapp.app:create_app"
SECRET_KEY=changeme
DATABASE_URI="sqlite:////tmp/myapp.db"
CELERY_BROKER_URL=amqp://guest:guest@localhost/ # only present when celery is enabled
CELERY_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 和 Makefile
make 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 init
Makefile 命令
make init # 初始化环境
make build # 构建镜像
make run # 启动镜像
make db-migrate # 迁移数据
make db-upgrade # 数据映射到数据库
make test # 执行测试
使用Swagger
打开UI页面地址:http://localhost:5000/swagger-ui
页面如下:

在config.py文件进行配置:
- APISPEC_TITLE: 页面标题,默认: {{cookiecutter.project_name}}
- APISPEC_VERSION: api版本,默认: 1.0.0
- OPENAPI_VERSION: OpenAPI 版本,默认: 3.0.2
- SWAGGER_JSON_URL: JSON规范校验地址, 默认: /swagger.json
- SWAGGER_UI_URL: 页面UI地址,默认: /swagger-ui
- SWAGGER_URL_PREFIX: 蓝图URL前缀, 默认: None
Enjoy your code, good luck.
快速创建Flask Restful API项目的更多相关文章
- JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识
JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...
- 快速创建yii2 RESTful api的小记
1.复制backend的应用到同级目录,改名叫api 2.然后就是配置项修改,common和api目录下的 common下: bootstrap.php最后添加一行配置 api/config/main ...
- 如何用rflask快速初始化Flask Restful项目
如何用rflask快速初始化Flask Restful项目 说明 多啰嗦两句 我们在创建flask项目的时候,使用pycharm创建出来的项目比较简陋,而且随着项目的功能完善,项目目录结构会比较多,多 ...
- 通过beego快速创建一个Restful风格API项目及API文档自动化
通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...
- 通过beego快速创建一个Restful风格API项目及API文档自动化(转)
通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...
- 使用 Beego 搭建 Restful API 项目
1 环境准备 首先你需要在你的环境安装以下软件: go:编程语言运行环境 git:版本控制工具 beego:go 语言流行的开发框架 bee:beego 配套的快速搭建工具 你喜欢的数据库:这里以 M ...
- 使用swagger 生成 Flask RESTful API
使用swagger 生成 Flask RESTful API http://www.voidcn.com/article/p-rcvzjvpf-e.html swagger官网 https://swa ...
- 从0使用Ruby on Rails打造企业级RESTful API项目实战之我的云音乐
本节对我们项目实现的功能和知识点做一个简单的介绍,因为是RESTful API项目,所以对于后端来说基本上没有什么UI界面可展示,那我们就在关键的点,使用客户端(Android)实现的效果图. 课程简 ...
- .NET Core项目部署到Linux(Centos7)(三)创建.NET Core API项目
目录 1.前言 2.环境和软件的准备 3.创建.NET Core API项目 4.VMware Workstation虚拟机及Centos 7安装 5.Centos 7安装.NET Core环境 6. ...
随机推荐
- Vue进阶课堂之《从HTML到Pug》
是啥 Pug听起来或许比较陌生,但是如果说起她的前生,相信各位多少会有耳闻:Jade.每当你不停的敲打<><><><></></> ...
- display的block、none、inline属性及解释
常会用到display对应值有block.none.inline这三个值 参数: block :块对象的默认值.用该值为对象之后添加新行.之前也添加一行. none :隐藏对象.与visibility ...
- 前端小微团队的Gitlab实践
疫情期间我感觉整个人懒散了不少,慢慢有意识要振作起来了,恢复到正常的节奏.最近团队代码库从Gerrit迁移到了Gitlab,为了让前端团队日常开发工作有条不紊,高效运转,开发历史可追溯,我也查阅和学习 ...
- 前端劝退预警:JavaScript 工具链不完全指南
经过这么多年的发展,JavaScript 早已经不是当年那个不太起眼的脚本语言.如今的 JavaScript 可以说是风光无限,在 Web 前端.移动端.服务端甚至物联网设备上都大展身手,到处都有它的 ...
- seo搜索优化教程05-SEO常用专业术语
SEO常用的专业术语很多,星辉信息科技专门抽空进行了整理,主要如下:. SEO 根据搜索引擎规则来进行搜索引擎优化,进而使得在搜索结果中获得较好的排名 关键词 关键词也叫keywords,表示在搜索引 ...
- python使用for循环打印9*9乘法表。
代码如下: for a in range(1, 10): for b in range(1, 10): if b <= a: print("%d*%d=%d\t" % (b, ...
- 聊一聊React中虚拟DOM
1. 什么是虚拟 DOM 在 React 中实际上是 render 函数中return 的内容会生成 DOM,return 中的内容由两部分组成,一部分是 JSX ,另一部分就是 state 中的数据 ...
- 今天开dev的时候,config update一下别人的,但是忘了自己改过目录了,导致光看ip,想了半天,为什么接口不对
今天开dev的时候,config update一下别人的,但是忘了自己改过目录了,导致光看ip,想了半天,为什么接口不对 baseUrl: { // // dev: 'http://1 ...
- vscode style内置auto会导致eslint格式化 对不齐报错
"files.associations": { "*.vue": "vue", // "*.js": "jav ...
- 【Weiss】【第04章】AVL树例程
普通的二叉搜索树可能会由于数据不平均.删除产生高度差等原因,使树倾向于不平衡生长,导致操作慢于O(NlogN). 为应对此现象,将搜索.删除.插入的最坏时间也控制在O(NlogN)上,产生了平衡二叉树 ...