19

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?

Houman
  • 64,245
  • 87
  • 278
  • 460

3 Answers3

20

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')
Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
  • Thanks, this sounds promising. I should have mentioned I am trying to achieve this from the unit test perspective. `self.client = application.app.test_client()`. I get the error `RuntimeError: Attempted to generate a URL without the application context being pushed. This has to be executed when application context is available.` – Houman Jun 15 '14 at 11:11
  • 1
    See http://flask.pocoo.org/docs/testing/; for any test you'll need to create a context. – Martijn Pieters Jun 15 '14 at 11:37
3

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.

Miles R
  • 41
  • 1
  • 4
3
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.