Django视图、URL路由与表单验证详解

Theo
Theo
发布时间:2026-10-15| 3人浏览过
原创

本文深入解析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验证操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。