前言

Python必学的两大web框架之一Flask,俗称微框架。它只需要一个文件,几行代码就可以完成一个简单的http请求服务。

但是我们需要用flask来提供中型甚至大型web restful api服务的时候就需要我们来规划项目结构。

Django 框架有自身的生成项目结构的命令和生成app的命令,但是Flask没有。

这篇文章主要介绍使用工具帮助我们进行一些Flask rest api项目初始化的工作

cookiecutter-flask-restful 介绍

cookiecutter-flask-restful是一个基于cookiecutterFlask 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-composeMakefile

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-composeMakefile启动

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项目的更多相关文章

  1. JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识

    JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...

  2. 快速创建yii2 RESTful api的小记

    1.复制backend的应用到同级目录,改名叫api 2.然后就是配置项修改,common和api目录下的 common下: bootstrap.php最后添加一行配置 api/config/main ...

  3. 如何用rflask快速初始化Flask Restful项目

    如何用rflask快速初始化Flask Restful项目 说明 多啰嗦两句 我们在创建flask项目的时候,使用pycharm创建出来的项目比较简陋,而且随着项目的功能完善,项目目录结构会比较多,多 ...

  4. 通过beego快速创建一个Restful风格API项目及API文档自动化

    通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...

  5. 通过beego快速创建一个Restful风格API项目及API文档自动化(转)

    通过beego快速创建一个Restful风格API项目及API文档自动化 本文演示如何快速(一分钟内,不写一行代码)的根据数据库及表创建一个Restful风格的API项目,及提供便于在线测试API的界 ...

  6. 使用 Beego 搭建 Restful API 项目

    1 环境准备 首先你需要在你的环境安装以下软件: go:编程语言运行环境 git:版本控制工具 beego:go 语言流行的开发框架 bee:beego 配套的快速搭建工具 你喜欢的数据库:这里以 M ...

  7. 使用swagger 生成 Flask RESTful API

    使用swagger 生成 Flask RESTful API http://www.voidcn.com/article/p-rcvzjvpf-e.html swagger官网 https://swa ...

  8. 从0使用Ruby on Rails打造企业级RESTful API项目实战之我的云音乐

    本节对我们项目实现的功能和知识点做一个简单的介绍,因为是RESTful API项目,所以对于后端来说基本上没有什么UI界面可展示,那我们就在关键的点,使用客户端(Android)实现的效果图. 课程简 ...

  9. .NET Core项目部署到Linux(Centos7)(三)创建.NET Core API项目

    目录 1.前言 2.环境和软件的准备 3.创建.NET Core API项目 4.VMware Workstation虚拟机及Centos 7安装 5.Centos 7安装.NET Core环境 6. ...

随机推荐

  1. ubuntu下载eclipse详细步骤

    1.官网下载 Eclipse IDE for Java EE Developers: https://www.eclipse.org/downloads/packages/ 2.安装eclipse将其 ...

  2. 本地目录配置多个远程Git仓库

    目录 情景一:不同的库分别 pull/push 1. 使用git命令配置 2. 修改.git/config 文件 3. 操作 情景二:不同的库一次push 1. 使用git命令配置 2. 修改.git ...

  3. 测试 - 某网站ACCESS数据库注入漏洞

    元宵节 团团圆圆总少不了一篇文  测试是否有注入 测试数据库类型 后面不用注释猜到可能是access 验证一下 这里说一下MySQL和ACCESS以及MSSQL的判断语句 MySQL:and len ...

  4. SQLi-Labs之1~6关 - 常规注入与盲注

    年初五 财神入 第一关 联合注入 1.准备 2.加'截断 3.order by 判断查询列数 4.同上 5.联合查询判断字段位置 6.查数据库名 7.1 查表名 7.2 查列名 8.查数据 第二关 不 ...

  5. 写一个scrapy中间件--ip代理池

    middleware文件 # -*- coding: utf-8 -*- # Define here the models for your spider middleware # See docum ...

  6. Flutter 日期时间DatePicker控件及国际化

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 DatePicker Flutter并没有DatePick ...

  7. element UI中的tab切换栏

    html代码:(用的是el-tab组件) <el-tabs v-model="activeIndex" type="border-card" @tab-c ...

  8. c js 字符串反转

    1.例如:输入 i am     a student    输出 student a am i #include <stdio.h> #include <string.h> v ...

  9. spring Boot登录验证之验证码 邮箱

    一 验证码 登录login.jsp <%@ page contentType="text/html;charset=UTF-8" language="java&qu ...

  10. 记 2020蓝桥杯校内预选赛(JAVA组) 赛后总结

    目录 引言 结果填空 1. 签到题 2. 概念题 3. 签到题 4. 签到题 程序题 5. 递增三元组[遍历] 6. 小明的hello[循环] 7. 数位递增[数位dp] 8. 小明家的草地[bfs] ...