【问题标题】:Flask Restful add resource parametersFlask Restful 添加资源参数
【发布时间】:2014-09-25 17:52:59
【问题描述】:

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

【问题讨论】:

  • 可以覆盖ApiPage的init。
  • 我不相信重写 ApiPage 会起作用,因为 add_resource 采用类引用,而不是类实例。

标签: python rest flask flask-restful


【解决方案1】:

自 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})

【讨论】:

    【解决方案2】:

    在版本 0.3.5 documentation 你可以这样做

    # 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']
    

    【讨论】:

    • 你救了我,一只新手4蟒。
    【解决方案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)
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-05
        • 2014-02-02
        • 1970-01-01
        • 2014-02-18
        • 2013-12-08
        • 2017-08-01
        • 2019-06-20
        • 2021-04-22
        相关资源
        最近更新 更多