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/')
api.add_resource(UserList, '/users')
api.add_resource(Item, '/item/')
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()

可以完美替代额外的脚本,简化了流程。

你可能感兴趣的:(Flask RESTful API开发 更好的项目结构)