Houman
Houman

Reputation: 66320

How do I use flask.url_for() with flask-restful?

I have setup Flask restful like this:

api = Api(app, decorators=[csrf_protect.exempt])
api.add_resource(FTRecordsAPI,
                 '/api/v1.0/ftrecords/<string:ios_sync_timestamp>',
                 endpoint="api.ftrecord")

I would like to redirect internally to the endpoint api.ftrecord.

But the moment I try to do this:

base_url = flask.url_for('api.ftrecord')

I get an exception.

  File "/Users/hooman/workspace/F11A/src/lib/werkzeug/routing.py", line 1620, in build
    raise BuildError(endpoint, values, method)
BuildError: ('api.ftrecord', {}, None)

What am I missing please?

Upvotes: 18

Views: 14334

Answers (3)

user3131182
user3131182

Reputation: 31

api = Api(app, decorators=[csrf_protect.exempt])
api.add_resource(FTRecordsAPI,
                 '/api/v1.0/ftrecords/<string:ios_sync_timestamp>',
                 endpoint="api.ftrecord")
with app.test_request_context():
    base_url = flask.url_for('api.ftrecord')

I met the same error. By using 'with app.test_request_context():', it works.

Upvotes: 3

Miles R
Miles R

Reputation: 41

I had this problem today. Here's the pull request that added the functionality (11 months ago):

https://github.com/twilio/flask-restful/pull/110

You can see his example usage there.

In my resources file, I do not have access to the app context. So I had to do this:

from flask.ext import restful
from flask import current_app

api = restful.Api
print api.url_for(api(current_app), UserResource, user_id=user.id, _external=True)

Hope that helps.

Upvotes: 3

Martijn Pieters
Martijn Pieters

Reputation: 1121186

You'll need to specify a value for the ios_sync_timestamp part of your URL:

flask.url_for('api.ftrecord', ios_sync_timestamp='some value')

or you could use Api.url_for(), which takes a resource:

api.url_for(FTRecordsAPI, ios_sync_timestamp='some value')

Upvotes: 20

Related Questions