【发布时间】: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/<int:userid>', 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)
【问题讨论】:
标签: python flask flask-restful