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

自作多情 提交于 2019-12-18 15:08:09

问题


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?


回答1:


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')



回答2:


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.




回答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.



来源:https://stackoverflow.com/questions/24223628/how-do-i-use-flask-url-for-with-flask-restful

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!