Flask RESTful API开发 更好的项目结构
Flask是一个轻便的Web开发库,
但随着API开发但进行,越来越多的部分被加入到项目中,
为了结构的简明和日后的可维护性,
更好地组织项目结构势在必行。
RESTful API项目目录结构参考
本文仍然聚焦在REST API设计,
因此templating等部分不会涉及。
|--<项目名称>
|--app/
|--models/
|--resources/
|--tests/
|--venv/
|--requirements.txt
|--config.py
|--run.py
最核心的两个目录:
app/
下存放应用程序代码,
分为模型和资源两个部分。
具体可以参考资源类和模型类。
tests/
下存放单元测试代码。
开发环境的设置:
一个较好的Python开发习惯是为每个项目建立单独的虚拟环境,
这样就可以隔离它们之间的Python运行环境。
在项目目录下使用virtulenv
:
virtualenv --no-site-packages venv
将会自动创建venv
目录,
参数--no-site-packages
强制不将已经安装到Python系统内的任何第三方包复制过来,
使得新的venv
完全纯净。
同时,应该将所有的依赖包归纳入requirements.txt
,
使得任何使用者可以快速地在任何机器上部署相同的开发环境:
$ pip install -r requirements.txt
run.py
run.py
用于配置并启动开发服务器。
应该实现的的功能有:
- 创建应用(
app
) - 实例化
flask_restful.Api
- 绑定资源与URI
- 连接数据库
# run.py
from flask import Flask
from flask_restful import Api
# 导入各资源类
from resources.user import User, UserList
from resources.item import Item, ItemList
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
api = Api(app)
@app.before_first_request
def create_tables():
db.create_all()
api.add_resource(User, '/user/<string:name>')
api.add_resource(UserList, '/users')
api.add_resource(Item, '/item/<string:name>')
api.add_resource(ItemList, '/items')
if __name__ == '__main__':
from db import db
db.init_app(app)
app.run(port=5000, debug=True)
绑定资源与URI
在使用Flask-RESTful
辅助开发时,
由于不再直接绑定URI和视图函数,
而是单独定义各个资源类,再绑定资源类与URI,
因此在run.py
中集中进行绑定是一个较好的实践。
连接数据库
在模型类中我们使用ORM技术将模型与数据库中的表一一对应,
但ORM并不会自动为我们创建数据库,
如果试图连接并不存在的数据库显然会产生ERROR。
为了创建初始数据库以供链接,
可以使用:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
db.create_all()
将其放入单独的脚本,在API应用启动前运行创建数据库即可。
但还有一个更好的方法:
app.before_first_request
装饰器允许我们定义一个函数,
并且这个函数将在第一个请求到来之前运行。
因此
@app.before_first_request
def create_tables():
db.create_all()
可以完美替代额外的脚本,简化了流程。