Django框架提升(2)~视图

------------- 视图------------

概述:

作用:视图接受web请求,并相应web请求
本质:视图就是一个python函数
响应:-网页 -重定向

           -错误视图  -404
                      -500
      -JSON数据
过程:用户在浏览器输入网址--【网址】-->django获取网址信息(去除ip和端口)--【虚拟路径与文件名】->url管理器(逐个匹配urlconf配置)
      记录视图函数名--【视图函数名】->视图管理器(找到对应得视图去执行)返回结果给浏览器

url配置:

  • 配置流程:

       1.指定根级url配置文件(在settings.py中:ROOT_URLOCONF)默认实现了:ROOT_URLCONF = 'project.urls'
          2.urlpatterns  :一个url实例得列表即url对象,有3个参数 (正则表达式,视图名称,名称)
    
  • url匹配正则得注意事项:

      1.如果想要重url中获取一个值,需要对正则加小括号
      2.匹配正则前方不需要加反斜杠“/”
      3.正则前要加r,表示字符串不转义
    
  • 引入其他url配置

      1.在应用中创建urls.py文件,定义本应用的url配置,在工程urls.py文件中使用include()方法
          from django.contrib import admin
          from django.urls import path,re_path,include
    
          urlpatterns = [
              path('admin/', admin.site.urls),
              re_path(r'^',include('myApp.urls'))#"/"默认自动加上了
          ]
      2.匹配过程
    
      1. re_path(r'^students/$',views.students),
      2. views.py中配置相应得视图函数
    
  • url的反向解析

       概念:如果在视图、模板中使用了硬编码链接,在url配置发生改变时,动态生成链接的地址
                  在project.urls.py:
                   re_path(r'^',include('myApp.urls',namespace="myApp")), #django3.0版本有问题
                  在myApp.urls.py:
                   re_path(r'^students/$',views.students,name="students"),
              思路:在使用链接时,通过url配置的第三个参数:“名称”,动态生成url地址
      
              作用:使用Url模板
    

视图函数:

  • 定义视图

      本质:一个函数
              视图参数:request(一个HTTPRequest的示例)
                       通过正则表达式获取的参数
              位置:一般在views.py文件下定义
    
  • 错误视图:

      500视图:在视图代码中出现错误(服务器代码)
      400视图:错误出现在客户操作中
      404视图:在找不到网页时返回(url匹配不成功)
          1.在templates目录下定义404.html
              request_path : 导致错误的网址
    
          2.配置settings.py
              DEBUG = False  #如果为true永远不会调用404页面
              ALLOWED_HOSTS = ['*'] #允许所有人访问
    

HTTPRequest对象:(获取浏览器传给服务器的数据)

  • 概述:

      1.服务器接受http请求后会根据报文(数据流)创建HTTPRequest对象,传递给
              视图的第一个参数就是HTTPRequest
      2.django创建的,之后调用视图时传递给视图
    
  • 属性:

       path:请求的完整路径(不包括域名和端口)
              method:表示请求得方式,常用的:GET  \ POST
              encoding:表示浏览器提交的数据编码方式,一般为utf-8
              GET: 类似字典的对象,包含了get请求的所有参数
              POST:类似字典的对象,包含了post请求的所有参数
              FILSE:类似字典的对象,包含了所有上传的文件
              COOKIES:字典,包含所有的cookie
              session:类似字典的对象,表示当前的会话
    
  • 方法:

      is_ajax() 如果是通过XMLHttpRequest发起的,返回True
    
  • QueryDict对象:

      request中的GET,POST都属于QueryDict对象
              方法:
                  1.get() 作用:根据键获取值。只能获取一个值
                      www.luciano.wang/abc?a=1&b=2
                  2.getlist() 作用:将键的值以列表的形式返回。可以获取多个值
                      www.luciano.wang/abc?a=1&a=1&b=2
    
  • GET属性

      获取浏览器传递过来给服务器的数据
          http://127.0.0.1:8000/luciano/get1?a=1&b=2&c=3
    
def get1(request):
                a= request.GET.get('a')
                b = request.GET.get('b')
                c = request.GET.get('c')
                return HttpResponse(a+b+c)
	http://127.0.0.1:8000/luciano/get2?a=1&a=2&c=3
