19

我希望将对象实例作为参数传递到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

4 回答 4

43

自 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})
于 2015-11-16T17:09:32.777 回答
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']
于 2018-09-22T17:39:33.213 回答
3

在遇到同样的问题后,我发现你可以使用add_url_rule加上as_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)
于 2014-10-23T10:56:47.343 回答
1

鉴于文档,这样的事情不能在这个级别上完成。规避此问题的一种方法是将初始化Bar放在另一个模块中,然后通过视图模块中的导入来获取实例。

于 2014-08-02T20:11:03.500 回答