url_for迁移到Flask Restful

时间:2016-01-24 09:20:22

标签: python rest flask flask-restful

我的Flask路线定义如下:

@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 个答案:

答案 0 :(得分:3)

最简单的方法是使用flask-restful's Api.url_for

所以不要写

url_for('get_job', ...)

你必须

from flask_restful import Api

Api.url_for(Job, ...)

注意:的 重要的是确保您不通过将类导入彼此来创建循环导入。我个人首选的方法是在__init__.py中导入所有涉及的资源,然后如果要将import .Job链接到他们,那么就可以强制执行干净的导入订单。

答案 1 :(得分:0)

谢谢我使用了以下内容:

from flask import current_app
api = restful.Api

在我的基础架构课程中:

response.headers['Location'] = api.url_for(api(current_app),
                                                           Job,
                                                           ref=job_instance.reference,
                                                           _external=True)

现在工作正常