def get2(request):
                a = request.GET.getlist('a') #getlist返回的是一个列表
                a1 = a[0]
                a2 = a[1]
                c = request.GET.get('c')
                return HttpResponse(a1,a2,c)
  • POST属性:

      使用表单提交实现post请求
    
def showregist(request):
                return render(request,'myApp/regist.html')

            def regist(request):
                name = request.POST.get("sname")  #键值是html中标签的name属性值
                gender = request.POST.get("gender")
                age = request.POST.get("age")
                hobby = request.POST.getlist("hobby")
                print(name,gender,age,hobby)
                return HttpResponse('adasd')

  • 解决CSRF问题:settings.py中:
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对象:

  • 概述:

     作用:给浏览器返回数据
         httprequest对象是django创建的,而httpResponse对象是是由程序员创建
          返回的用法:
         -不调用模板,直接返回数据
             return HttpResponse('adasd')
         -调用模板
             使用render()方法
                 原型:
                     render(request,templateName[,context])
                 作用:
                     结合数据和模板返回一个完整的HTML页面
                 参数:
                     request 请求体对象
                     templateName  模板路径
                     context 传递给需要渲染在模板上的数据
                 示例:
                     return render(request,'myApp/regist.html')
                     方法:
         init    使用页面内容示例化httpresponse对象
         write(content)  以文件的形式写入
         flush() 以文件的形式输出缓冲区
         set_cookie(key,value="",max_age=None)   设置cookie
             示例:res.set_cookie("luciano","good")
         delete_cookie(key)  删除cookie
                             注意:如果删除一个不存在的key就相当于什么没发生
    
     子类HttpResponseRedirect
         功能:
             1.重定向,服务器端的跳转
         简写:redirect(to)  to推荐使用反向解析
            ----------------
             from django.http import HttpResponseRedirect
             from django.shortcuts import redirect
    
             def redirect1(request):
                 # return HttpResponseRedirect('/luciano/redirect2')
                 return redirect('/luciano/redirect2')
    
             def redirect2(request):
                 return HttpResponse("我是重定向后的视图")
          ----------------
    
    
     子类JsonResponse
         返回json数据,一般用于异步请求(ajex)
         __init__(self,data)
             data:字典对象
             注意:content-type类型为application/json
    

    状态保持:

    http协议是无状态的,每次请求都是一次新的请求,不记得以前的请求
    客户端与服务端的一次通信就是一次通话
    实现状态的保持,在客户端或者服务端存储有关会话的数据

  • 存储方式:

      1.cookie
              所有的数据都存在客户端,不要存敏感的数据
          2.session(推荐)
              所有的数据都存在服务器,在客户端用cookie存储session_id
      状态保持的目的:
          在一段时间内跟踪请求者的状态,可以实现跨页面访问当前的请求者的数据
      注意:不同的请求者之间不会共享这个数据,与请求者是一一对应的
    
  • 启用session

    • settings.py文件中( 默认启用)
      INSTALLED_APPS =   [ 'django.contrib.sessions',]
            MIDDLEWARE =[    'django.contrib.sessions.middleware.SessionMiddleware',]
  • 使用session

      启动session后每个httpRequest对象都有一个session属性,就是一个类似字典的对象 (request.session)
          存储session数据:
              request.session['key']=value
          方法:
              获取session值:
               get(key,default=None)  根据key 获取 session值
              删除session
               1.clear()    清空所有的会话
               2.flush()    删除当前的会话,并删除会话的cookie
               3.from django.contrib.auth import logout
                 logout(request)
    
  • 实例

  #获取浏览器form表单中标签name属性为username的值
                    username = request.POST.get('username')
                    #存储session
                    request.session['name']=username
                     #取session
                    username = request.session.get("name","游客")
                     #清除session 三种方式
                    logout(request)
                    # request.session.flush()
                    # request.session.clear()
设置过期时间(如果不设置两个星期自动失效)
        set_expiry(value)
            -整数
                request.session.set_expiry(10)
            -时间对象
            -0 关闭浏览器时失效
            -None 永不过期

    存储session的位置
        数据库:默认存储在数据库中


    使用redis缓存session
        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'
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值