Django中视图介绍
一,概述
1. 作用
视图接受web请求,并响应web请求
2. 本质
视图就是Python中的函数
3. 响应类型
- 网页
- 重定向
- 错误视图:404错误,500错误
- JSON数据
4. 响应过程
- 用户在浏览器输入网址
- Django获取网址信息,去除IP地址与端口号
- 逐个匹配URL配置,
- 匹配成功,执行对应的视图函数
- 匹配失败,报404错误
- 视图管理器找到对应的视图执行,返回结果给浏览器
二,URL配置
1. 配置流程
- 指定根级URL配置文件
\Django\MyDjango\project\project\settings.py 中的
ROOT_URLCONF = 'project.urls'
- \Django\MyDjango\project\project\urls.py 文件,urlpatterns是URL的实例的列表,传入URL对象
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^',include('MyApp.urls')),
]
1. URL对象包括:正则表达式,视图名称,名称
- URL匹配正则的注意事项
- 如果需要从URL中获取一个值,需要对值的正则加小括号
- 匹配正则开始网址不需要加反斜杠,因为在\Django\MyDjango\project\project\urls.py 文件 或 \Django\MyDjango\project\project\settings.py 文件中已经添加反斜杠
- 正则表达式外面需要加r,表示字符串不转义
- 例如:\Django\MyDjango\project\project\settings.py
2. 引入其他URL配置
- 在应用中创建urls.py ,定义本应用的URL配置,在工程urls.py 文件中使用include() 方法
- 示例代码
# \Django\MyDjango\project\project\urls.py 文件配置
from django.contrib import admin
from django.urls import path,include
from django.conf.urls import url
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^',include('MyApp.urls',namespace="MyApp")),
]
# \Django\MyDjango\project\MyApp\urls.py 文件配置
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$',views.index),
url(r'^(\d+)/(\d+)$',views.detail),
url(r"^Grades/$",views.Grades)
]
3. URL的反向解析
- 概述:如果在视图、模板中使用了硬编码链接,在URL配置发生改变时,动态生成链接的地址
- 解决:在使用链接时,通过URL配置的名称,动态生成URL地址
- 作用:使用URL模板
三,视图函数
1. 定义视图
- 本质:是一个Python函数
- 视图参数
- 一个HTTPRequest的实例
- 通过正则表达式获取的参数
- 位置:\Django\MyDjango\project\MyApp\views.py 中定义
2. 错误视图
- 404视图
- 找不到网页时返回(URL匹配不成功)
- 定义路径:\Django\MyDjango\project\templates\404.html
- 定义内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404页面</title>
</head>
<body>
<h1>页面丢失</h1>
<h2>{
{
request__path}}</h2> # 导致错误的网址
</body>
</html>
4. 配置settings.py
# DEBUG为True,不会调用404.html页面
DEBUG = False
# 允许访问的host
ALLOWED_HOSTS = ["*"]
5.
- 500视图:在视图代码中出现错误(服务器代码)
- 400视图:错误出现在客户端的操作
四,HttpRequest 对象
1. 概述
- 服务器接收 http 请求后,Django会根据报文创建 HttpRequest 对象,视图的第一个参数就是 HttpRequest 对象,之后调用视图时传递给视图
2. 属性
- path
请求的完整路径(不包括域名和端口号) - method
请求方式,get,post - encoding
表示浏览器提交数据的编码方式,一般为 utf-8 - GET
类似字典的对象,包含了get请求的所有参数 - POST
类似字典的对象,包含了post请求的所有参数 - FILES
类似字典的对象,包含了所有上传的文件 - COOKIES
字典,包含所有的cookie - SESSION
类似字典的对象,表示当前会话
3. 方法
- is_ajax()
如果是通过 XMLHttpRequest 发起的,返回True
4. QueryDict 对象
- 概述:request 对象中的 GET,POST 都属于 QueryDict 对象
- 方法
- get() 作用:根据键获取值,只能获取一个值
- get() 示例:www.baidu.com/abc?a=1&b=2&c=3
- getlist() 作用:将键的值以列表的形式返回,可以获取多个值
- getlist() 示例:www.baidu.com/abc?a=1&a=2&c=3
5. GET属性
1. 一个属性获取一个值
- \Django\MyDjango\project\MyApp\views.py 文件增加以下代码
# 获取GET传递的数据
def GetOneAttribles(request):
AttributeA = request.GET.get("a")
AttributeB = request.GET.get("b")
AttributeC = request.GET.get("c")
Sum = int(AttributeA) + int(AttributeB) + int(AttributeC)
#return HttpResponse(AttributeA + " " + AttributeB + " " + AttributeC)
return HttpResponse(Sum)
- 配置APP中的url信息
- 访问地址:http://127.0.0.1:8000/GetOneAttribles/?a=1&b=2&c=3
2. 一个属性获取多个值
- \Django\MyDjango\project\MyApp\views.py 文件增加以下代码
# 获取GET传递的数据
def GetMultipleAttribles(request):
AttributeAList = request.GET.getlist("a")
a1 = AttributeAList[0]
a2 = AttributeAList[1]
AttributeC = request.GET.get("c")
return HttpResponse(a1 + "" + a2 + "" + AttributeC)
- 配置APP中的url信息
- 访问地址:http://127.0.0.1:8000/GetOneAttribles/?a=1&a=3&c=3
6. POST属性
- \Django\MyDjango\project\MyApp\urls.py 文件中增加路由信息
url(r"^ShowRegist/$",views.ShowRegist),
url(r"^ShowRegist/Regist/$", views.Regist),
- \Django\MyDjango\project\MyApp\views.py 在增加请求方法
# 获取POST传递的值
def ShowRegist(request):
return render(request,"MyApp/Regist.html")
def Regist(request):
Name = request.POST.get("name")
Gender = request.POST.get("gender")
Age = request.POST.get("age")
Hobby = request.POST.getlist("hobby")
print("Name:%s,Gender:%s,Age:%s,Hobby:%s"%(Name,Gender,Age,Hobby))
return HttpResponse("POST请求成功")
- 模板中增加注册页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="Regist/" method="post">
姓名:<input type="text" name="name" value=""/>
<hr/>
性别:<input type="radio" name="gender" value="1"/>男<input type="radio" name="gender" value="0"/>女
<hr/>
年龄:<input type="text" name="age" value=""/>
<hr/>
爱好:<input type="checkbox" name="hobby" value="power"/>权利<input type="checkbox" name="hobby" value="money"/>金钱<input type="checkbox" name="hobby" value="girl"/>美女
<hr/>
<input type="submit" value="注册">
</form>
</body>
</html>
- \Django\MyDjango\project\project\settings.py 中间件将CSRF行代码注释
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
- 浏览器访问页面填写表单,并点击注册按钮,即可打印输出注册信息,后续可以使用模型对象,连接数据库保存
五,HttpResponse 对象
1. 概述
- 作用:给浏览器返回数据
- HttpRequest对象是由Django创建的,HttpResponse对象是由程序员创建的
2. 返回用法
1. 不调用模板,直接返回数据
- 代码如下
def Regist(request):
Name = request.POST.get("name")
Gender = request.POST.get("gender")
Age = request.POST.get("age")
Hobby = request.POST.getlist("hobby")
print("Name:%s,Gender:%s,Age:%s,Hobby:%s"%(Name,Gender,Age,Hobby))
return HttpResponse("POST请求成功")
- 效果如下图
2. 调用模板,使用 render() 方法
- 原型:render(request,templateName[,context])
- 作用:结合数据和模板,返回完整的HTML页面
- 参数
- request:请求体对象
- templateName:模板路径
- 传递给需要渲染在模板上的数据
- 示例
# 查询年龄大于30或小于20的学生列表
from django.db.models import Q
def GetAgeGTThrityOrLTTwentyOfStudent(request):
StudentsList = Student.StudentObj2.filter(Q(studentAge__gt=30)|Q(studentAge__lt=20))
return render(request, 'MyApp/students.html', {
"studentsHtml": StudentsList})