美文网首页Drf/Django开发记录
Drf官网教程(五) - api接口url化

Drf官网教程(五) - api接口url化

作者: dyq666 | 来源:发表于2018-06-23 23:39 被阅读34次

目录

  1. 为接口提供一个主页
  2. 完成代码高亮显示的功能
  3. 为序列化类增加url
  4. 配置全局分页

1. 为接口提供一个主页

目前在浏览器中进行的测试,我们都是通过输入完整url来跳转网页,当提供的url变多时,难免会忘记哪些url是有效的。为了避免这种情况,我们为BrowserAPI提供一个主页,来引导我们测试。

  • snippet/urls.py为url命名

为每个url都增加一个参数name

urlpatterns = format_suffix_patterns([
    url(r'^snippets/$', views.SnippetList.as_view(), name='snippet-list'),
    url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view(), name='snippet-detail'),
    url(r'^users/$', views.UserList.as_view(), name='user-list'),
    url(r'^users/(?P<pk>[0-9]+)/$', views.UserDetail.as_view(), name='user-detail')
])
  • snippet/views.py增加主页的view
from rest_framework.reverse import reverse
from rest_framework.response import Response
from rest_framework.decorators import api_view

@api_view(['GET'])
def api_root(request, format=None):
    return Response({
        'users': reverse('user-list', request=request, format=format),
        'snippets': reverse('snippet-list', request=request, format=format)
    })
  1. 完成这个功能只需要一个简单的FBV提供GET方法即可,这个view将返回所有有效的url(通过JSON格式)。
  2. reverse方法通过url的名字,返回一个完整的url。
  • snippet/urls.py配置主页的url
  1. 尽量不要使用任何正则式,保证我们直接访问最原始的url就可以访问的接口的主页。
  2. 养成好习惯,为每个url都增加参数name
urlpatterns = format_suffix_patterns([
    url(r'^$', views.api_root, name='api-index'),
    ...
])
  • 配置后的接口主页

现在可以直接通过点击链接访问有效的url了,但是不要忘记当我们增加新的url后,要在主页的view中进行配置。

2. 完成代码高亮显示的功能

  • snippet/views.py增加代码高亮的view

在这个view我们想返回一个html,而不是返回json数据,所以使用了renderer_classes来指定渲染类。

from rest_framework import renderers

class SnippetHighlight(generics.GenericAPIView):
    queryset = Snippet.objects.all()
    renderer_classes = (renderers.StaticHTMLRenderer,)

    def get(self, request, *args, **kwargs):
        snippet = self.get_object()
        return Response(snippet.highlighted)
  1. Drf提供的render类


  2. 当有特定要求时(上面的view中需要返回实例的highlighted属性,而不是通常意义上的一个序列化后的数据),通常会先继承GenericAPIView,然后override getpost等方法。

  3. 这里使用了self.get_object(),这是GenericAPIView提供的获取当前的model实例的方法。

  • snippet/urls.py配置代码高亮的url
urlpatterns = format_suffix_patterns([
    ...
    url(r'^snippets/(?P<pk>[0-9]+)/highlight/$', views.SnippetHighlight.as_view(), name='snippet-highlight'),
   ...
])
  • 访问https://127.0.0.1:8000/snippets/1/highlight/的请求头参数

3. 为序列化类增加url

现在我们的json数据,表的关系是通过id联系的,现在我们希望用url代替id。

  • snippet/serializers.py更改序列化类
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    ...
    highlight = serializers.HyperlinkedIdentityField(view_name='snippet-highlight', format='html')

    class Meta:
        ...
        fields = ('url', 'highlight', ...)


class UserSerializer(serializers.HyperlinkedModelSerializer):
    snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippet-detail', read_only=True)

    class Meta:
        ...
        fields = ('url', ...)
  1. ModelSerializer改为HyperlinkedModelSerializer
  2. 在继承后,就自动会增加一个字段url,但是需要手动配置到fields
  3. 为普通字段提供了HyperlinkedIdentityField,为外键字段提供了HyperlinkedRelatedField。其中最关键的参数view_name的值是url的参数name,也就是通过url配置中的name来获取到对应的url。

4. 配置全局分页

  • drf_tutorial/settings.py配置分页
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

相关文章

网友评论

    本文标题:Drf官网教程(五) - api接口url化

    本文链接:https://www.haomeiwen.com/subject/qegdyftx.html