19

I am looking to pass an object instance as a parameter into a Flask-RESTfull Resource.

Here is my setup:

# 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/")

Then in views.py I have the resource set up as follows:

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

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

So the issue that I am having is that I need to pass my instance of Bar() into the api resource. Is there any way to pass it in through the add_resource method like api.add_resource(views.ApiPage, "/api/my/end/point/", instance=bar)?

2
  • You can override the init of ApiPage. Commented Aug 2, 2014 at 20:10
  • I don't believe that overriding ApiPage would work since add_resource takes a class reference, rather than a class instance. Commented Aug 2, 2014 at 21:13

4 Answers 4

51

Since version 0.3.3 (released May 22, 2015), add_resource() is able to pass parameters to your Resource constructor.

Following the original example, here is the 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

And the relevant code for main.py:

# ...
my_bar = Bar()
api.add_resource(views.ApiPage, '/api/my/end/point/',
                 resource_class_kwargs={'bar': my_bar})
Sign up to request clarification or add additional context in comments.

Comments

7

In version 0.3.5 documentation you can do it this way

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

pass your object in the add_resource method and use it in the resource init method

and in your class init

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

1 Comment

you saved me, a green hand 4 python.
3

After struggling with the same problem I found you can use add_url_rule coupled with as_view

So in your case I guess the code would be something like

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)

Comments

0

Given the documentation such thing can not be done at this level. One way to circumvent this issue would be to put the initialisation of Bar inside another module, then fetch the instance through an import in your views module.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.