django视图

一、概述

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配置

  1. 配置流程
    1. 指定根级url配置文件
      1. settings.py文件中ROOT_URLCONF
      2. 一般默认已经配置好了的
    2. urlpatterns
      1. 一个url实例的列表
      2. url对象
        1. 正则表达式
        2. 视图名称
        3. 名称,用作反向解析
    3. url匹配正则的注意事项
      1. 如果想要从url中获取一个值,需要对正则加小括号
      2. 匹配正则前方不需要加反斜杠
      3. 正则签需要加r表示字符串不转义
  2. 引入其他url配置
    1. 在应用中创建urls.py文件,定义本应用的url配置,在工程urls.py文件中使用include()方法
    2. include()中第二个参数namespace=应用名
  3. url的反向解析
    1. 概述:如果在视图、模板中使用了硬编码的链接,在url配置发生改变时,动态生成链接地址
    2. 解决:在使用链接时,通过url配置的名称,动态生成url地址
    3. 作用:使用url模板、视图函数重定向

二、视图函数

  1. 定义视图
    1. 本质:一个函数
    2. 视图参数:
      1. 一个HttpResponse的实例
      2. 通过正则表达式获取的参数
    3. 位置:一般在views.py文件下定义
  2. 错误视图
    1. 404视图:
      1. 在找不到网页(url匹配不成功)时返回
      2. 在templates目录下定义404.html
        1. request_path:导致错误的网址
      3. 配置settings.py
        1. DEBUG:如果为TRUE,永远不会调用404页面
        2. ALLOWED_HOSTS=[’*’]
    2. 500视图:在视图代码中出现错误(服务器代码)
    3. 400视图:错误出现在客户的操作

三、HttpReques对象

  1. 概述:
    1. 服务器接受http请求后,会根据报文创建HttpRequest对象
    2. 视图的第一个参数就是HttpRequest对象
    3. Django创建的,之后调用视图时,传递给视图
  2. 属性
    1. path:请求的完整路径(不包含域名和端口)

    2. method:表示请求的方式,常用的有GET/POST

    3. encoding:表示浏览器提交的数据的编码方式,一般为UTF-8

    4. 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')
      
    5. 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>')
      
    6. FILES:类似字典的对象,包含了所有上传的文件

    7. COOKIES:字典,包含所有的cookie

    8. session:类似字典的对象,表示当前会话,默认已注册(‘django.contrib.sessions’,)

  3. 方法
    1. is_ajax()# django3.1后已经移除
      1. 如果是通过XMLHttpRequest发起的,返回True
    2. QueryDict对象
      1. request对象中的GET/POST都属于QueryDict对象
      2. 方法(127.0.0.1:8000/myApp?a=1&b=2&c=3)
        1. get():作用:根据键值获取值,智能获取一个值
        2. getlist():将键的值以列表的形式返回,可以获取多个值
    3. GET属性
      1. 获取浏览器传递给服务器的数据
      2. localhost:8000?a=1&a=2&b=3
      3. localhost:8000?a=1&b=2&c=3
    4. POST属性
      1. 使用表单提交实现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>
        

四、HttpResponse对象

  1. 概述

    1. 作用:给浏览器返回数据
    2. HTTPRequest对象是由django创建的,HTTPResponse由程序员创建
  2. 用法

    1. 不调用模板直接返回数据
    2. 调用模板,使用render方法
      1. 作用:结合数据和模板,返回完整的HTML页面
      2. 参数:
        1. request:请求体对象
        2. templateName:模板路径
        3. context:传递给需要渲染在模板上的数据
  3. 属性

    1. content:表示返回的内容
    2. charset:编码格式
    3. status_code:响应状态码:200,404, 304
    4. content-type:制定输出的MIME类型
  4. 方法

    1. init:使用页面内容实例化HttpResponse对象

    2. write(content):以文件的形式写入

    3. flush()以文件的形式输出缓冲区,清空缓存

    4. 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
      
    5. 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
      
  5. 子类HttpResponseRedirect,重定向

    1. 功能:重定向,服务器端的一个跳转

    2. 编写: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')
      
      
  6. 子类JsonResponse

    1. 返回json数据,一般用于一步请求
    2. –init–(self.data)
    3. data:字典对象
    4. 注意:content-type类型为application/json

五、状态保持

  1. 概述

    1. http协议是无状态的,每次请求都是新的请求
    2. 客户端与服务器的一次通信就是一次会话
    3. 实现状态保持,在客户端或者服务的存储有关会话的数据
    4. 存储方式
      1. cookie:一般不用,所有数据存在客户端,不要存敏感数据
      2. session,所有数据存储在服务端,在客户端用cookie存储session_id
    5. 状态保持的目的:在一段时间内跟踪请求值的状态,可以实现跨页面访问当前的请求者的数据
    6. 注意:不同的请求之间不会共享这个数据,与请求者是一一对应的
  2. 启用session

    1. settings.py文件中:
      1. INSTALL_APPS:‘django.contrib.sessions’,
      2. MIDDLEWARE: ‘django.contrib.sessions.middleware.SessionMiddleware’,
  3. 使用session

    1. 启用session后,每个HttpRequest对象都有一个session属性,就是一个类似字典的对象

    2. get(key,default=None):根据键获取session值

    3. clear():清空所有会话

    4. 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')
      
  4. 设置过期时间

    1. set_expiry(value)
    2. 如果不设置,两周后过期
    3. value是整数代表多少秒后过期
    4. value可以是时间对象
    5. value为0是关闭浏览器就失效
    6. value为None时永远不失效
  5. 存储session的位置

    1. 数据库:默认存在数据库中
    2. 缓存:只存在本地内存中,如果丢失不能找回,比数据库快(需要配置redis库)
    3. 数据库和缓存:优先从本地缓存中读取,读取不到再去数据库中获取
  6. 使用redis缓存session

    1. pip install django-redis-sessions

    2. 配置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'
      
    3. 搭建redis环境

    4. 启动redis

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值