【Python高级编程案例】-第24课时-Python Django表单

一、内置标签及自定义

标签描述
"{% for %}"遍历输出上下文的内容
"{% if %}"对上下文进行条件判断
"{% csrf_token %}"生成csrf_token的标签,用于防护跨站请求伪造攻击
"{% url %}"引用路由配置的地址,生成相应的路由地址
"{% with %}"将上下文重新命名
"{% load %} "加载导入Django的标签库
"{% static %}"读取静态资源的文件内容
"{% extends x %}"模板的继承,x为被继承的HTML模板的文件名,当前模板继承xxx
"{% block xxx %}"重写父类模板的代码,xxx为父类位置所在的变量名

注:if标签和for、block、with标签使用都需要结束标签,比如{% endif %}、{% endfor %}等等。

二、Django的分页功能

 
# Django当中进行分页功能的设计,可以使用自带的三个库完成分页功能
from dajngo.core.paginator import Paginator,EmptyPage,PageNotInteger

1、其中Paginator类分别定义了4个初始化参数和8个类方法,其中必填项有:

  • object_list:必选参数,代表需要进行分页处理的数据,参数值可以为列表、元组或ORM查询的数据对象等。
  • per_page:必选参数,设置每一页的数据量,参数值必须为整数。

2、其中EmptyPage功能为如果页码不在有效范围(即数据为空)引发该异常。

3、其中PageNotInteger功能为页码不是一个整数引发该异常。

Ps:Any类型在Python当中代表不限制给定的值,可以是列表、字典等等。其中Python自带的locals()函数代表将当前定义域下的所有变量保存为字典。

三、Session的配置及操作

​ 一般请求会在浏览器请求服务器完成之后,便会断开连接(会话结束),下次用户再来请求服务器,服务器就无法识别此用户是谁。比如用户的登录功能,如果刷新页面就会重新要求登录一次才能识别到用户。这样非常的影响用户体验,同时会对开发者带来大量的繁琐工作,同时对服务器的压力也非常大。

​ Cookie是从浏览器向服务器传递数据,让服务器能够识别当前用户,而服务器对Cookie的识别机制是通过Session来实现的,Session储存了用户的基本信息。由于Cookie是存储在浏览器当中,非常容易泄露用户信息,而且Cookie的大小不能超过4KB,不能支持中文,因此需要一种机制在服务器当中存储用户的数据,这个机制就是Session。

​ Cookie和Session都是为了让浏览器和服务端建立长久的联系的会话而出现的,两者的关系说明如下:

  • Session存储在服务器端,Cookie存储在客户端,所以Session的安全性比Cookie高。
  • 当获取某用户的Session数据时,首先从用户传递的Cookie里获取sessionid,然后根据sessionid在服务器当中找到对应的Session。
  • Session存放在服务器的内存中,Session数据的不断增加会造成服务器的负担,因此存放在Session当中的数据不能过于庞大。

四、CSRF防护

​ CSRF(跨站请求伪造)也被称为One Click Attack或者Session Riding,通常缩写为CSRF或者XSRF,这是一种对网站的恶意运用,其目的是为了是为了窃取网站用户的用户信息来制造恶意请求。

​ Django为了防护这一类攻击,在用户提交表单的时候,表单会自动加入csrfmiddlewaretoken隐藏控件,这个隐藏控件的值会与网站后台的csrfmiddlewaretoken进行匹配,只有匹配成功,网站才会处理表单数据。这种防护机制称为CSRF防护。

​ 如果表单当中设置了CSRF防护功能,我们可以查看表单的值,隐藏控件是由模板语法{% csrf_token %}生成的。用户每次提交表单或者刷新网页时,隐藏控件的属性value都会随之变化。

​ 如果想要取消表单的CSRF防护,那么可以在模板文件删除{% csrf_token %},并且在对应视图函数中添加装饰器@csrf_exempt。如果只在模板文件中删除CSRF,并没有在对应的视图函数当中设置过滤器@csrf_exempt,那么用户提交表单时,程序会因为CSRF验证失败而抛出403异常页面。

五、请求的方式

