Flask Restful 添加资源参数

19 投票
4 回答
40658 浏览
提问于 2025-04-18 15:45

我想把一个对象实例作为参数传递给一个 Flask-RESTfull 的资源。

这是我的设置:

# in main.py
from flask import Flask
from flask.ext.restful import Api
from bar import Bar
from foo import views

app = Flask(__name__)
api = Api(app)

my_bar = Bar()

api.add_resource(views.ApiPage, "/api/my/end/point/")

然后在 views.py 文件中,我把资源设置成这样:

# In views.py
from flask.ext.restful import Resource

class ApiPage(Resource):
    def get(self):
        serialized = str(my_bar)
        return serialized

我遇到的问题是,我需要把我的 Bar() 实例传递给这个 API 资源。有没有办法通过 add_resource 方法把它传进去,比如像这样 api.add_resource(views.ApiPage, "/api/my/end/point/", instance=bar)

4 个回答

0

根据文档,在这个层面上是无法做到这样的事情的。解决这个问题的一种方法是把Bar的初始化放在另一个模块里,然后在你的视图模块中通过导入来获取这个实例。

3

在遇到同样的问题后,我发现可以使用 add_url_ruleas_view 这两个方法来解决。

所以在你的情况下,我想代码可能会像这样:

class ApiPage(Resource):
    def __init__(self, bar=None)
        self.__my_bar=bar

    def get(self):
        serialized = str(self.__my_bar)
        return serialized

my_bar = Bar()

app = Flask(__name__)
app.add_url_rule('/api/my/end/point/', bar=my_bar)

api = Api(app)
7

在0.3.5版本的文档中,你可以这样做:

# in main.py
...
my_bar = Bar()
api.add_resource(views.ApiPage, '/api/my/end/point/',
             resource_class_kwargs={'my_bar': my_bar})

把你的对象放进add_resource方法里,然后在资源的初始化方法中使用它。

在你的类的初始化方法中也是如此:

class ApiPage(Resource):
    def __init__(self, **kwargs):
       self.my_bar= kwargs['my_bar']
49

从0.3.3版本开始(发布于2015年5月22日),add_resource()可以把参数传递给你的Resource构造函数。

接下来是原始示例中的views.py文件:

from flask.ext.restful import Resource

class ApiPage(Resource):
    def __init__(self, bar):
        self.bar = bar

    def get(self):
        serialized = str(my_bar)
        return serialized

还有main.py中的相关代码:

# ...
my_bar = Bar()
api.add_resource(views.ApiPage, '/api/my/end/point/',
                 resource_class_kwargs={'bar': my_bar})

撰写回答