本指南将逐步介绍构建用于测试、开发和生产环境的 Flask RESTPlus Web 应用程序的方法。 将使用基于 Linux 的操作系统(Ubuntu),但是大多数步骤都可以在 Windows 和 Mac 上执行。
在继续阅读本指南之前,你应该对 Python 编程语言和 Flask 框架有基本的了解。如果你不熟悉这些内容,建议阅读介绍性文章 - 如何使用 Python 和 Flask 构建 Web 应用程序。
本指南的结构
本指南分为以下几部分:
功能
项目将涉及以下功能和扩展。
- Flask-Bcrypt: 一个 Flask 扩展,提供了 bcrypt 散列功能。
- Flask-Migrate: 一个使用 Alembic 为 Flask 应用处理 SQLAlchemy 数据库迁移的扩展,可以通过 Flask 的命令行接口或者 Flask-Scripts 对数据库进行操作。
- Flask-SQLAlchemy: 一个 Flask 扩展,给应用添加了 SQLAlchemy 支持。
- PyJWT: 可以编码解码 JSON Web Tokens (JWT) 的 Python 库。JWT 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准((RFC 7519)。
- Flask-Script: 一个提供了向 Flask 插入外部脚本的功能的扩展,它可以运行除 web 应用之外的命令行任务。
- Namespaces (Blueprints)
- Flask-restplus
- UnitTest
Flask-RESTPlus 是什么?
Flask-RESTPlus 是 Flask 的扩展,可以通过它快速构建 REST API。Flask-RESTPlus 最佳实践鼓励配置尽可能少。它提供了大量的装饰器和工具来描述 API,并以文档化的形式将这些接口展现出来(通过 Swagger 来实现)。
安装和配置
在 Terminal 中输入命令 pip --version
来检查是否已安装 pip,然后回车。
pip --version
如果终端输出版本号,表示已安装 pip,可以继续执行下一步,否则请先安装 pip,如果使用 Linux 包管理器,可以在终端上运行以下命令,回车。选择 Python 2.x 或 3.x 版本。
- Python 2.x
sudo apt-get install python-pip
- Python 3.x
sudo apt-get install python3-pip
设置 virtual 环境或 virtual 环境 wrapper(只需要其中之一,取决于上面安装的版本):
sudo pip install virtualenv
sudo pip3 install virtualenvwrapper
请按照此链接进行 virtual 环境 wrapper 的完整设置。
通过在终端上执行以下命令来创建新环境并激活它:
mkproject name_of_your_project
项目配置和结构
这里使用功能性结构通过文件的功能来组织项目文件。在功能结构里,模板、静态文件、视图在三个不同的目录中。
在项目目录中,创建一个名为 app
的新包。在 app
内部,创建两个包 main
和 test
。 目录结构如下。
.
├── app
│ ├── __init__.py
│ ├── main
│ │ └── __init__.py
│ └── test
│ └── __init__.py
└── requirements.txt
接下来使用功能结构来模块化应用程序。
在 main
包中,再创建三个包,即:controller
,service
和 model
。 model
包将包含所有的数据库模型,而 service
包将包含应用程序的所有业务逻辑,最后 controller
包将包含所有的应用程序接口。 现在,树结构应如下所示:
.
├── app
│ ├── __init__.py
│ ├── main
│ │ ├── controller
│ │ │ └── __init__.py
│ │ ├── __init__.py
│ │ ├── model
│ │ │ └── __init__.py
│ │ └── service
│ │ └── __init__.py
│ └── test
│ └── __init__.py
└── requirements.txt
现在,来安装所需的软件包。 确保已激活创建的 virtual 环境,并在终端上运行以下命令:
pip install flask-bcrypt
pip install flask-restplus
pip install Flask-Migrate
pip install pyjwt
pip install Flask-Script
pip install flask_testing
通过运行以下命令来创建/更新 requirements.txt
文件:
pip freeze > requirements.txt
生成的 requirements.txt
文件应该如下:
alembic==0.9.8
aniso8601==3.0.0
bcrypt==3.1.4
cffi==1.11.5
click==6.7
Flask==0.12.2
Flask-Bcrypt==0.7.1
Flask-Migrate==2.1.1
flask-restplus==0.10.1
Flask-Script==2.0.6
Flask-SQLAlchemy==2.3.2
Flask-Testing==0.7.1
itsdangerous==0.24
Jinja2==2.10
jsonschema==2.6.0
Mako==1.0.7
MarkupSafe==1.0
pycparser==2.18
PyJWT==1.6.0
python-dateutil==2.7.0
python-editor==1.0.3
pytz==2018.3
six==1.11.0
SQLAlchemy==1.2.5
Werkzeug==0.14.1
配置设定
在 main
包中创建一个名为 config.py
的文件,内容如下:
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config:
SECRET_KEY = os.getenv('SECRET_KEY', 'my_precious_secret_key')
DEBUG = False
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'flask_boilerplate_main.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
class TestingConfig(Config):
DEBUG = True
TESTING = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'flask_boilerplate_test.db')
PRESERVE_CONTEXT_ON_EXCEPTION = False
SQLALCHEMY_TRACK_MODIFICATIONS = False
class ProductionConfig(Config):
DEBUG = False
config_by_name = dict(
dev=DevelopmentConfig,
test=TestingConfig,
prod=ProductionConfig
)
key = Config.SECRET_KEY
配置文件包含三个环境设置 class,其中包括 testing
、development
和 production
。
这里将使用应用程序工厂模式创建 Flask 对象。在对不同的配置创建多个实例时这个模式很方便。