Flask-RESTful 如何添加资源并传递非全局数据

Cos*_*gan 8 python flask

此处发布的Flask-RESTful示例应用程序中,集合是一个全局变量。TODOS

Todo 资源注册后:

api.add_resource(Todo, '/todos/<string:todo_id>')
Run Code Online (Sandbox Code Playgroud)

这些方法在处理 Web 请求时Todo访问全局变量。TODOS

相反,我想在类中实例化 API 并传递一个TODOS作为类变量而不是全局变量的集合。

使用Flask-RESTful时,允许Resource类中的方法在不使用全局变量的情况下访问调用类提供的变量的正确方法是什么?

Sye*_*man 5

add_resource接受两个参数resource_class_argsresource_class_kwargs,用于将参数传递给构造函数。(来源

所以你可以有一个资源:

from flask_restful import Resource

class TodoNext(Resource):
    def __init__(self, **kwargs):
        # smart_engine is a black box dependency
        self.smart_engine = kwargs['smart_engine']

    def get(self):
        return self.smart_engine.next_todo()
Run Code Online (Sandbox Code Playgroud)

您可以将所需的依赖项注入到 TodoNext 中,如下所示:

smart_engine = SmartEngine()

api.add_resource(TodoNext, '/next',
    resource_class_kwargs={ 'smart_engine': smart_engine })
Run Code Online (Sandbox Code Playgroud)


Gre*_*reg 4

看来我第一次没理解你的意思,你可以直接使用 aclassmethod来构建你的 API。然后将其添加为资源

from flask import Flask
from flask.ext.restful import Api

class SomeApi(Resource):
    def get(self):
        return self.response

    @classmethod
    def make_api(cls, response):
        cls.response = response
        return cls


class KillerApp(object):
    def __init__(self):
        self.app = Flask()
        app_api = Api(self.app)
        MyApi = SomeAPI.make_api({"key": "value"})
        app_api.add_resource(MyApi, "/api/path")

    def run(self)
        self.app.run()


KillerApp().run()
Run Code Online (Sandbox Code Playgroud)