zoukankan      html  css  js  c++  java
  • 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'
  • 相关阅读:
    集合、序列、字典
    测验2: Python基础语法(上) (第4周)
    geckodriver问题
    转:Loadrunner添加服务器监控
    转:JMeter监控内存及CPU ——plugin插件监控被测系统资源方法
    星号三角形
    天天向上的力量 III
    平方值格式化
    同符号数学运算
    JMeter 连接MySQL
  • 原文地址:https://www.cnblogs.com/llb123/p/13398715.html
Copyright © 2011-2022 走看看