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)

И теперь работает отлично

Другие вопросы по тегам