一、概述
1. 作用:视图接受web请求,并响应web
2. 本质:视图就是一个python中的函数
3. 响应:
1. 网页
1. 重定向
2. 错误视图
1. 404:匹配url不成功报错
2. 500:服务器错误,比如get获取了多个值
3. 400
2. JSON数据
4. 过程:
1. 用户输入url网址
2. Django回去路由
3. url管理器逐个匹配urlconf,记录视图函数名
4. 视图管理器找到对应视图去执行,结果返回给浏览器
二、url配置
- 配置流程
- 指定根级url配置文件
- settings.py文件中ROOT_URLCONF
- 一般默认已经配置好了的
- urlpatterns
- 一个url实例的列表
- url对象
- 正则表达式
- 视图名称
- 名称,用作反向解析
- url匹配正则的注意事项
- 如果想要从url中获取一个值,需要对正则加小括号
- 匹配正则前方不需要加反斜杠
- 正则签需要加r表示字符串不转义
- 指定根级url配置文件
- 引入其他url配置
- 在应用中创建urls.py文件,定义本应用的url配置,在工程urls.py文件中使用include()方法
- include()中第二个参数namespace=应用名
- url的反向解析
- 概述:如果在视图、模板中使用了硬编码的链接,在url配置发生改变时,动态生成链接地址
- 解决:在使用链接时,通过url配置的名称,动态生成url地址
- 作用:使用url模板、视图函数重定向
二、视图函数
- 定义视图
- 本质:一个函数
- 视图参数:
- 一个HttpResponse的实例
- 通过正则表达式获取的参数
- 位置:一般在views.py文件下定义
- 错误视图
- 404视图:
- 在找不到网页(url匹配不成功)时返回
- 在templates目录下定义404.html
- request_path:导致错误的网址
- 配置settings.py
- DEBUG:如果为TRUE,永远不会调用404页面
- ALLOWED_HOSTS=[’*’]
- 500视图:在视图代码中出现错误(服务器代码)
- 400视图:错误出现在客户的操作
- 404视图:
三、HttpReques对象
- 概述:
- 服务器接受http请求后,会根据报文创建HttpRequest对象
- 视图的第一个参数就是HttpRequest对象
- Django创建的,之后调用视图时,传递给视图
- 属性
-
path:请求的完整路径(不包含域名和端口)
-
method:表示请求的方式,常用的有GET/POST
-
encoding:表示浏览器提交的数据的编码方式,一般为UTF-8
-
GET:类似字典的对象,包含了get请求的所有参数
def showregist(request): # request get参数 print(showregist) print('method:',request.method) print('path:',request.path) print('get内容:',request.GET) return render(request, 'regist/regist.html')
-
POST:类似字典的对象,包含了post请求的所有参数
def regist(request): # request POST参数 print(regist) print(request.GET) print(request.POST) print(request.path) print(request.method) print(request.COOKIES) print(request.FILES) print(request.META) print(request.user) print(request.session) print(request.body) print(request.POST['name']) print(request.POST['sex']) print(request.POST['age']) print(request.POST.getlist('hobby')) return HttpResponse('<h1>Regist Success</h1>')
-
FILES:类似字典的对象,包含了所有上传的文件
-
COOKIES:字典,包含所有的cookie
-
session:类似字典的对象,表示当前会话,默认已注册(‘django.contrib.sessions’,)
-
- 方法
- is_ajax()# django3.1后已经移除
- 如果是通过XMLHttpRequest发起的,返回True
- QueryDict对象
- request对象中的GET/POST都属于QueryDict对象
- 方法(127.0.0.1:8000/myApp?a=1&b=2&c=3)
- get():作用:根据键值获取值,智能获取一个值
- getlist():将键的值以列表的形式返回,可以获取多个值
- GET属性
- 获取浏览器传递给服务器的数据
- localhost:8000?a=1&a=2&b=3
- localhost:8000?a=1&b=2&c=3
- POST属性
-
使用表单提交实现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="sex" value="boy"/>男 <input type="radio" name="sex" value="girl"/>女 <hr/> 年龄:<input type="text" name="age" value=""/> <hr/> 爱好:<input type="checkbox" name="hobby" value="pingpang"/>乒乓 <input type="checkbox" name="hobby" value="yumaoqiu"/>羽毛球 其他:<input type="text" name="hobby" value=""/> <hr/> <input type="submit" value="注册"/> </form> </body> </html>
-
- is_ajax()# django3.1后已经移除
四、HttpResponse对象
-
概述
- 作用:给浏览器返回数据
- HTTPRequest对象是由django创建的,HTTPResponse由程序员创建
-
用法
- 不调用模板直接返回数据
- 调用模板,使用render方法
- 作用:结合数据和模板,返回完整的HTML页面
- 参数:
- request:请求体对象
- templateName:模板路径
- context:传递给需要渲染在模板上的数据
-
属性
- content:表示返回的内容
- charset:编码格式
- status_code:响应状态码:200,404, 304
- content-type:制定输出的MIME类型
-
方法
-
init:使用页面内容实例化HttpResponse对象
-
write(content):以文件的形式写入
-
flush()以文件的形式输出缓冲区,清空缓存
-
set_cookie(key,value=’’,max_age=None,exprise=None)# 设置缓存
def setcook(request): # 设置cookie print(setcook) res = HttpResponse() print(request.COOKIES) # 打印所有cookie try: key = request.GET['key'] value = request.GET['value'] res.set_cookie(key, value) except Exception as msg: print(msg) return res
-
delete_cookie(key):删除cookie,注意:如果删除一个不存在的key,就当什么都没发生
from django.contrib.auth import logout def quit(request): print(quit) res = HttpResponse() res.delete_cookie( 'a3') # request.session.clear() # request.session.flush() logout(request) return res
-
-
子类HttpResponseRedirect,重定向
-
功能:重定向,服务器端的一个跳转
-
编写:redirect(),括号里面写目标html,也可以写为反向解析名,url后面的name
from django.http import HttpResponse from django.shortcuts import render, redirect, reverse # Create your views here. def gcataa(request): # 重定向到name print(gcataa) # return HttpResponse('gcata') return redirect('showregist') def index(request): # 重定向到 app_name:name,或者namespace:name print(index) return redirect('aa:gcataaa') # return redirect('gcatae:gcataaa') def home(request): # 重定向到 url print(home) return redirect('/') def baidu(request): # 重定向到 url print(baidu) return redirect('https://www.baidu.com')
-
-
子类JsonResponse
- 返回json数据,一般用于一步请求
- –init–(self.data)
- data:字典对象
- 注意:content-type类型为application/json
五、状态保持
-
概述
- http协议是无状态的,每次请求都是新的请求
- 客户端与服务器的一次通信就是一次会话
- 实现状态保持,在客户端或者服务的存储有关会话的数据
- 存储方式
- cookie:一般不用,所有数据存在客户端,不要存敏感数据
- session,所有数据存储在服务端,在客户端用cookie存储session_id
- 状态保持的目的:在一段时间内跟踪请求值的状态,可以实现跨页面访问当前的请求者的数据
- 注意:不同的请求之间不会共享这个数据,与请求者是一一对应的
-
启用session
- settings.py文件中:
- INSTALL_APPS:‘django.contrib.sessions’,
- MIDDLEWARE: ‘django.contrib.sessions.middleware.SessionMiddleware’,
- settings.py文件中:
-
使用session
-
启用session后,每个HttpRequest对象都有一个session属性,就是一个类似字典的对象
-
get(key,default=None):根据键获取session值
-
clear():清空所有会话
-
flush():删除当前会话并删除会话的cookie
# session def main(request): print(main) username = request.session.get('username', '游客') # request.session.set_expiry(10) # 设置该session失效时间 return render(request, 'regist/main.html', {'username': username}) def login(request): print(login) # return redirect('/regist/main') return render(request, 'regist/login.html') def showmain(request): print(showmain) username = request.POST['username'] password = request.POST['password'] request.session['username'] = username request.session['password'] = password # request.session.set_expiry(10) # 设置该session失效时间 return redirect('/regist/main/') def quit(request): print(quit) request.session.clear() # request.session.flush() # logout(request) return redirect('main')
-
-
设置过期时间
- set_expiry(value)
- 如果不设置,两周后过期
- value是整数代表多少秒后过期
- value可以是时间对象
- value为0是关闭浏览器就失效
- value为None时永远不失效
-
存储session的位置
- 数据库:默认存在数据库中
- 缓存:只存在本地内存中,如果丢失不能找回,比数据库快(需要配置redis库)
- 数据库和缓存:优先从本地缓存中读取,读取不到再去数据库中获取
-
使用redis缓存session
-
pip install django-redis-sessions
-
配置settings.py
SESSION_ENGINE = 'redis_sessions.session' SESSION_REDIS_HOST = 'localhost' SESSION_REDIS_PORT = 6379 SESSION_REDIS_DB = 0 SESSION_REDIS_PASSWORD = '' SESSION_REDIS_PREFIX = 'session'
-
搭建redis环境
-
启动redis
-