python – @list_route和@detail_route嵌套路由不会出现在Browseable API中
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – @list_route和@detail_route嵌套路由不会出现在Browseable API中,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3305字,纯文字阅读大概需要5分钟。
内容图文
![python – @list_route和@detail_route嵌套路由不会出现在Browseable API中](/upload/InfoBanner/zyjiaocheng/779/fd98b90b0a5e435ab8549ef330133c8f.jpg)
我试图通过@list_route和@detail_route装饰器使用嵌套路由.路由工作并返回数据,但我必须在地址栏中手动导航到它们.它们不会出现在可浏览API中的DefaultRouter生成的ApiRoot中.我正在使用Django 1.8和Rest Framework 3.1.1.
在urls.py中:
router = DefaultRouter()
router.register(r'aggregates', viewsets.AggregateViewSet, base_name='aggregate')
urlpatterns = [
url(r'^api/', include(router.urls, namespace='myapp')),
]
在viewsets.py中:
class AggregateViewSet(viewsets.GenericViewSet):
queryset = models.DataAggregate.objects.order_by('id')
serializer_class = serializers.AggregateSerializer
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
@list_route(url_path='recent')
def recent_aggregates(self, request):
return Response({'message': 'herp a derp'})
当我导航到/ myapp / api时,可浏览的API只显示以下内容:
HTTP 200 OK
Content-Type: application/json
Vary: Accept
Allow: GET, HEAD, OPTIONS
{
"aggregates": "http://localhost:8000/myapp/api/aggregates/"
}
我期待这个:
{
"aggregates": "http://localhost:8000/myapp/api/aggregates/"
"aggregates-recent": "http://localhost:8000/myapp/api/aggregates/recent"
}
我已经尝试了各种修改版本,看它是否会让步,无济于事.同样,这些路由确实起作用,如果我手动导航它们,可浏览的API将显示它们的页面……但是会破坏可浏览api的目的.
我看了一下DefaultRouter(和SimpleRouter)的代码,看起来确实发现了动态路由……
解决方法:
这是真的,并且默认情况下它不会出现在API中.
我自己使用该片段来提供遵循HAL样式(py3代码)的嵌套路由.
import urllib
from collections import OrderedDict
from rest_framework import serializers, relations
class SubNamespaceURLField(relations.HyperlinkedIdentityField):
"""Refers to a child namespace of the object, as pointed by view_name
"""
def __init__(self, namespace, *args, **kwargs):
self.namespace = namespace.strip('/')
super().__init__(*args, **kwargs)
def field_to_native(self, obj, field_name):
base = super().field_to_native(obj, field_name)
return urllib.parse.urljoin(base, self.namespace) + '/'
class HALNestedLinksField(relations.HyperlinkedIdentityField):
""" Tries to represent a list of nested links on the resource a
HAL-compliant way.
See http://stateless.co/hal_specification.html
"""
def __init__(self, endpoints, *args, **kwargs):
"""
:param endpoints list of url suffixes leading to nested operations on
the resource (ex: ['preview', 'check'])
"""
self.endpoints = endpoints
super().__init__(*args, **kwargs)
def get_attribute(self, obj):
return obj
def to_representation(self, value):
links = OrderedDict()
prefix = super().to_representation(self.get_attribute(value))
for i in self.endpoints:
# We consider if it contains a dot its a content-type indication,
# so no trailing slash
if '.' in i:
suffix = ''
else:
suffix = '/'
links[i] = {'href':
urllib.parse.urljoin(prefix, i) + suffix}
return links
然后在序列化程序中使用它:
class SomeModelSerializer(serializers.HyperlinkedModelSerializer):
_links = HALNestedLinksField(['revalidate'], # you detail_route names
view_name='somemodel-detail')
class Meta:
model = SomeModel
fields = ('url',
'date',
'_links') # do not forget it
并且您将获得一个_links属性,其中包含您在HALNestedLinksField中声明的所有相关路由.
内容总结
以上是互联网集市为您收集整理的python – @list_route和@detail_route嵌套路由不会出现在Browseable API中全部内容,希望文章能够帮你解决python – @list_route和@detail_route嵌套路由不会出现在Browseable API中所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。