如何优化 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&lt;pk&gt;[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 的性能

Django 和 Django 休息框架

无法使用 Django Rest 框架发送压缩的 gzip 数据

如何优化查询 django rest-framework

Django REST to React - 无需密码即可获取社交身份验证令牌