如何优化 Django REST Framework 的性能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何优化 Django REST Framework 的性能相关的知识,希望对你有一定的参考价值。
参考技术A 这个优化的原理其实和其他语言优化的机制基本相同:1、一次request的数据库数据写操作不要太多,非及时的数据操作尽量异步化为后台任务,这方面django有channels,很方便
2、数据库读操作也不要太多,这方面如何优化,主要就是缓存读取的数据,django提供的cache搞这个也挺方便的
3、重复内容请求缓存化,这个缓存是指响应的回复内容的缓存,用Django本身提供那个cahching提供的view级缓存就Ok了,
4、如果在浏览器调用环境的话,还可以考虑客户端缓存
5、序列化器只返回需要返回的数据,序列化的层次不要太深,简单单数据对象的多级,可以定制方式能做成单级数据
6、有些返回数据是在写数据的异步任务自动生成存储到缓存里的。
7、系统提供的ViewSet和Router这类高度自动生成的技术在追求性能的场景下还是不要用了,尽量自己手写吧。
如何使用 Django Rest Framework 将 url 字段添加到序列化程序
【中文标题】如何使用 Django Rest Framework 将 url 字段添加到序列化程序【英文标题】:How to add an url field to a serializer with Django Rest Framework 【发布时间】:2016-08-10 08:59:17 【问题描述】:我正在关注Django Rest Framework - Tutorial 3 Class based views 上的教程。
如何将 url 字段(指向当前的 sn-p)添加到序列化程序中?
serializers.py
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
from django.core.urlresolvers import reverse
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
urls.py
urlpatterns = [
url(r'^snippets/$', views.SnippetList.as_view()),
url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),
]
实际输出
[
"id":1,
"title":"",
"code":"foo = \"bar\"\n",
"linenos":false,
"language":"python",
"style":"friendly"
]
所需的输出
[
"id":1,
"url":"http://192.168.28.131:8000/snippets/1/",
"title":"",
"code":"foo = \"bar\"\n",
"linenos":false,
"language":"python",
"style":"friendly"
,
]
【问题讨论】:
只要你遵循命名约定或者有命名的url:django-rest-framework.org/api-guide/reverse 【参考方案1】:您必须使用HyperlinkedModelSerializer
序列化程序和HyperlinkedIdentityField
字段
来自Django Rest Framework documentation
HyperlinkedModelSerializer
类类似于 ModelSerializer 类,除了它使用超链接来表示 关系,而不是主键。网址字段将是 使用HyperlinkedIdentityField
序列化器字段表示,并且 模型上的任何关系都将使用HyperlinkedRelatedField
序列化器字段。
例如(与您的情况):
class SnippetSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='snippet-detail', read_only=True)
class Meta:
model = Snippet
fields = ('id', 'url', 'title', 'code', 'linenos', 'language', 'style')
当然,view_name
的值必须与在urls.py
(或不在其他地方)中声明的用于获取有关 sn-p 的所有信息的 url 的名称匹配。
例如:
# urls.py
urlpatterns = [
url(r'^snippets/(?P<pk>[0-9]+)$', views.SnippetDetail.as_view(), name='snippet-detail'),
]
【讨论】:
谢谢!我的urls.py
看起来有些不同。它使用views.SnippetDetail.as_view()
(复制粘贴自教程)。当我使用你的定义时,我得到__init__() takes exactly 1 argument (3 given)
有什么想法吗?
是的,只需添加一个 name
值。我更新了我的例子。它不起作用,因为您使用基于类的视图。使用这个:url(r'^snippets/(?P<pk>[0-9]+)$', views.SnippetDetail.as_view(), name='snippet-detail')
【参考方案2】:
使用视图集时,将完整的反向 url 名称指定为 view_name
class XyzSerializer(serializers.HyperlinkedModelSerializer):
url = serializers.HyperlinkedIdentityField(
view_name='app1:api:xyz-detail',
read_only=True
)
class Meta:
model = Xyz
fields = ( 'id', 'url')
【讨论】:
以上是关于如何优化 Django REST Framework 的性能的主要内容,如果未能解决你的问题,请参考以下文章
django.test.client 上的 Django rest 框架导入错误
如何优化 Django REST Framework 的性能