今天,我将与您分享Django如何完成数据验证的知识。其中,Django CSRFTKOON验证也将被解释。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!
本文目录清单:
1. Django的前端和后端完全分开。如何登录到登录验证2.如何在Django中使用模型查询不等于某个值。3. django orm如何确定数据库中的表是否已经存在?4。使用Django开发一个相对简单的帖子接口5.如何确定数据库记录是否存在。6。如何正确使用Django表单前端的用户名和密码以及其他参数以将请求发送到背景。或同意解密方法。通过用户名和密码严格验证了后端后,用户信息将存储在会话中。响应将使Session_ID到前端将cookie设置为前端。
模型是Django项目的基础。如果起初设计不当,那么在下一个开发过程中将遇到更多问题。或修改模型。这样做的后果是,在下一个开发过程中,我们必须做更多的努力来纠正这些错误。
因此,在修改模型时,我们必须尽可能多地考虑!以下是我们经常使用的一些工具和技术:
南方,对于数据迁移,我们将在每个Django项目中使用它。但是,当Django 1.7时,将会有Django.db。移民。
Django-Model-Utils,用于处理常见模式,例如TimessTampedModel。
django-extensions主要使用shell_plus命令,该命令将自动加载所有应用程序中的所有应用程序
1.基本原则
首先,在不同的应用程序中分发模型。如果您的Django项目中有20多个型号,则应考虑旋转该应用程序。我们建议每个应用程序的模型不超过5码。
其次,尝试使用ORM。我们需要的大多数数据库索引都可以通过对象相关模型来实现,ORM为我们带来了许多快捷方式,例如生成SQL语句,读取/更新数据库时的安全验证。因此,如果您可以使用简单的ORM语句,则应尝试尽可能多地使用ORM。只有当纯SQL语句大大简化ORM语句时,才使用纯SQL语句。并且,在编写纯SQL语句时,应优先使用RAW()然后使用frain()。
第三,如有必要,添加索引。添加db_index = tum tum to to Model非常简单,但是很难理解何时应该添加它。建立模型后,我们不会提前添加索引。索引:
当所有数据库查询中的使用率为10%-25%时
或当有真实数据时,或者可以正确估计使用索引后的效果确实令人满意
第四,请注意模型的继承。该模型的继承需要在Django中非常谨慎。Django提供了三种继承方法,1。Abstract Base类继承(请勿与Pyhton Standard库的ABC模块混合),2。Multi -Table(Multi -Table(Multi -Table(Multi -Table)模型继承。下表列出了这三个继承的优点和缺点:
Django的创建者和许多其他开发人员认为,多观看继承方法不是一个好方法。因此,我们强烈建议您不要使用此方法。以下是选择模型继承的一些常见方法:
如果只有少数模型重复了字段,则无需使用模型继承。您只需要将这些相同的字段添加到每个模型中。
如果您有足够的模型具有重复的字段,则大多数字段是由抽象基类继承的,并且将同一字段提取为抽象基类。
代理模型很少使用,与其他两个继承存在许多差异。
请不要使用多桌继承,因为它既消耗资源又消耗复杂。如果可以,请尝试使用OneTooneFields和Forefore。
在Django项目中,创建时间和修改时间的两个字段最有用。抽象基类继承的示例如下:
2. Django模型设计
如何设计良好的Django模型可能是最难,最复杂的话题。在这里,让我们看一些基本技能:
A。标准化
我们首先建议了解数据库归一化。如果您不知道这是什么,那么我们强烈建议您先阅读相关书籍,或搜索“关系数据库设计”或“数据库标准化”。在模型之前,应首先确保设计数据库。
b。缓存
正确使用缓存来帮助我们提高数据库的性能。详细信息,我们将在未来的文章中进一步介绍。
C.何时使用空和空白
在定义模型字段时,我们可以设置null = true和blank = true(默认值为false),知道何时设置null和空白对开发人员也非常重要。在以下表格中,我们如何列出一个,我们如何一个一个列出,我们如何一个一个列出。使用这两个选项:
D.何时使用binaryfield
在Django 1.6中,添加了二进制文件中的二进制数据(二进制数据或字节)。对于BinaryField,我们不能使用ORM的过滤器,不包括其他SQL操作。但是在少数情况下,我们将使用BinaryField,例如,MessagePack格式的内容,传感器接受的原始数据和压缩数据。但是应该注意的是,二进制数据通常非常大,因此可能会慢慢降低数据库。如果发生这种现象,我们可以存储文件中的二进制数据存储,然后使用文件字段存储文件的路径信息。
另外,请勿直接从BinaryField读取文件,并将其呈现给用户。因为,1。从数据库中读取和写作总是比文件系统慢;2.数据库备份将变得巨大,花更多的时间;它需要更多的时间; 3。获取文件的过程增加了此链接,从Django到数据库。
3.不要替换默认模型管理器
实际上,从ORM获得模型是通过Django的模型管理器完成的。Django为每个模型提供默认模型管理器。我们不建议替换它,因为::::
当使用模型继承时,模型将继承抽象基类模型的模型管理器,而无需继承非提交基类的经理。
Model的第一个模型管理器通常用作默认管理器。替换后,可能会出现不可预测的问题。
4.数据库事务(事务)
在Django 1.6中,每个数据库查询的ORM默认值是使用M.Create()或M.Update()时,每次timeIT都会简化对第一学者对ORM的理解的理解。但是缺点是,当一种视图包含两个数据库修改时,它可能会成功,但另一个视图可能会导致数据库不完整并带来很多危险。
解决此问题的方法是使用数据库事务。在即将到来的一系列数据库操作中,它包含在事务中。当其中一个失败时,其他操作将自动返回。Django 1.6为我们带来了一套新的简单简单简单的简单性。强大的交易机制使我们能够轻松地使用数据库事务。
A。将整个HTTP请求包装在交易中
Django为我们提供了一种简单的方法,可以将所有数据库操作包裹在交易中的HTTP请求中:
您只需要在数据库设置中添加'atomic_requests':TRUE选项,并且可以将整个HTTP请求包装在交易中。这样做的好处显然是安全的,但是劣势可能会下降。因此,我们必须采用更有针对性的交易。其次,应该注意的是,数据库的状态仅是数据库的状态,而不是其他数据库项目,例如发送电子邮件。因此,当涉及这些非数据库项目时,我们应该使用ittransaction.con_atomic_request()docoration()装饰(十年):
b。更清楚的交易控制
更清楚的是,交易控制意味着改善真实问题Web应用程序的性能,但这也意味着更多的开发时间。在大多数网站下,由于流量有限,Atomic_requests的使用就足够了。使用手动交易控制时,请注意:
不要进行数据修改的操作,应将其排除在交易之外
数据修改的操作应在交易中
在特殊情况下,您可以违反上述两个
应当指出的是,当视图返回django.http.streaminghttpresponse时,您应该将atomic_requests设置为false,或使用trassaction.non_atomic_requests修改视图。流由流触发的额外SQL查询将自动成为Django的Django Defaut Autocommit模式。
Django Makemification和Django迁移将确保必须存在Django管理的表。
(别忘了执行这两个管理命令,您可以使用Python Manage.py查看帮助)
如果它是外部表(托管= false),则可以使用SQL的SQL连接到查询表的SQL。
让我首先谈论前排条件
1.首先构建django环境win+r打开命令提示符pip安装django
3.然后创建一个自己的应用程序
同样,在命令提示符的路径上,输入新创建的项目所在的路径,输入python manage.py startapp xxx(这是指您要创建的名称),您可以看到创新的编辑器可以看到
4.正式开始开发邮政请求
首先在seetings.py文件中设置参数以对其进行修改,如图所示
Views.py
最后,在模板文件夹下创建一个HTML文件以简单地写下前端
我直接发布登录。html我在这里写的
代码部分是要完成效果
您也可以输入提琴手检查验证。为了找到更好的选择,我们首先打开提琴手,然后输入用户名密码。
你可以得到这样的包
用户名,密码的值也与我们输入的输入一致
在此处完成简单的帖子请求开发
我认为楼上的答案似乎有些问题。您可以验证我是否正确。
当查询GET时,当您无法查询内容时会引发异常,并且在结果过剩时会抛出异常。因此,不应使用过滤器,但应使用过滤器。
如果归档器找不到数据,它将返回一个空查询集,[]类型类型为:querySet。
当您发现额外的一个时,您将返回包含多个对象的查询集。
所有使用过滤器确定是否存在过滤器。
userInfo = user.objects.filter(email = request.post ['email'])
如果useinfo.exists():
打印(“是的,我们有这封电子邮件”)
别的:
打印(“对不起,电子邮件未注册”)
此外,您还可以使用count()方法。userInfo.count()= 0表示没有数据,如果您大于0,则有一个或多个部分。
楼上也有答案:如果urinfo:..................................................................
1. Django形式很强大
一些Django项目不会直接呈现HTML。第二个是API框架的形式,但您可能不会期望Django形成。Django形式不仅用于以这些API形式呈现HTML。最强的位置应该是其验证能力。让我们介绍几种与Django形式结合的模式:
2.模型1:ModelTelt和默认验证
最简单的模式是Modelform和Model中定义的默认验证方法的组合:
#myApp/views.py
来自django.views.gneric import createview,updateView
从括号。视图导入loginrequiredmixin
从.models导入文章
类ArticleCreateAteview(LoginRequiredMixin,CreateView):
型号=文章
fields =('title','slug','review_num')
class ArticleUpDateView(LoginRequiredMixin,UpdateView):
型号=文章
fields =('title','slug','review_num')
如您在上面的代码中所见:
ARTICLECREATEATEVIEW和ARTICEUPDATEVIEW设置模型作为文章
两者都可以根据文章模型自动生成模态
这些模型的验证基于文章模型中定义的字段转换
3.模式2,修改和验证模型
在上面的示例中,如果我们希望每个文章的开始都是“新”,那么我们该怎么办?首先,我们需要建立自定义验证(验证器):
#utils/valivator.py
来自django.core.corpeptions导入验证eRROR
def value_begins(value):
如果不是value.startswith(u'new'):
提高验证Error(u'must从new'开始)
可以看出,Django中的验证程序是不符合条件并抛出验证的功能。为了促进重复使用,我们将它们放入验证器中。
接下来,我们可以将这些验证器添加到模型中,但是为了方便变化和维护,我们更倾向于加入该模型:
#myApp/forms.py
从django导入表格
从utils.validators导入validate_begin
从.models导入文章
班级文章(forms.modelform):
dev __init __(self, *args,** kwargs):
Super(Artical Form,Self).__ Init __(8args,** kwargs)
self.fields [“ title”]。验证者。
元类:
型号=文章
Django的编辑视图(UpdateView和CreateView等)的默认行为基于为自动创建Modelform的模型属性。因此,我们需要调用自己的模型来涵盖自动创建:
#myApp/views.py
来自django.views.gneric import createview,updateView
从括号。视图导入loginrequiredmixin
从.models导入文章
来自.forms导入文章
类ArticleCreateAteview(LoginRequiredMixin,CreateView):
型号=文章
fields =('title','slug','review_num')
form_class = ArtistForm
class ArticleUpDateView(LoginRequiredMixin,UpdateView):
型号=文章
fields =('title','slug','review_num')
form_class = ArtistForm
4.模型三,使用form()和clear_field()方法
如果我们要以形式验证多个字段,或验证现有存在中涉及的数据,则需要使用clean()和clear_field()表单的方法。多种密码与password2相同2:
#myApp/forms.py
从django导入表格
类Myuserform(forms.form):
用户名= forms.charfield()
密码= forms.charfield()
passwass2 = forms.charfield()
def clean_password(self):
密码= self.clenet_data ['密码']
如果Len(密码)= 7:
提高表格。ValidationError(“密码不安全”)
返回密码
def Clean():
clear_data = super(myuserform,self).clean()
密码= clear_data.get('密码','')
passwass2 = clear_data.get('password2','')
如果密码!=密码2:
提高表格。ValidationError(“密码不匹配”)
返回clean_data
应当指出的是,在验证或修改后,必须将Clean()和Clean_field()()()的最后值返回到值。
5.模式4,Modelform中的自定义字段
我们经常以形式遇到默认验证。例如,模型中有许多不需要的项目,但是对于完整的信息,您希望必须填写这些字段:
#myApp/models.py
来自django.db导入模型
类Myuser(Models.Model):
用户名= models.charfield(max_length = 100)
密码= models.charfield(max_length = 100)
地址= models.textfield(空白= true)
phone = models.charfield(max_length = 100,空白= true)
为了满足上述要求,您可以直接添加字段以重写模型:
#请不要这样做
#myApp/forms.py
从django导入表格
来自.models导入myuser
类Myuserform(forms.modelform):
#请不要这样做
地址= forms.charfield(必需= true)
#请不要这样做
phone = forms.charfield(必需= true)
元类:
模型= Myuser
请不要这样做,因为这违反了“不重复”的原则,并且在许多复制和粘贴之后,代码将变得复杂且难以维护。正确的方法应该是使用__init __():
#myApp/forms.py
从django导入表格
来自.models导入myuser
类Myuserform(forms.modelform):
def __init __(self, *args,** kwarg):
super(myuserform,self).__ init __(*args,** kwargs)
self.fields ['address']。必需= true
self.fields ['Phone']。必需= true
元类:
模型= Myuser
值得注意的是,django形式也是Python类。该类可以继承并继承或动态修改。
Django的引入以及如何进行数据验证以及Django CSRFTKOON验证已经结束。我想知道您是否从中找到了所需的信息?如果您想进一步了解此信息,请记住要收集对该网站的关注。