Django视图、URL路由与表单验证详解
本文深入解析Django核心机制,涵盖视图函数的定义与响应类型、HttpRequest与HttpResponse对象详解。重点讲解URLconf路由配置、反向解析及多种传参方式(位置与关键字)。同时详细介绍Forms表单验证流程,包括CSRF保护、数据获取及自定义验证逻辑,帮助开发者构建稳健的Web应用。
Django视图基础与核心对象
简介视图
核心内容涉及URLconf配置、HttpRequest请求对象及HttpResponse响应对象。
视图的主要功能是接收Web请求并返回相应的Web响应。
视图本质上是一个Python函数,通常定义在项目的views.py文件中。
视图返回的响应内容可以是HTML网页、重定向指令或404错误页面等。
在处理HTTP请求时,Django会自动生成两个核心对象,它们位于django.http模块中。
HTTP请求对应的是HttpRequest对象。
HTTP响应对应的是HttpResponse对象。
这两个对象由Django框架自动构造,开发者无需手动创建。
URLconf路由配置与反向解析
URLconf相关概述
在settings.py文件中,通过ROOT_URLCONF参数指定根级URL配置模块。
urlpatterns是一个包含url()实例的列表,称为路由列表;其中的每个url()实例称为路由配置。
一个url()对象包含:正则表达式、视图函数、可选参数以及名称name。
匹配请求URL时,将其视为普通Python字符串,不包含GET或POST请求参数及域名部分。
字典Context={}用于封装上下文,在HTML页面需要参数时,将其作为render函数的第三个参数返回,例如context={'name':'lm'}。
在HTML模板语言中,注释格式为{#显示内容#};显示变量时使用{{name}}(注意:原文示例有语法错误,标准用法为{{name}},无需外层字典括号)。
for循环语法示例:
{% for num in b %},其中b为列表
{{num}}
{% endfor %}<br>
{% for key,value in c.items %},其中c为字典
{{key}}---->{{value}}
{% endfor %}<br>
{% if 条件 %}满足条件执行语句{% else %}不满足条件的语句{% endif %}
URL的反向解析(软链接)
若在视图或模板中使用硬编码链接,当urlconf发生变化时,维护工作将非常繁琐。
解决方案:在生成链接时,通过指向urlconf中配置的namespace和name,动态生成链接地址。
模板语言中路径表示格式为"{% url 'namespace:name' %}"。
在视图函数中,使用django.core.urlresolvers.reverse()函数进行反向解析。
在模板语言中,()和[]是非法字符,使用会导致报错。
主路由与子路由分发机制
路由配置
include方法将主路由匹配成功后剩余的路径分发给app内的子路由处理。它并非严格匹配,正则表达式没有结束符$。第一个参数指定分发到的路由配置文件,第二个参数namespace用于反向解析,作用与url()中的name参数类似。
主路由配置:指与settings.py同级目录下的urls.py文件中的urlpatterns。主路由作为调度分发工具,首页通常配置在主路由中。
子路由:将不同功能划分为不同的app模块(在app内配置urls.py文件),由主路由判断并分发至子路由操作。
主路由的urlpatterns中使用include进行子路由分发,例如url(r'^news/', include('news.urls', namespace="news")),其中news为应用模块名。
URL传参方式:位置与关键字
路径传参(位置和关键词):在模板语言中,大括号内格式为{% url 'news:news_date' 2018 4 20 %}。
未命名正则表达式组传参(位置传参):url(r'/(\d+)/(\d+)/(\d+)/$')。

视图函数如下

命名正则表达式组传参(关键字传参):视图函数中的参数顺序可以打乱。
url(r'/(?P<year>\d+)/(?P<mouth>\d+)/(?p<day>\d+)/$')

请求方式传参:模板语言传参格式为{% url 'news:news_date' %}?name=lm&a=5,这与URL路径无关。

Forms表单验证与CSRF保护
所有form表单提交均需经过forms验证,前端form表单需指定提交路径action="{% url 'users:user_register' %}"。
同时指定提交方式method="post"。
在user的app中创建forms.py文件,并填写验证条件。
from django import forms
from captcha.fields import CaptchaField
from .models import UserProfile,EmailVerify
class UserRegisterForm(forms.Form):
email = forms.EmailField(required=True,error_messages={
'required':'邮箱必须填写'
})
password = forms.CharField(min_length=3,max_length=20,required=True,error_messages={
'required': '密码必须填写',
'min_length':'密码最少得3个',
'max_length': '密码最多20个',
})
captcha = CaptchaField(error_messages={
'invalid':'验证码错误'
})
在views.py文件中处理逻辑。
from .forms import UserRegisterForm
def user_register(request):
if request.method == 'GET':
user_register_form = UserRegisterForm()
return render(request,'users/register.html',{
'user_register_form':user_register_form
})
else:
user_register_form = UserRegisterForm(request.POST)#进行验证
if user_register_form.is_valid():#判断是否合法
email = user_register_form.cleaned_data['email']#获取request数据
password = user_register_form.cleaned_data['password']
user = UserProfile.objects.filter(Q(email=email)|Q(username=email))
if user:
return render(request,'users/register.html',{
'msg':'用户已经存在'
})
else:
a = UserProfile()
a.username = email
a.email = email
a.set_password(password)#加密密码
a.si_active=False#设置密码未激活,需要邮箱验证激活
a.save()
else:
return render(request,'users/register.html',{
'user_register_form':user_register_form
})
获取参数使用:zhaoliying=request.GET.get('name',None)。GET类字典对象,若需获取同一键的多个值可使用getlist();若无参数则默认返回None。前端传输到后端的数据均为字符串类型。
CSRF跨站请求伪造攻击防护。在获取POST方式传递的参数时,需在form表单中加入{% csrf_token %}以消除错误。
HttpRequest对象属性详解
HttpReqeust对象
除非特别说明,以下属性均为只读且类型为字符串。
1)path:表示请求页面的完整路径字符串,不包含域名和请求参数。
2)method:表示请求使用的HTTP方法字符串,常用值包括'GET'、'POST'。
3)encoding:表示提交数据的编码方式字符串。
A)若为None,表示使用浏览器默认设置,一般为utf-8。
B)该属性可写,通过修改它可更改访问表单数据使用的编码,后续对属性的任何访问将使用新的encoding值。
4)GET:一个类似字典的QueryDict对象,包含GET请求方式的所有参数,对应url请求地址中?后面的键值对参数(如key1=value1),多个参数间使用&连接。获取参数使用:data = request.GET.get('键', 默认值)。
5)POST:一个类似字典的QueryDict对象,包含POST请求方式的所有参数。控件需具备name属性,其值为键,value属性的值为键值对中的值。获取参数使用:data = request.POST.get('键', 默认值)。
6)FILES:一个类似字典的对象,包含所有上传的文件。
7)COOKIES:一个标准的Python字典,包含所有cookie,键和值均为字符串。
8)session:一个既可读又可写的类似字典的对象,表示当前会话。仅当Django启用会话支持时可用,详细内容见“状态保持”。与Python字典不同,QueryDict类型的对象用于处理同一个键带有多个值的情况。
Cookie机制与操作
关于cookie的操作
1)Cookie(复数Cookies)指某些网站为辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于RFC2109和2965中的规范已废弃,最新取代的规范是RFC6265 [1](也可称为浏览器缓存)。
2)cookie是服务器设置并存储在浏览器的一段文本信息,例如用户登录时免输入密码。
以上这篇Django视图、传参和forms验证操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













