目录
- 为接口提供一个主页
- 完成代码高亮显示的功能
- 为序列化类增加url
- 配置全局分页
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)
})
- 完成这个功能只需要一个简单的FBV提供GET方法即可,这个view将返回所有有效的url(通过JSON格式)。
-
reverse
方法通过url的名字,返回一个完整的url。
-
在
snippet/urls.py
配置主页的url
- 尽量不要使用任何正则式,保证我们直接访问最原始的url就可以访问的接口的主页。
- 养成好习惯,为每个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)
-
Drf提供的render类
-
当有特定要求时(上面的view中需要返回实例的highlighted属性,而不是通常意义上的一个序列化后的数据),通常会先继承
GenericAPIView
,然后overrideget
,post
等方法。 -
这里使用了
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', ...)
- 将
ModelSerializer
改为HyperlinkedModelSerializer
。 - 在继承后,就自动会增加一个字段
url
,但是需要手动配置到fields
中 - 为普通字段提供了
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
}
网友评论