url_for для перехода на Flask Restful
Мои маршруты в Колбе были определены так:
@api_app.route('/api/1.0/infrastructure/', methods=['POST'])
def create_infrastructure():
return (jsonify({'job': job_instance.reference}), 202,
{'Location': url_for('get_job', ref=job_instance.reference, _external=True)})
функция get_job:
@api_app.route('/api/1.0/job/<string:ref>', methods=['GET'])
def get_job(ref):
job = Model.Job.query.filter_by(reference=ref).first()
if not job:
abort(400)
return jsonify({'job': job.reference})
Я мигрировал в среду flask.ext.restful и теперь выглядит так:
from flask.ext.restful import Resource
class Job(Resource):
def get(self, ref):
job = Model.Job.query.filter(Model.Job.reference == ref).first()
if job:
return jsonify(job.serialize())
resp = Response(status=404, mimetype='application/json')
return resp
В этом API на основе классов с использованием flask.ext.restfulКак определить параметры url_for в этой среде на основе классов?
В моем основном файле приложения:
api.add_resource(Job, '/api/1.0/job/<string:ref>')
imbue_api.add_resource(Infrastructures, '/api/1.0/infrastructure')
2 ответа
Самый простой способ - использовать колбуApi.url_for
,
Так что вместо того, чтобы писать
url_for('get_job', ...)
Вы должны были бы
from flask_restful import Api
Api.url_for(Job, ...)
Примечание. Важно убедиться, что вы не создаете циклический импорт, импортируя классы друг в друга. Мой личный предпочтительный способ организовать это - импортировать все задействованные ресурсы в __init__.py
а затем, если вы хотите, чтобы ссылки на них вы import .Job
таким образом вы обеспечите чистый порядок импорта.
Спасибо, я использовал следующее:
from flask import current_app
api = restful.Api
В моем классе инфраструктуры:
response.headers['Location'] = api.url_for(api(current_app),
Job,
ref=job_instance.reference,
_external=True)
И теперь работает отлично