Flask Restful добавить параметры ресурса

Я хочу передать экземпляр объекта в качестве параметра в ресурс 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)?


person Gunther    schedule 02.08.2014    source источник
comment
Вы можете переопределить инициализацию ApiPage.   -  person Pankaj Sharma    schedule 03.08.2014
comment
Я не верю, что переопределение ApiPage сработает, поскольку add_resource принимает ссылку на класс, а не экземпляр класса.   -  person Gunther    schedule 03.08.2014


Ответы (4)


Начиная с версии 0.3.3 (выпущенной 22 мая 2015 г.) 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})
person el.atomo    schedule 16.11.2015

В версии 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 и используйте его в методе инициализации ресурса

и в вашем классе init

class ApiPage(Resource):
    def __init__(self, **kwargs):
       self.my_bar= kwargs['my_bar']
person ron    schedule 22.09.2018
comment
ты спас меня, зеленая рука 4 питона. - person Frank Wang; 27.02.2019

После борьбы с той же проблемой я обнаружил, что вы можете использовать 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)
person Leon    schedule 23.10.2014

Учитывая документацию, такую ​​вещь на этом уровне нельзя. Один из способов обойти эту проблему — поместить инициализацию Bar в другой модуль, а затем получить экземпляр через импорт в вашем модуле представлений.

person Ketouem    schedule 02.08.2014