视图
一、概念(views.py中)
1、作用:视图接受web请求,并响应web请求
2、本质:视图就是python中的函数
3、响应的内容:
(1)网页
- 重定向
- 错误视图----404,500,400
(2)JSON数据
4、响应过程
二、url配置
1、配置流程
(1)指定根级(根的级别)url配置文件
一般不用修改,默认实现
project/settings.py文件中的ROOT_URLCONF = 'project.urls'
(2)urlpatterns----firstapp/urls.py文件
- 一个url实例的列表
- path对象
(3)urls.py文件
一般情况下,一个URL,我们是这样写的:
urlpatterns = [
path(正则表达式, views视图函数,参数,别名),
]
参数说明:
(1)、一个正则表达式字符串
(2)、一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
(3)、可选的要传递给视图函数的默认参数(字典形式)
(4)、一个可选的name参数(别名)
- 要从URL捕获值,请使用尖括号。
- 捕获的值可以选择性地包括转换器类型。例如,使用
<int:name>
捕获整数参数。如果不包括转换器,则匹配除a/字符之外的任何字符串。path('grades/<int:num>',views.gradesStudents),
- 不需要添加前导斜杠,因为每个URL都有前导斜杠。例如,它是文章,而不是/文章。因为在project/urls.py文件中添加了
path('firstapp/', include('firstapp.urls')),
"firstapp/"后面添加了斜杠,所以在firstapp/urls.py中,路径前面不加斜杠,并且输入网址以http://localhost:8000/firstapp/
开头
例如:
2、引入其他url配置
方便不同项目之间进行管理
- 在应用中创建urls.py文件,定义本应用的url配置,在整体的工程中可以有多个项目比如secondapp,thirdapp,fourthapp,等等。
- 每引入一个项目,就在project/urls.py里面包含自己的,然后在自己这个项目的url.py文件,匹配自己的url配置
- project/urls.py只有一个
- 可以有多个项目firatapp/urls.py,secondapp/urls.py,thirdapp/urls.py,fourthapp/urls.py
比如:
在projecturls.py文件中path后面添加
path('firstapp/', include('firstapp.urls')),#自定义
#可以是path('secondapp/', include('secondapp.urls')),等等
下面是自己项目里需要的虚拟路径
3、URL的反向解析
(1)概述:如果在视图,模板中使用了硬编码链接,在url配置发生改变时,动态生成链接的地址
(2)解决:在使用链接时,通过url配置的名称,动态生成url地址
(3)作用:使用url模板
三、视图函数
1、定义视图
- 本质:一个函数
- 视图参数:第一个参数request,一个HttpRequest的实例 ;第二个参数,通过正则表达式获取的参数
- 位置----一般在views.py文件下定义
2、错误视图
- 500视图----在视图代码(服务器代码)中出现错误
- 400视图----错误出现在客户操作
- 404视图----在找不到网页(url匹配不成功)时返回
(1)可以自己定义,在templates目录下定义404.html----request_path----导致你错误的网址
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404页面</title>
</head>
<hody>
<h1>页面丢失</h1>
<h2>{{request_path}}</h2>
</hody>
</html>
(2)配置settings.py
DEBUG = True
(调试)如果为True,永远不会调用404.html页面ALLOWED_HOSTS = []
#默认是[],需要时自定义ALLOWED_HOSTS = ['*']
#任何人都可以访问
四、HttpRequest对象
下面的request,可以写成别的(req),不影响
def index(request):
#return HttpResponse("Hello, world. You're at the polls index.")
1、概述
- 服务器接收http请求后,会根据报文创建一个HttpRequest对象
- 视图的第一个参数就是HttpRequest对象
- django创建的,之后调用视图时,传递给视图
2、HttpRequest对象 属性
(1)path----请求的完整路径(不包括域名和端口)
(2)method----表示请求的方式,常用的有GET,POST
(3)encoding----表示浏览器提交的数据的编码方式,一般是utf-8
(4)GET(大写)----类似字典的对象,包含了get请求的所有参数
(5)POST(大写)----类似字典的对象,包含了post请求的所有参数
(6)FILES(大写)(files)----类似字典的对象,包含了所有上传的文件
(7)COOKIES(大写)(cookies)----字典,包含所有的cookie
(8)session----类似字典的对象,表示当前会话
(4),(5),(6),(7)大写才是属性,小写不是
3、方法
is_ajax()
如果是通过XMLHttpResquest发起的,返回True
4、QueryDict对象
(1)request对象中的get,post都属于QueryDict对象
(2)方法:(小写)
- get()
作用:根据键获取值,只能获取一个值,
www.sunck.wang/abc?a=1&b=2&c=3 - getlist()
将键的值以列表的形式返回,可以获取多个值
www.sunck.wang/abc?a=1&a=2&c=3,有两个a
5、GET属性
目的:获取浏览器传递过来给服务器的数据
http://localhost:8000/firstapp/get1?a=1&b=2&c=3
1、(1)在firstapp/views.py文件下,添加下面代码
GET
是HttpRequest对象的属性,
get()
是QueryDict对象的方法,根据键获取值,只能获取一个值
#获取get传递的数据
def get1(request):
a=request.GET.get('a')#GET是HttpRequest对象的属性,get()是QueryDict对象的方法
b=request.GET.get('b')
c=request.GET.get('c')
return HttpResponse(a+" "+b+" "+c)
(2)在firstapp/urls.py文件下,添加一条路径
path('get1/',views.get1),
(3)输入网址http://localhost:8000/firstapp/get1?a=1&b=2&c=3
得到如下图
http://localhost:8000/firstapp/get2?a=1&a=2&c=3
2、(1)在在firstapp/views.py文件下,添加下面代码
GET
是HttpRequest对象的属性,
getlist()
是QueryDict对象的方法,根据键获取值,可以获取多个值
def get2(request):
a=request.GET.getlist('a')
a1=a[0]
a2=a[1]
c=request.GET.get('c')
return HttpResponse(a1+" "+a2+" "+c)
(2)在firstapp/urls.py文件下,添加一条路径
path('get2/',views.get2),
(3)输入网址http://localhost:8000/firstapp/get2?a=1&a=2&c=3
得到如下图
6、POST属性
1、使用表单提交实现POST请求
(1)、在templates/firstapp文件下,添加register.html文件(注册),
<input type="radio"name="gender"values=“1”/>,,,,name=“gender”,标签name传的键值是gender,其他的一样
#register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<hody>
<form action="register/"method="post">
姓名:<input type="text"name="name"values=""/>
<hr/>
性别:<input type="radio"name="gender"values="1"/>男<input type="radio"name="gender"values="0"/>女<hr/>
<hr/>
年龄:<input type="text"name="age"values=""/>
<hr/>
爱好:<input type="checkbox"name="hobby"values="power"/>权力<input type="checkbox"name="hobby"values="money"/>金钱<input type="checkbox"name="hobby"values="boy"/>帅哥<input type="checkbox"name="hobby"values="girl"/>美女
<hr/>
<input type="submit"value="注册"/>
</form>
</hody>
</html>
(2)、在firstapp/views.py里面添加下面代码
#POST
def showregister(request):
return render(request,'firstapp/register.html')
def register(request):
return HttpResponse('********akakak')
(3)、在firstapp/urls.py里面添加路径
path('showregister/',views.showregister),
path('showregister/register/',views.register),
(4)、输入网址http://localhost:8000/firstapp/showregister/
,得到如下图
(5)、输入网址localhost:8000/firstapp/showregister/register/
,得到如下图,返回的东西,在第2步,中在firstapp/views.py里面定义的register函数返回值********akakak
2、出现错误403,关闭csrf,没有错误直接跳过,看3
在project/settings.py里面这一行注释掉
3、
在firstapp/views.py里面修改register()函数
def showregister(request):
return render(request,'firstapp/register.html')
def register(request):
name=request.POST.get('name')
gender=request.POST.get('gender')
age=request.POST.get('age')
hobby=request.POST.getlist('hobby')#复选框,用getlist
print(name)
print(gender)
print(age)
print(hobby)
return HttpResponse('post')
五、HttpResponse对象
1、概述
- 作用:给浏览器返回数据
- HttpRequest对象由django创建的,HttpResponse对象由程序员创建
2、返回数据用法
(1) 不调用模板,直接返回数据
def register(request):
return HttpResponse('********akakak')
(2) 调用模板----使用render方法
- 原型---->render(request,templateName[,context])
- 作用---->结合数据和模板,返回完整的HTML页面
- 参数
1)request 请求体对象
2)templateName 模板路径
3)context 传递给需要渲染在模板上的数据 - 示例
def showregister(request):
return render(request,'firstapp/register.html')
3、属性
- content 表示返回的是内容
- chartset 编码格式
- atatus_code 响应状态码----200,304,404
- content-type 指定输出的MIME类型
#在firstapp/views.py里面
#response
def showresponse(request):
res=HttpResponse()
res.content=b'good'
print(res.content)
print(res.charset)
print(res.status_code)
return res
#在firstapp/urls.py里面
path('showresponse/',views.showresponse),
4、方法
- int 使用页面的内容实例化HttpResponse对象
- write(content) 以文件的形式写入
- filsh() 以文件的形式输出缓冲区
- set_cookie(key,value=’’,maxAge=None,exprise=None)
- delete_cookie(key) 删除cookie,如果要删除一个不存在的key,就当什么都没发生
#cookie,在firstapp/views.py
def cookietest(request):
res=HttpResponse()
cookie=res.set_cookie("sunck","good")
return res
#在firstapp/urls.py里面
path('cookietest/',views.cookietest),
输入网址http://localhost:8000/firstapp/cookietest/
5、子类TttpResponseRedirect
TttpResponseRedirect是HttpResponse对象的子类
- 功能:重定向,服务器端的一个跳转,访问的是一个视图,执行的是另一个视图
from django.http import HttpResponseRedirect
return HttpResponseRedirect('/firstapp/redirect2')
- 简写:redirect(to)
from django.shortcuts import redirect
return redirect('/firstapp/redirect2')
- 上面的to推荐使用反向解析
(1)重定向
#重定向,在firstapp/views.py
from django.http import HttpResponseRedirect
def redirect1(request):
return HttpResponseRedirect('/firstapp/redirect2')#注意这里是/firstapp/redirect2,前面的/firstapp进入project/urls.py------>path('firstapp/', include('firstapp.urls')),----然后/redirect2进入到firstapp/urls.py
#firstapp前面没有/,就会直接跳到/redirect2,出错
def redirect2(request):
return HttpResponse("我是重定向后的视图")
在firstapp/urls.py里面
path('redirect1/',views.redirect1),
path('redirect2/',views.redirect2),
输入网址http://localhost:8000/firstapp/redirect1/
会自动跳转到http://localhost:8000/firstapp/redirect2/
,如下图
如果上面的firstapp/views.py里面,路径是/redirect2
def redirect1(request):
return HttpResponseRedirect('/redirect2')
输入网址http://localhost:8000/firstapp/redirect1/
会自动跳转到http://localhost:8000/redirect2/
,然后出错
(2)简写重定向
#重定向,在firstapp/views.py
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
def redirect1(request):
return redirect('/firstapp/redirect2')
def redirect2(request):
return HttpResponse("我是重定向后的视图")
6、子类JsonResponse
JsonResponse是HttpResponse对象的子类
- 返回json数据,一般用于异步请求
__init__(self,data)
from django.http import HttpResponseRedirect,JsonResponse
- data:字典
- 注意:Content-type类型为application/json
六、状态保持
1、概述
- http协议是无状态的,每次请求都是一次新的请求,不记得以前的请求
- 客户端与服务器端的一次通信就是一次会话
- 实现状态的保持,在客户端(cookie中)或者是服务端存储有关会话的数据
- 存储的方式
cookie---->所有的数据都存在客户端,不要存储敏感的数据,不安全,数据量小
session---->所有的数据存储在服务端,在客户端用cookie存储session_id - 状态保持的目的:在一段时间内,跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
- 注意:不同的请求者之间不会共享这个数据,与请求者是一一对应的
2、启用session
在settings.py文件中,一般是启用的,不用管,没启用,需要启用下
(1)INSTALLED_APPS----'django.contrib.sessions',
(2)MIDDLEWARE----'django.contrib.sessions.middleware.SessionMiddleware',
3、使用session
- 启用session后,每个HttpRequest对象都有一个session属性----就是一个类似字典的对象
- request.session.get(key,default=None)----根据键获取session值,找不到键返回后面的default默认值
- request.session.clear()----清空所有的会话
- request.session.flush()----删除当前的会话,并删除会话的cookie
(1)未登录---->登录---->返回我的界面
未登录,在templates/firstapp/main.py(我的)
#第九行,路径是点击登陆后要转的路径,href="/firstapp/login"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我的</title>
</head>
<hody>
<h1>欢迎:游客</h1>
<a href="/firstapp/login">登录</a>
</hody>
</html>
登录,在templates/firstapp/login.py
#第八行,路径是点击登陆后要转的路径,action="/firstapp/showmain/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<hody>
<form action="/firstapp/showmain/" method="post">
<input type="text",name="username"/>
<input type="submit"value="登录">
</form>
</hody>
</html>
在firstapp/views.py里面
#session
from django.shortcuts import redirect
def main(request):
return render(request,'firstapp/main.html')
def login(request):
return render(request,'firstapp/login.html')
def showmain(request):
#重定向到main函数
return redirect('/firstapp/main')
在firstapp/urls.py里面
path('main/',views.main),
path('login/',views.login),
path('showmain/',views.showmain),
输入网址http://localhost:8000/firstapp/main/
点击登录
再点击登录
(2)在templates/firstapp/login.py
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>我的</title>
</head>
<hody>
<h1>欢迎:{{username}}</h1>
<a href="/firstapp/login">登录</a>
<a href="/firstapp/quit">退出登录</a>
</hody>
</html>
在firstapp/views.py里面
#session
def main(request):
#取下session
username=request.session.get('name',"游客")
print(username)
return render(request,'firstapp/main.html',{'username':username})
def login(request):
return render(request,'firstapp/login.html')
def showmain(request):
username =request.POST.get("username")
#存储session
request.session['name']=username
request.session.set_expiry(10)#十秒钟之后过期
#request.session.clear()
return redirect('/firstapp/main')
from django.contrib.auth import logout
def quit(request):
#清除session
logout(request)
#request.session.clear()
#request.session.flush()
return redirect('/firstapp/main')
在firstapp/urls.py里面
path('main/',views.main),
path('login/',views.login),
path('showmain/',views.showmain),
path('quit/',views.quit),
4、设置过期时间
- request.session.set_expiry(value)
- 如果不设置两个星期后过期
- 整数----request.session.set_expiry(10)#十秒钟之后过期
- 时间对象
- 0----关闭浏览器时失效
- None----永不过期
5、存储session的位置
-
数据库----默认缓存在数据库中
-
缓存----只存储在本地内存中,如果丢失不能找回,比数据库快
SESSION_ENGINE='django.contrib.session.backends.cache'
-
数据库和缓存----优先从本地缓存中存取,读取不到再从数据库中获取
SESSION_ENGINE='django.contrib.session.backends.cached_db'
6、使用redis缓存session
在D:programpython3python(2)目录下输入pip install django-redis-sessions安装,下面的是安装成功
安装在C:UsersDELLAppDataLocalProgramsPythonPython37Libsite-packages
project/settings.py
SESSION_ENGINE='redis_sessions.session'
SESSION_REDIS_HOST='localhost'
SESSION_REDIS_PORT=3306
SESSION_REDIS_DB=0
SESSION_REDIS_PASSWORD='123456'
SESSION_REDIS_PREFIX='session'