在flask框架中应用蓝图,并构建RESTful API

在前面提到的程序目录结构中,增加特定程序模块,暂命名rc

这里在使用蓝图初始化flask_restful模块的过程中遇到了困难,stackoverflow上的这个答案给了启发,顺利完成了flask_restful服务的初始化。问答地址

答案提到:Flask-Restful,如同其他的Flask扩展,支持两种注册方式:

1)与app实例一起初始化(Api(current_app))

2)在app初始化之后,通过api.init_app(app)来实现初始化

起初我用的是第一种方式,代码如下manage.py:

...
from flask_restful import Resource, Api

app = create_app()
api = Api(app)

Class HelloWorld(Resource):
    def get(self):
        data = {}
        data['hello'] = "world"
        return data, 200
api.add_resource(HelloWorld, '/')

这种初始化方式将HelloWorld的实现放到蓝图之后,遇到了窘境:api初始化时无法读取app(因为此时仍在函数create_app()执行过程中,app对象还没初始化完成),故采用问答中第二种方法:

manage.py中上述相关代码全部删除,app/__init__.py

...

def create_app():
    app = Flask(__name__)
    ...
    from .rc import api
    db.init_app(app)
    api.init_app(app)

    from .rc import rc
    app.register_blueprint(rc)

    return app

在app下创建rc目录,app/rc/__init__.py

from flask import Blueprint
from flask_restful import Api
from .api import HelloWorld

rc = Blueprint('rc', __name__)
api = Api()  // 先在这里创建实例,然后在create_app()中初始化
api.add_resource(HelloWorld, '/hello')  // 这里可以先注册对象到url,没问题

api的实现文件,app/rc/api.py

#encoding=utf-8

from flask import request
from flask_restful import Resource
from app.models import User // 这里可以任意加载数据库对象的处理模块,供api使用

Class HelloWorld(Resource):    // 这里直接照搬上面的manage.py的实现类,api.add_resource方法已分离到__init__.py中
    def get(self):
        data = {}
        data['hello'] = "world"
        return data, 200

由此,实现了在蓝图中初始化restful的问题。





你可能感兴趣的:(在flask框架中应用蓝图,并构建RESTful API)