前言

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. 复制图片链接和标题生成Markdown文本

    写Markdown的时候常常会需要复制图片链接和标题以插入图片,不借助其他工具的话,一般需要先在Markdown文件中输入插入图片的格式,然后在浏览器中复制图片链接和标题将其依次粘贴到Markdown ...

  2. python的基本数据类型简介

    python的基本数据类型有:数字-numbers.字符串-str.列表-list.元组-tuple.字典-dict.布尔-bool.集合-set 下面来个概览先大概了解一下,后面博文中咱再细说- 1 ...

  3. 误用git reset -hard 的检讨书

    误用git reset -hard 的检讨书 消失的代码们: 我知道你们可能看不到了,但是我还是需要自我反省自己,因为自己的误操作,导致了你们的消失. 事情的始末 夜阑人静,周围除了少年敲击键盘的声音 ...

  4. 【SpringBoot基础系列-实战】如何指定 bean 最先加载(应用篇)

    [基础系列-实战]如何指定 bean 最先加载(应用篇) 在日常的业务开发中,绝大多数我们都是不关注 bean 的加载顺序,然而如果在某些场景下,当我们希望某个 bean 优于其他的 bean 被实例 ...

  5. 利用java编写物品的品牌、尺寸、价格、库存(新手)

    //定义一个类 public class NV{ //公共静态的主方法 public static void main(String[] args){ //打印 “京东三九女神节” 标题 System ...

  6. Mybatis---在控制台打印sql语句

    在mybatis主配置文件中mybatis.xml的<configuration>标签中加入 <settings> <setting name="logImpl ...

  7. 面向对象第四单元(UML)及期末总结

    前言 统一建模语言(英语:Unified Modeling Language,缩写 UML),是软件架构设计建模和规约的语言. 在UML系统开发中有三个主要的模型: 功能模型:从用户的角度展示系统的功 ...

  8. vmware导入ova文件踩坑记

    问题来源 众所周知,所有的网络行为都会产生相应的网络流量,那么所有的网络攻击行为也有其对应的流量特点,那么是否能根据流量特点进而分析出其对应的是什么攻击行为呢? 我在虚拟机上使用vulnhub的靶场环 ...

  9. Natas34 Writeup(闯关结束!)

    Natas34: 登录什么都不用做,闯关结束!撒花~~~

  10. C# 微信 生活助手 空气质量 天气预报等 效果展示 数据抓取 (二)

    此文主要是 中国天气网和中国环境监测总站的数据抓取 打算开放全部数据抓取源代码 已在服务器上 稳定运行半个月 webapi http://api.xuzhiheng.cn/ 常量 /// <su ...