导读:今天首席CTO笔记来给各位分享关于django调用sdk如何避免内存溢出的相关内容,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
如何正确使用 Django Forms
1. Django Forms的强大之处
有些django项目并不直接呈现HTML, 二是以API框架的形式存在, 但你可能没有想到, 在这些API形式的django项目中也用到了django forms. django forms不仅仅是用来呈现HTML的, 他们最强的地方应该是他们的验证能力. 下面我们就介绍几种和Django forms结合使用的模式:
2. 模式一: ModelForm和默认验证
最简单的使用模式便是ModelForm和model中定义的默认验证方式的组合:
# myapp/views.py
from django.views.generic import CreateView, UpdateView
from braces.views import LoginRequiredMixin
from .models import Article
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
fields = ('title', 'slug', 'review_num')
class ArticleUpdateView(LoginRequiredMixin, UpdateView):
model = Article
fields = ('title', 'slug', 'review_num')
正如以上代码中看到的一样:
ArticleCreateView和ArticleUpdateView中设置model为Article
两个view都基于Article model自动生成了ModelForm
这些ModelForm的验证, 是基于Article model中定义的field转换而来的
3. 模式二, 在ModelForm中修改验证
在上面的例子中, 如果我们希望每篇article title的开头都是"new", 那么应该怎么做呢? 首先我们需要建立自定义的验证(validator):
# utils/validator.py
from django.core.exceptions import ValidationError
def validate_begins(value):
if not value.startswith(u'new'):
raise ValidationError(u'Must start with new')
可见, 在django中的验证程序就是不符合条件便抛出ValidationError的function, 为了方便重复使用, 我们将它们放在django app utils的validators.py中.
接下来, 我们可以在model中加入这些validator, 但为了今后的方便修改和维护, 我们更倾向于加入到ModelForm中:
# myapp/forms.py
from django import forms
from utils.validators import validate_begin
from .models import Article
class ArticleForm(forms.ModelForm):
dev __init__(self, *args, **kwargs):
super(ArticleForm, self).__init__(8args, **kwargs)
self.fields["title"].validators.append(validate_begin)
class Meta:
model = Article
Django的edit views(UpdateView和CreateView等)的默认行为是根据view中model属性, 自动创建ModelForm. 因此, 我们需要调用我们自己的Modelform来覆盖自动创建的:
# myapp/views.py
from django.views.generic import CreateView, UpdateView
from braces.views import LoginRequiredMixin
from .models import Article
from .forms import ArticleForm
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
fields = ('title', 'slug', 'review_num')
form_class = ArticleForm
class ArticleUpdateView(LoginRequiredMixin, UpdateView):
model = Article
fields = ('title', 'slug', 'review_num')
form_class = ArticleForm
4. 模式三, 使用form的clean()和clean_field()方法
如果我们希望验证form中的多个field, 或者验证涉及到已经存在之后的数据, 那么我们就需要用到form的clean()和clean_field()方法了. 以下代码检查密码长度是否大于7位, 并且password是否和password2相同:
# myapp/forms.py
from django import forms
class MyUserForm(forms.Form):
username = forms.CharField()
password = forms.CharField()
password2 = forms.CharField()
def clean_password(self):
password = self.cleaned_data['password']
if len(password) = 7:
raise forms.ValidationError("password insecure")
return password
def clean():
cleaned_data = super(MyUserForm, self).clean()
password = cleaned_data.get('password', '')
password2 = cleaned_data.get('password2', '')
if password != password2:
raise forms.ValidationError("passwords not match")
return cleaned_data
其中需要注意的是, clean()和clean_field()的最后必须返回验证完毕或修改后的值.
5. 模式四, 自定义ModelForm中的field
我们会经常遇到在form中需要修改默认的验证, 比如一个model中有许多非必填项, 但为了信息完整, 你希望这些field在填写时是必填的:
# myapp/models.py
from django.db import models
class MyUser(models.Model):
username = models.CharField(max_length=100)
password = models.CharField(max_length=100)
address = models.TextField(blank=True)
phone = models.CharField(max_length=100, blank=True)
为了达到以上要求, 你可能会通过直接增加field改写ModelForm:
# 请不要这么做
# myapp/forms.py
from django import forms
from .models import MyUser
class MyUserForm(forms.ModelForm):
# 请不要这么做
address = forms.CharField(required=True)
# 请不要这么做
phone = forms.CharField(required=True)
class Meta:
model = MyUser
请不要这么做, 因为这违反"不重复"的原则, 而且经过多次的拷贝粘贴, 代码会变得复杂难维护. 正确的方式应当是利用__init__():
# myapp/forms.py
from django import forms
from .models import MyUser
class MyUserForm(forms.ModelForm):
def __init__(self, *args, **kwarg):
super(MyUserForm, self).__init__(*args, **kwargs)
self.fields['address'].required = True
self.fields['phone'].required = True
class Meta:
model = MyUser
值得注意的是, Django forms也是Python类, 类可以继承和被继承, 也可以动态修改.
如何优化 Django REST Framework 的性能
解决 Django 「懒惰」的基本方法
现在我们解决这个问题的方法就是「预加载」。从本质上讲,就是你提前警告 Django ORM 你要一遍又一遍的告诉它同样无聊的指令。在上面的例子中,在 DRF 开始获取前很简单地加上这句话就搞定了:
queryset = queryset.prefetch_related('orders')
当 DRF 调用上述相同序列化 customers 时,出现的是这种情况:
获取所有 customers (执行两个往返数据库操作,第一个是获取 customers,第二个获取相关 customers 的所有相关的 orders。)
对于第一个返回的 customers,获取其 order (不需要访问数据库,我们已经在上一步中获取了所需要的数据)
对于第二个返回的 customers,获取其 order (不需要访问数据库)
对于第三个返回的 customers,获取其 order (不需要访问数据库)
对于第四个返回的 customers,获取其 order (不需要访问数据库)
对于第五个返回的 customers,获取其 order (不需要访问数据库)
对于第六个返回的 customers,获取其 order (不需要访问数据库)
你又意识到,你可以有了 很多 customers ,已经不需要再继续等待去数据库。
其实 Django ORM 的「预备」是在第1步进行请求,它在本地高速缓存的数据能够提供步骤2+所要求的数据。与之前往返数据库相比从本地缓存数据中读取数据基本上是瞬时的,所以我们在有很多 customers 时就获得了巨大的性能加速。
解决 Django REST Framework 性能问题的标准化模式
我们已经确定了一个优化 Django REST Framework 性能问题的通用模式,那就是每当序列化查询嵌套字段时,我们就添加一个新的 @staticmethod 名叫 setup_eager_loading ,像这样:
class CustomerSerializer(serializers.ModelSerializer):
orders = OrderSerializer(many=True, read_only=True)
def setup_eager_loading(cls, queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('orders')
return queryset
这样,不管哪里要用到这个序列化,都只需在调用序列化前简单调用 setup_eager_loading ,就像这样:
customer_qs = Customers.objects.all()
customer_qs = CustomerSerializer.setup_eager_loading(customer_qs) # Set up eager loading to avoid N+1 selects
post_data = CustomerSerializer(customer_qs, many=True).data
或者,如果你有一个 APIView 或 ViewSet ,你可以在 get_queryset 方法里调用 setup_eager_loading :
def get_queryset(self):
queryset = Customers.objects.all()
# Set up eager loading to avoid N+1 selects
queryset = self.get_serializer_class().setup_eager_loading(queryset)
return queryset
django中后台admin我是自己写的,现在要用用户认证这块了,感觉他自带的认证功能比较好,如何使用呢
不是使用自带admin的时候,有个配置文件捏,主要在那个文件里面改就好了,admin的实质其实就是一个工厂而已,配置了在系统第一次加载的时候就已经全部生成,默认路径是admin,既然你自己写了admin模块,你把你写的url路径换一个,那么在访问的时候,就两个都能访问了撒,比如你的admin最开始的基本路径叫admin1,就和默认admin分开了,想用那个服务,调用哪一个就好了
Django源码阅读 (一) 项目的生成与启动
诚实的说,直到目前为止,我并不欣赏django。在我的认知它并不是多么精巧的设计。只是由功能堆积起来的"成熟方案"。但每一样东西的崛起都是时代的选择。无论你多么不喜欢,但它被需要。希望有一天,python能有更多更丰富的成熟方案,且不再被诟病性能和可维护性。(屁话结束)
取其精华去其糟粕,django的优点是方便,我们这次源码阅读的目的是探究其方便的本质。计划上本次源码阅读不会精细到每一处,而是大体以功能为单位进行解读。
django-admin startproject HelloWorld 即可生成django项目,命令行是exe格式的。
manage.py 把参数交给命令行解析。
execute_from_command_line() 通过命令行参数,创建一个管理类。然后运行他的 execute() 。
如果设置了reload,将会在启动前先 check_errors 。
check_errors() 是个闭包,所以上文结尾是 (django.setup)() 。
直接看最后一句 settings.INSTALLED_APPS 。从settings中抓取app
注意,这个settings还不是我们项目中的settings.py。而是一个对象,位于 django\conf\__init__.py
这是个Settings类的懒加载封装类,直到 __getattr__ 取值时才开始初始化。然后从Settings类的实例中取值。且会讲该值赋值到自己的 __dict__ 上(下次会直接在自己身上找到,因为 __getattr__ 优先级较低)
为了方便debug,我们直接写个run.py。不用命令行的方式。
项目下建个run.py,模拟runserver命令
debug抓一下setting_module
回到 setup() 中的最后一句 apps.populate(settings.INSTALLED_APPS)
开始看 apps.populate()
首先看这段
这些App最后都会封装成为AppConfig。且会装载到 self.app_configs 字典中
随后,分别调用每个appConfig的 import_models() 和 ready() 方法。
App的装载部分大体如此
为了方便debug我们改写下最后一句
res的类型是 Command django.contrib.staticfiles.management.commands.runserver.Command object at 0x00000101ED5163A0
重点是第二句,让我们跳到 run_from_argv() 方法,这里对参数进行了若干处理。
用pycharm点这里的handle会进入基类的方法,无法得到正确的走向。实际上子类Commond重写了这个方法。
这里分为两种情况,如果是reload重载时,会直接执行 inner_run() ,而项目启动需要先执行其他逻辑。
django 项目启动时,实际上会启动两次,如果我们在项目入口(manage.py)中设置个print,会发现它会打印两次。
第一次启动时, DJANGO_AUTORELOAD_ENV 为None,无法进入启动逻辑。会进入 restart_with_reloader() 。
在这里会将 DJANGO_AUTORELOAD_ENV 置为True,随后重启。
第二次时,可以进入启动逻辑了。
这里创建了一个django主线程,将 inner_run() 传入。
随后本线程通过 reloader.run(django_main_thread) ,创建一个轮询守护进程。
我们接下来看django的主线程 inner_run() 。
当我们看到wsgi时,django负责的启动逻辑,就此结束了。接下来的工作交由wsgi服务器了
这相当于我们之前在fastapi中说到的,将fastapi的app交由asgi服务器。(asgi也是django提出来的,两者本质同源)
那么这个wsgi是从哪来的?让我们来稍微回溯下
这个settings是一个对象,在之前的操作中已经从 settings.py 配置文件中获得了自身的属性。所以我们只需要去 settings.py 配置文件中寻找。
我们来寻找这个 get_wsgi_application() 。
它会再次调用 setup() ,重要的是,返回一个 WSGIHandler 类的实例。
这就是wsgiapp本身。
load_middleware() 为构建中间件堆栈,这也是wsgiapp获取setting信息的唯一途径。导入settings.py,生成中间件堆栈。
如果看过我之前那篇fastapi源码的,应该对中间件堆栈不陌生。
app入口→中间件堆栈→路由→路由节点→endpoint
所以,wsgiapp就此构建完毕,服务器传入请求至app入口,即可经过中间件到达路由进行分发。
请教一个django后台管理页面问题
django的后台扩展有扩展模型、扩展模型字段(field)方法,但我还是最喜欢这种扩展方式(来自django的官方文档,非常适合自定义):
转自:
原理很简单,就是用在url.py中添加一条url配置覆盖掉后台默认的url处理,然后就可以随心所欲的编写自己的view了
显而易见,对数据编辑工作来说,该管理界面极为有用(想象一下)。如果用于完成某种数据的录入工作,该管理界面实在是无人能及。我们猜想本书绝大多数读者都有成堆数据录入任务。
Django管理接口特别关注那些没有技术背景的用户来使用数据录入;这也是该功能的开发目的。在Django最初开发地报社,开发一个典型的在线市政供水质量报告系统,需求如下:
负责该题材的记者与某个开发人员会面,提交现有数据。
开发人员围绕该数据设计一个模型,并为该记者开发出管理界面。
在记者将数据录入 Django 的同时,程序员就可以专注于开发公众访问界面了(最有趣的部分!)。
换句话说,Django 管理接口之所以存在的首要目的是为了方便内容编辑人员和程序员同时开展工作。
当然,除了显而易见的数据录入任务之外,我们发现管理界面在其他一些情况下有是很有用处的。
CrqrWV a href=”“xwyekefymefu/a, [url=]eycmfqtvgmvb[/url], [link=]ibbcerwyzvhq[/link],
管理获得的数据 :很少有真实数据输入会和像 这样的站点相关联,因为多数数据来自自动生成的源头。然而,当所获取的数据出错而导致麻烦时,能够便捷地找到并修改出错数据将会有助于问题解决。
无需或者仅需略为定制之后, Django 管理界面就能处理绝大部分常见情形。然而,正是因为在设计上极力折衷, Django 管理界面能够很好地处理这种常见情形也就意味着它无法同样处理其它一些编辑模型。
4yQjmU a href=”“kdqfnmmekszw/a, [url=]zusybryiqeir[/url], [link=]grlqejhxwprt[/link],
管理之道
BmuFnt a href=”“ifhkpydljkaf/a, [url=]mqitqhmcazco[/url], [link=]qcmerxzxnmhj[/link],
受信任用户编辑结构化的内容。
是的,这非常的简单,但这种简单是建立在一整堆假定之上的。Django 管理界面的全部设计理念均直接遵循这些假定,因此让我们深入理解一下这些后续小节中所出现术语的含义。
受信任用户
管理界面被设计成由你这样的开发人员所 信任 的人使用。这里所指的并非只是通过身份验证的人;而是说 Django 假定可以相信内容编辑者只会做对的事情。
反过来说,这也就意味着如果你信任用户,他们无需征得许可就能编辑内容,也没有人需要对他们的编辑行为进行许可。另一层含义是,尽管认证系统功能强大,但到本书写作时为止,它并不支持对象级基础的访问限制。如果你允许某人对自己的新闻报道进行编辑,你必须能够确信该用户不会未经许可对其他人的报道进行编辑。
编辑
Django 管理界面的首要目的是让用户编辑数据。乍一看这是显而易见的,但仔细一想却又变得有点难以捉摸和不同凡响。
举例来说,虽然管理界面非常便于查验数据(如刚才所讨论的那样),但这并不是它的设计初衷。比如我们在第 12 章中谈到的,它缺少视图许可。Django 假定如果某人在管理界面中可以查看内容,那么也可以进行编辑。
还有件更重要的事情要注意,那就是对于远程调用工作流的缺乏。如果某个特定任务由一系列步骤组成,没有任何机制确保这些步骤能够以某个特定顺序完成。 Django 管理界面专注于 编辑 ,而不关心修改周边的活动。对工作流的这种回避也源自于信任原则:管理界面的设计理念是工作流乃人为事物,无需在代码中实现。
最后,要注意的是管理界面中缺少聚合。也就是说,不支持显示总计、平均值之类的东西。再次重申,管理界面只用于编辑——它预期你将通过定义视图来完成其它所有工作。
结构化的内容
30CEN9 a href=”“bxyzitjhvwis/a, [url=]ylhgcrwsnuue[/url], [link=]mecoeqqxpail[/link],
就此打住
现在可以肯定的是,Django 的管理界面 并不 打算成为所有人的万能工具;相反我们选择了专心做一件事情,并把它完成得尽善尽美。
SaPQz9 a href=”“fmvbpdngtcts/a, [url=]tvwreqwomvco[/url], [link=]nwfgxlxpodeq[/link],
必须记住,尽管管理界面很复杂,但它始终只是一个应用程序。只要有充足的时间,任何Django的开发者都能做到admin接口做到的所有事。 因此,我们需要寄希望于将来会有一个完全不同的admin接口会出现,这个新的接口拥有一系列不同的前提假设,并且工作方式也完全不同。
最后要指出的是,在本文写作之时,Django 开发者们正在进行一个新的管理界面的开发工作,该版本将提供更多定制灵活性。当你阅读本文时,这些新特性也许已经进入了真实的 Django 发布之中。你可以向 Django 社区的某些人了解是否已经整合了 newforms-admin 主干代码。
定制管理模板
lrYxwt a href=”“uokhfgxirpcl/a, [url=]wqhpuiouinaf[/url], [link=]fpatpucympci[/link],
现在,我们来看看如何来快速定制admin管理接口的外观。 第6章讲到了一些最常见的任务:修改商标(为那些讨厌蓝色的尖发老板),或者提供一个自定义的form。
更进一步的目标常常会包含,改变模板中的一些特殊的项。每一种admin的视图,包括修改列表、编辑表单、删除确认页以及历史视图,都有一个与之相关联的模板可以以多种方式来进行覆盖。
首先,你可以在全局上覆盖模板。admin视图使用标准的模板载入机制来查找模板。所以如果你在模板目录中创建了一个新的模板,Django会自动地加载它。全局的模板在表17-1中列出。
Fd2cvv a href=”“fphafdvvmhea/a, [url=]mompqgnztmob[/url], [link=]oamzxjphpsxv[/link],
大多数时候,你可能只是想修改一个单独的对象或应用程序,而不是修改全局性的设定。因此,每个admin视图总是先去查找与模型或应用相关的模板。这些视图寻找模板的顺序如下:
admin/app_label/object_name/template.html
JRmAl2 a href=”“kqeldaxlpkep/a, [url=]ihzkjznjrsqj[/url], [link=]sqhirlipxjfo[/link],
admin/template.html
例如,在 books 这个应用程序中, Book 模块的添加/编辑表单的视图会按如下顺序查找模板:
admin/books/book/change_form.html
admin/books/change_form.html
admin/change_form.html
自定义模型模板
大多数时候,你想使用第一个模板来创建特定模型的模板。 通常,最好的办法是扩展基模板和往基模板中定义的区块 中添加信息。
例如,我们想在那个书籍页面的顶部添加一些帮助文本。 可能是像图17-1所示的表单一样的东西。
图 17-1. 一个自定义管理编辑表单.
这做起来非常容易:只要建立一个 admin/bookstore/book/change_form.html 模板,并输入下面的代码:
{% extends "admin/change_form.html" %}
{% block form_top %}
pInsert meaningful help message here.../p
{% endblock %}
mGrlX4 a href=”“omnhyzkldddt/a, [url=]ydlrelntzksj[/url], [link=]zzizrvybyaol[/link],
自定义JavaScript
这些自定义模型模板的常见用途包括,给admin页面增加自定义的javascript代码来实现一些特殊的视图物件或者是客户端行为。
幸运的是,这可以更简单。每一个admin模板都定义了 {% block extrahead %} ,你可以在 head 元素中加入新的内容。例如你想要增加jQuery() 到你的admin历史中,可以这样做:
{% extends "admin/object_history.html" %}
{% block extrahead %}
script src="" type="text/javascript"/script
script type="text/javascript"
// code to actually use jQuery here...
/script
{% endblock %}
备注
我们并不知道你为什么需要把jQuery放入到历史页中,但是这个例子可以被用到任何的模板中。
TYy7is a href=”“hpswriedwzmw/a, [url=]bvkzcktnoefm[/url], [link=]wkbudpcvacdz[/link],
创建自定义管理视图
现在,想要往Django的admin管理接口添加自定义行为的人,可能开始觉得有点奇怪了。我们这里所讲的都是如何改变admin管理接口的外观。他们都在喊:如何才能改变admin管理接口的内部工作机制。
首先要提的一点是,这并不神奇。admin管理接口并没有做任何特殊的事情,它只不过是和其他一些视图一样,简单地处理数据而已。
确实,这里有相当多的代码; 它必须处理各种各样的操作,字段类型和设置来展示模型的行为. 当你注意到ADMIN界面只是一系列视图(Views)的集合,增加自定义的管理视图就变得容易理解了。
作为举例,让我们为第六章中的图书申请增加一个出版商报告的视图。建立一个admin视图用于显示被出版商分好类的书的列表,一个你要建立的自定义admin报告视图的极典型的例子。
首先,在我们的URLconf中连接一个视图。插入下面这行:
(r'^admin/books/report/$', 'mysite.books.admin_views.report'),
在将这行加入这个admin视图之前,原本的URLconf应该是这样:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^admin/bookstore/report/$', 'bookstore.admin_views.report'),
(r'^admin/', include('django.contrib.admin.urls')),
)
为什么要将定制试图置于管理内容 之前 呢?回想一下,Django 是按照顺序处理 URL 匹配式的。管理内容几乎匹配内容点之后所有的东西,因此如果我们把这几行的顺序颠倒一下, Django 将会为该匹配式找到一个内建管理视图,并将试图在 books 应用程序中为 Report 模型再入更新列表,而这却是不存在的。
现在我们开始写视图。为了简单起见,我们只把所有书籍加载到上下文中,让模板用 {% regroup %} 标签来处理分组操作。创建 books/admin_views.py 文件并写入以下内容:
from mysite.books.models import Book
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.contrib.admin.views.decorators import staff_member_required
def report(request):
return render_to_response(
"admin/books/report.html",
{'book_list' : Book.objects.all()},
RequestContext(request, {}),
)
report = staff_member_required(report)
因为我们把分组操作留给了模板,该视图非常简单。然而,有几段微妙的细节值得我们搞清楚。
我们使用了 django.contrib.admin.views.decorators 中的 staff_member_required 修饰器。该修饰器与第 12 章中讨论的 login_required 类似,但它还检查所指定的用户是否标记为内部人员,以决定是否允许他访问管理界面。
该修饰器保护所有内容的管理视图,并使得视图的身份验证逻辑匹配管理界面的其它部分。
我们在 admin/ 之下解析了一个模板。尽管并非严格要求如此操作,将所有管理模板分组放在 admin 目录中是个好的做法。我们也将应用程序所有的模板放置在名叫 books 的目录中,这也是最佳实践。
我们将 RequestContext 用作 render_to_response 的第三个参数(``context_instance`` )。这就确保了模板可访问当前用户的信息。
参看第十章了解更多关于 RequestContext 的信息。
最后, 我们为这个视图做一个模板。我们将扩展内置管理模板, 以使该视图明确地成为管理界面的一部分.
{% extends "admin/base_site.html" %}
{% block title %}List of books by publisher{% endblock %}
{% block content %}
div id="content-main"
h1List of books by publisher:/h1
{% regroup book_list|dictsort:"publisher.name" by publisher as books_by_publisher %}
{% for publisher in books_by_publisher %}
h3{{ publisher.grouper }}/h3
ul
{% for book in publisher.list|dictsort:"title" %}
li{{ book }}/li
{% endfor %}
/ul
{% endfor %}
/div
{% endblock %}
通过扩展 admin/base_site.html , 我们没费丝毫气力就得到了 Django 管理界面的外观。图 17-2 我展示了像这样的一个最终结果。
图 17-2. 一个自定义按出版商归类的图书管理视图
使用该技术,你可以向管理界面中添加任何你梦想中的东西。需要记住的是这些被叫做定制管理视图实际不过是普通的 Django 视图,你可以使用在本书其它部分所学到的技术制作出符合自己需要的复杂管理界面。
覆盖内置视图
有时缺省的管理视图无法完成某项工作。你可以轻松地换上自己的定制视图;只需要用自己的 URL 遮蔽内建的管理视图。也就是说,如果在 URLConf 中你的视图出现在缺省管理视图之前,你的视图将取代缺省视图被调用。
举例来说,我们可以用一个让用户简单输入 ISBN 的窗体来取代内建的书籍创建视图。然后,我们可以从 查询该书的信息,并自动地创建对象。
这样的视图的代码留给读者作为一个练习, 重要的部分是这个 URLconf 代码片断:
(r'^admin/bookstore/book/add/$', 'mysite.books.admin_views.add_by_isbn'),
如果这个代码片段在 URLConf 中出现于管理 URL 之前, add_by_isbn 视图将完全取代标准的管理视图。
按照这种方式,我们可以替换删除确认页、编辑页面或者管理界面的其它任何部分。
结语:以上就是首席CTO笔记为大家整理的关于django调用sdk如何避免内存溢出的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,更多关于django调用sdk如何避免内存溢出的相关内容别忘了在本站进行查找喔。