django学习笔记(七)-----视图

一、概念(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'
原文地址:https://www.cnblogs.com/llb123/p/13398715.html