​ 一般情况下使用最常见的方式就是POST和GET方法,POST和GET都能携带参数,参数为:www.xxx.com?(?符号代表将域名和传递的参数值进行隔开)key=value的形式进行传递,参数与参数之间使用“&”进行隔开。实际开发当中POST请求一般用于更改数据库之中的数据,换言之任何更改数据库的的请求都应该用到POST请求而不是GET。GET只用于不会影响系统数据(不会更改数据库数据)的请求。

​ 原因就是:GET请求的参数值在URL当中,而POST请求的值并不在URL当中。所以从安全角度POST请求更加好,但是在开发当中也要注意应对不同的要求合理使用请求的方式。

六、Django的表单类

​ 如果我们搭建的网站只发布内容不接受用户的输入,那么就不需要表单。换言之如果你需要用户输入数据进行交互,那么就需要用到表单进行实现。

1、html表单

​ 在前端html代码之中,

.....

括起来的内容就是表单,它允许我们输入文本、数据选择、操作对象,然后将这些数据通过POST请求转发给服务器,也就是说我们编写Django操作表单需要制定两点:数据的URL地址、数据请求时使用的方法。

 
<form action="表单提交地址" method="提交方法">
… 文本框、按钮等表单元素…
</form>
2、Django在表单当中的角色

​ 处理表单是一个非常复杂的业务流程,在Django当中可以简化以上内容,提高开发效率:

  • 1.准备重组数据,以便下一步的渲染。
  • 2.为数据创建HTML表单。
  • 3.接受并处理客户端提交的表单及数据。
3、构建一张表单
3.1表单类

根目录下生成forms.py,django中表单内容:

 
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label='your name', max_length=100)

每个form实例都有is_valid()方法,如果用户输入了内容,则返回True且将表单数据存储在属性cleaned_data中。

3.2视图

Django网站的表单数据会交给后台的视图(views.py)来处理,为了处理表单数据,我们需要将它实例化到我们需要的URL之中。

 
from django.http import HttpResponseRedirect
from django.shortcuts import render
froms .form import NameForm
def get_name(request):
if request.method == 'POST'
# 如果这个表单请求是POST,我们需要处理数据
form = NameForm(request.POST)
if form.is_valid() # 检查界面是否输入了表单数据。
# 表单数据存储在form.cleaned_data之中
return HttpResponseRedirect('/thanks/') #需要返回的界面,输入该界面的URL地址
else:
# 如果不是POST请求,将创建一个空表单。
form = NameForm()
return render(request, 'name.html', {'form':form})
3.3模板

其中{{ form }}中的form是get_name()里的变量form = NameForm(),把定义的这个表单类传入到界面:

 
<form action='/you-name/', method='post'> <!-- action是请求的地址,method是请求的方式 -->
{{ csrf_token }}
{{ form}}
<input type='submit' value='Submit'>
</form>
4、详解Django表单的类

只需要将表单实例放在表单模板当中即可,例如上面的NameForm()的实例form,传入表单模板name.html之中。

 
else:
# 如果不是POST请求将创建一个空的表单
form = NameForm()
return render(reuqest, 'name.html', {'form':form})# 这一行form字段的功能是将实例form传递给模板name.html,方便模板文件调用{{ form }}
4.1表单的渲染选项

表单界面是以什么样的形式展现,分为三种表格、段落、列表呈现。

  • {{ form.as_table }} 将它们呈现为包含在标签中的表格单元格
  • {{ form.as_p }} 将他们包裹在

    标签当中

  • {{ form.as_ul }} 将他们包裹在
  • 标签当中
 
<form action="/your-name/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit">
</form>
<form action="/your-name/" method="post">
{% csrf_token %}
{{ form.as_table }}
<input type="submit" value="Submit">
</form>
<form action="/your-name/" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit">
</form>
<form action="/your-name/" method="post">
{% csrf_token %}
{{ form.as_ul }}
<input type="submit" value="Submit">
</form>
4.2 遍历表单字段

如果要给每个字段使用相同的html控件,则使用{% for %}依次循环处理

 
{% for field in form %}
<div class='fieldWrapper'>
{{ field.errors }}
{{ field.label_tag }}{{ field }}
{% if field.help_text %}
<p class='help'>{{ field.help_text|safe }}</p>
{% endif %}
</div>
{% endfor %}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青少年编程作品集

你的赞赏将带来极佳的运气和才气

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值