【问题标题】:how to specify values for field.url in flask-restful with endpoint如何在带有端点的flask-restful中为field.url指定值
【发布时间】:2016-09-06 09:53:57
【问题描述】:

如何在 flask-restful 中自定义 field.url。

user_fields = {
    ...
    'test': fields.Url('userep', absolute=True)
    ....
}

api.add_resource(User, '/user', '/user/<int:userid>', endpoint='userep')

当我提交http://127.0.0.1:5000/user/1

结果是这样的:"test": "http://127.0.0.1:5000/user",

并像这样更改 user_fields:

user_fields = {
    'id': fields.Integer,
    'friends': fields.Url('/Users/{id}/Friends'),

当我提交http://127.0.0.1:5000/user/1 抛出类似的错误:

werkzeug.routing.BuildError

BuildError: 无法为端点 '/Users/{id}/Friends' 构建 url 具有值 ['_sa_instance_state', 'email', 'id', 'nickname', “密码”、“注册日期”、“状态”]。您指的是“版本”吗?

有什么建议吗?谢谢

进一步,如果我改变资源

api.add_resource(User, '/user/&lt;int:userid&gt;', endpoint='userep')

错误信息抛出

werkzeug.routing.BuildError

BuildError: 无法使用值构建端点“userep”的 url ['_sa_instance_state','电子邮件','id','昵称','密码', '注册日期','状态']。您是否忘记指定值 ['userid']?

在官方文档field.url中

class Url(Raw):
"""
A string representation of a Url
:param endpoint: Endpoint name. If endpoint is ``None``,
    ``request.endpoint`` is used instead
:type endpoint: str
:param absolute: If ``True``, ensures that the generated urls will have the
    hostname included
:type absolute: bool
:param scheme: URL scheme specifier (e.g. ``http``, ``https``)
:type scheme: str
"""
def __init__(self, endpoint=None, absolute=False, scheme=None):
    super(Url, self).__init__()
    self.endpoint = endpoint
    self.absolute = absolute
    self.scheme = scheme

def output(self, key, obj):
    try:
        data = to_marshallable_type(obj)
        endpoint = self.endpoint if self.endpoint is not None else request.endpoint
        o = urlparse(url_for(endpoint, _external=self.absolute, **data))
        if self.absolute:
            scheme = self.scheme if self.scheme is not None else o.scheme
            return urlunparse((scheme, o.netloc, o.path, "", "", ""))
        return urlunparse(("", "", o.path, "", "", ""))
    except TypeError as te:
        raise MarshallingException(te)

flask_restful/fields.py

【问题讨论】:

    标签: python flask flask-restful


    【解决方案1】:

    自己回答:这不是解决问题的方法。

    根据 flask-restful 项目问题:api.url_for() fails with endpoints specified by a stringFlask jsonify a list of objects

    这样的代码:

    from flask import url_for
    
    class ProjectsView(object):
        def __init__(self, projectid):
            self.projectid = projectid
            ...
    
        def serialize(self):
            return {
                ...
                'tasks_url':url_for('.getListByProjectID', _external=True, projectid=self.projectid),
            }
    
    class Projects(Resource):
        def get(self, userid):
            project_obj_list = []
            ...
            v = ProjectsView(project.id)
            project_obj_list.append(v)
    
        return jsonify(result=[e.serialize() for e in project_obj_list])
    

    这样的回应:

    {
      "result": [
        {
          ... 
          "tasks_url":"http://127.0.0.1:5000/api/v1.0/1/GetListByProjectID"
        }
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-26
      • 2017-04-02
      • 2014-01-05
      • 2016-08-12
      • 2014-01-10
      • 1970-01-01
      • 2014-09-09
      • 2012-06-23
      相关资源
      最近更新 更多