在大型应用程序中使用 Flask Restful 作为蓝图

Cra*_*igH 4 flask flask-restful

我正在尝试使用 Flask Restful 作为适用于其他蓝图的模式中的蓝图。我不断收到以下错误消息

\n\n

我收到以下错误消息

\n\n
\n

AttributeError:\'Blueprint\'对象没有属性\'add_resource\'

\n
\n\n

我的项目设置如下:

\n\n

文件夹结构

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 api\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 routes.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 forms.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 views.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 templates\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 home.html\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 config.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 manage.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 requirements.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

__init__.py

\n\n
from flask import Flask\nfrom flask_restful import Api\nfrom flask_bootstrap import Bootstrap\nfrom config import config\nbootstrap = Bootstrap()\napi = Api()\n\ndef create_app(config_name):\n    app = Flask(__name__)\n    app.config.from_object(config[config_name])\n    config[config_name].init_app(app)\n\n    bootstrap.init_app(app)\n    api.init_app(app)\n\n    from .main import main as main_blueprint\n    from .api import api as api_blueprint\n    app.register_blueprint(main_blueprint)\n    app.register_blueprint(api_blueprint)\n    return app\n
Run Code Online (Sandbox Code Playgroud)\n\n

api/__init__.py

\n\n
from flask import Blueprint\n\napi = Blueprint(\'api\', __name__)\n\nfrom . import routes\n
Run Code Online (Sandbox Code Playgroud)\n\n

api/routes.py

\n\n
from flask_restful import Resource\nfrom . import api\n\nclass TodoItem(Resource):\n    def get(self, id):\n        return {\'task\': \'Say "Hello, World!"\'}\n\napi.add_resource(TodoItem, \'/todos/<int:id>\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

我究竟做错了什么??

\n

Joe*_*icz 6

如果您按照https://flask-restful.readthedocs.io/en/0.3.5/intermediate-usage.html中的说明进行操作

这里的关键点是创建一个 Flask Blueprint 实例并将其传递给 Flask-restfuls 的 Api 类的新实例。

最后,确保在 create_app 函数中注册flask-restful api 蓝图:app.register_blueprint(api_bp)

from flask import Flask, Blueprint
from flask_restful import Api
from flask_bootstrap import Bootstrap
from config import config

bootstrap = Bootstrap()
api_bp = Blueprint('api', __name__)
api = Api(api_bp)

def create_app(config_name):
   app = Flask(__name__)
   app.config.from_object(config[config_name])
   config[config_name].init_app(app)

   bootstrap.init_app(app)

   from .users import main as users_blueprint
   from .blogs import main as blogs_blueprint

   # blueprints for blogs & users
   app.register_blueprint(users_blueprint)
   app.register_blueprint(blogs_blueprint)
   app.register_blueprint(api_bp)
   
   return app
Run Code Online (Sandbox Code Playgroud)

另请注意,您不再需要注册api.init_app(app)