View 视图2

View 视图

一、概述

  • 作用
    接收web请求返回web响应
  • 本质
    一个python函数
  • 请求
    客服端给服务端的数据
  • 响应
    类别很多
    重定向 404访问不到 报错后的消息 json数据

二、路由

1、概述与配置

路由称为route 是一种与视图的关系映射

路由是把客户端的请求应用程序进行一对一的绑定映射

注意:路由唯一性

2、配置

ROOT_URLCONF = 'day2django.urls'

默认配置好的

3、url进行重新分配

  • 目录层级
    project
    App
    urls.py
    project
    urls.py
    manage.py
    在应用App下创建urls.py
    在project下的urls里 使用include进行关联

  • App/urls.py
    from django.urls import path
    from . import views

    urlpatterns = [
        # 首页的路由配置
        path('index/', views.index),
    ]
    
  • project/urls.py
    from django.contrib import admin
    from django.urls import path, include

    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('App.urls')),
    ]
    
  • include

    • 导入
      from django.urls import path, include

    • 作用
      找到子路由模块

    • 参数

      • 子路由模块路径
      • 命名空间namespace(用于反向解析 动态构造路由地址)
    • 实例
      path('', include(('App.urls','App'), namespace='App')),

    • 多个子路由模块
      from django.contrib import admin
      from django.urls import path, include

      urlpatterns = [
          path('admin/', admin.site.urls),
          path('App/', include(('App.urls','App'), namespace='App')),
          path('App2/', include(('App2.urls','App2'), namespace='App2')),
      ]
      

      注意:如果说子路由前面添加了前缀 访问的时候 就要添加上
      http://127.0.0.1:8000/app/index/

三、视图

1、配置

  • 位置
    App/views.py 视图写在views.py文件中

  • 注意
    无论当前是否有参数 都必须有一个req参数 接受请求过来的对象

  • 路由
    对视图函数进行映射

  • 实例
    from django.shortcuts import render, HttpResponse

    # Create your views here.
    def index(request):
        return HttpResponse('index')
    
  • 路由方法
    匹配方式: 当django进行请求的时候 他会从 urlpattern进行依次匹配 直到匹配出匹配项 否则404

    • path 类似正则表达式 是一个匹配url的准则
    • re_path 正则匹配路由

2、路由方法

  • path
    参数

    • route 书写匹配url
    • view 当django匹配到了url 就会执行特定的视图函数
    • name 为url进行取名 目的是在任何位置 都能反向解析出当前路由地址
      实例
      path('index/', views.index, name='index'),
  • re_path
    参数

    • route 书写正则表达式的路由地址
    • view 当django匹配到了url 就会执行特定的视图函数
    • name 为url进行取名 目的是在任何位置 都能反向解析出当前路由地址
      re_path(r'^index2/$', views.index, name='index2'),
      完全匹配 如果不添加^$ 路由中包含index2就可以访问了
  • 注意
    一个视图函数可以存在多个路由地址
    from django.urls import path
    from django.urls import re_path

    from . import views
    
    urlpatterns = [
        # 首页的路由配置
        path(r'', views.index, name='index1'),
        path(r'index/', views.index, name='index2'),
        re_path(r'^index2/$', views.index, name='index3'),
    
    ]
    

3、定义视图

  • 无参视图
    路由地址
    path(r'', views.index, name='index1'),
    视图函数
    from django.shortcuts import render, HttpResponse

    # Create your views here.
    def index(request):
        print(request)
        return HttpResponse('index')
    
  • 带参数路由
    传递参数 视图函数需要接受参数

    • path
      # 不限定参数类型
      path(r'args///', views.args, name='args1'),
      # 限定参数类型为字符串和整数
      path(r'args/str:name/int:age/', views.args, name='args'),
      # 名字和视图函数参数对应的 不能随便写
      path(r'args/str:name/int:age1/', views.args, name='args'),
      # 作为了解 会认为name参数后面的所有 都为参数
      path(r'args/str:name/path:age/', views.args, name='args'),
    • re_path
      # 不起名称的传参
      re_path(r'args/(\w+)/(\d{2})/', views.args, name='args'),
      # 起名称的传参 名字和视图函数参数对应的 不能随便写
      re_path(r'^args/(?P\w+)/(?P\d{2})/$', views.args, name='args'),
      参数限定类型 如果类型不匹配则为404 参数匹配成功类型为str

4、限制请求类型

from django.shortcuts import render, HttpResponse
from django.views.decorators.http import require_http_methods


# Create your views here.

@require_http_methods(['POST'])
def index(request):
    print(request)
    return HttpResponse('index')

允许类型写在require_http_methods(['POST']) 列表里 只有写在里面的请求方式 才是允许的

如果不使用当前装饰器则为 允许所有请求类型

5、错误视图

  • 下面是常见的HTTP状态码:

    • 200 - 请求成功
    • 301 - 资源(网页等)被永久转移到其它URL
    • 404 - 请求的资源(网页等)不存在
    • 500 - 内部服务器错误
  • 配置模板路径
    settings.py
    TEMPLATES = [
    {
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(BASE_DIR, 'templates')]

  • 更改DEBUG
    settings.py
    DEBUG = False

    ALLOWED_HOSTS = ['*']
    
  • 目录层级
    project/
    App/
    project/
    templates/
    404.html
    500.html

  • 404模板定制
    在templates下创建404.html

  • 500模板定制
    在templates下创建500.html

四、请求对象request

1、概述与作用

  • 作用
    客户端给服务器端传递数据用的
  • 概述
    • 服务器端接受http协议请求以后 会根据请求创建出请求对象
    • 视图函数的第一个参数 为request
    • request保存客户端传递过来的数据

2、属性

  • path 请求的完整路径 不包含域名和端口
  • method 请求的方式
  • GET 类似字典对象 包含get请求的所有参数
  • POST 类似字典对象 包含post请求的所有参数
  • FILES 接受文件上传
  • COOKIES 一个包含了字典的所有cookie
  • session 包含了当前session值的对象 表示当前会话消息
  • META 包含了http请求的所有头信息

实例

# 测试请求对象
def test_req(req):
    print('path', req.path)
    print('method', req.method)
    print('GET',req.GET)
    print('POST', req.POST)
    print('FILES', req.FILES)
    print('COOKIES', req.COOKIES)
    print('session', req.session)
    print('META', req.META)
    print('META', req.META['HTTP_USER_AGENT'])
    return HttpResponse('请求对象')

3、方法

  • get_full_path() 获取完整请求
  • get_host() 请求的主机和端口
  • is_ajax() 是否为ajax请求

4、GET传参的方式

  • 方式
    • 通过路由进行传参
    • url拼接get传参
  • 实例
    • 通过路由进行传参 视图函数设置相关形参 直接打印形参可获得值
      path(r'args///', views.args, name='args1'),
      path(r'args/str:name/int:age/', views.args, name='args'),
      def test(req, name, age):
      return HttpResponse('请求对象')
      注意 需要在视图函数上进行接收
    • url拼接get传参 GET接收
      使用get方法接收
      在url地址中 使用?的形式进行拼接
      请求地址:127.0.0.1:8000?key=value&key=value.....
      def test(req):
      print(req.GET)
      return HttpResponse('请求对象')
      注意:key不要重名
  • get方法 (在url中直接设置键值对?key=value&key=value.....,通过get方法获取)
    请求地址:127.0.0.1:8000?key=value&key=value.....
    def test(req):
    print(req.GET.get('name'))
    print(req.GET.get('age'))
    print(req.GET.getlist('name'))
    return HttpResponse('请求对象')
  • getlist方法
    请求地址:127.0.0.1:8000?key=value&key=value.....
    def test(req):
    print(req.GET.getlist('name'))
    return HttpResponse('请求对象')
    可以接收同名的key的值 不会发生覆盖

5、POST方法

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>注册</h1>
<form action="" method="post">
    {% csrf_token %}
    <p>用户名:<input type="text" name="username"></p>
    <p>密码:<input type="text" name="userpass"></p>
    <p><input type="submit"></p>
</form>
</body>
</html>

views.py

def register(req):
    if req.method == 'POST':
        print(req.POST)
        return HttpResponse('数据提交过来了')
    return render(req, 'register.html')

五、响应对象 HttpResponse

1、概述与配置

  • 概述
    请求对象是由框架创建的 响应是由程序员来创建的
  • 配置
    from django.shortcuts import render, HttpResponse
    from django.template.loader import render_to_string
    from django.http import JsonResponse

2、使用

  • HttpResponse 直接返回响应内容
    def index(request):
    print(request)
    return HttpResponse('index')
  • render 渲染模板
    参数
    • req 请求对象
    • templates_name 模板名称
    • contenxt 传递给模板数据
    • status 状态码
      def register(req):
      if req.method == 'POST':
      print(req.POST)
      return HttpResponse('数据提交过来了')
      return render(req, 'register.html',{'info':'后台python数据'})
  • render_to_string 返回渲染后的字符串
    def index(request):
    # print(request)
    # raise ValueError
    data = render_to_string('register.html')
    print(data)
    return HttpResponse('index')
  • JsonResponse 返回json字符串(数据传输格式)
    def index(req):
    return JsonResponse({'name':'lucky'})

4、httpresponse属性

  • content 返回的数据

  • status_code 状态码

    def test_reponse(req):
    r = HttpResponse()
    r. content = '测试响应属性'
    r.status_code = 404
    return r

5、方法

  • set_cookie() 设置cookie
  • delete_cookie() 删除cookie

6、重定向 HttpResponseRedirect

  • 作用
    服务器间的跳转
  • 方法
    HttpResponseRedirect
    redirect(简写 推荐)
  • 导入
    from django.http import JsonResponse, HttpResponseRedirect
    from django.shortcuts import render, HttpResponse, redirect
  • 重定向
    路由地址
    from django.urls import path
    from . import views
    urlpatterns = [
    path('', views.index, name='index'),
    path('test_reponse/', views.test_reponse, name='test_reponse'),
    path('redirect_view/', views.redirect_view, name='redirect_view'),
    path('args//int:age/', views.args, name='args'),
    ]
    视图函数
    def test_reponse(req):
    r = HttpResponse()
    r. content = '测试响应属性'
    r.status_code = 404
    return r
    def args(req, name, age):
    return HttpResponse('返回多个参数')
    # 重定向视图函数
    def redirect_view(req):
    # return HttpResponse('测试重定向')
    return HttpResponseRedirect('/test_reponse/')
    return HttpResponseRedirect('/args/lucky/18/')
    return redirect('/test_reponse/')
    return redirect('/args/lucky/18/')

7、reverse 反向解析

  • 作用
    通过namespace以及path中name进行反向构造路由地址
  • 导入
    from django.urls import reverse
  • 构造路由地址
    # 路由构造视图函数
    def reverse_view(req):
    # 构造无参路由
    url = reverse("App:index")
    url = reverse("App:test_reponse")
    # 构造带参路由
    url = reverse('App:args', kwargs={'name':'lukcy','age':18})
    url = reverse('App:args', args=['lukcy',18])
    return HttpResponse(url)
  • 组合使用
    # 重定向视图函数
    def redirect_view(req):
    return redirect(reverse('App:args', kwargs={'name':'lukcy','age':18}))

六、会话控制COOKIE

1、概述

因为HTTP协议是无状态协议 每一次请求都是一次新的会话 所以出现了cookie和session 会话保持

会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份

2、值的存储

cookie存储在客户端 也就是浏览器上 一般会限制cookie的个数为20个 并且单个cookie的大小不能超过4kb 明文存储 不安全

3、设置cookie

  • 方法
    response.set_cookie()

  • 参数

    • key cookie的键
    • value cookie的值
    • max_age 最长使用时间(过期时间)
    • expires 过期时间 优先级高
    • path 生效的路径
    • secure HTTPS传输时设置为true
    • httponly 是否仅为http传输
  • 实例
    路由
    path('set_cookie/', test_cookie.set_cookie, name='set_cookie'),
    path('set_cookie_lifetime/', test_cookie.set_cookie_lifetime, name='set_cookie_lifetime'),
    视图
    # 设置cookie
    def set_cookie(req):
    res = HttpResponse('设置cookie')
    # 不设置过期时间 则为浏览会话结束时
    res.set_cookie('name', 'lucky')
    return res

    # 设置cookie并设置过期时间
    def set_cookie_lifetime(req):
        res = HttpResponse('设置cookie并设置过期时间')
        # 设置过期时间为2分钟
        res.set_cookie('name', 'lucky', max_age=120)
        return res
    
  • 可以设置key,{} 形式设置所有数据

4、获取cookie

  • 方法
    req.COOKIES
  • 格式
    req.COOKIES.get('key')
  • 实例
    路由
    path('look_cookie/', test_cookie.look_cookie, name='look_cookie'),
    视图
    # 查看cookie
    def look_cookie(req):
    # 获取cookie 并设置默认值
    res = req.COOKIES.get('name','default')
    return HttpResponse(res)

5、删除cookie

  • 方法
    delete_cookie()
  • 格式
    response.delete_cookie()
  • 实例
    路由
    path('delete_cookie/', test_cookie.delete_cookie, name='delete_cookie'),
    视图
    def delete_cookie(req):
    res = HttpResponse('删除cookie')
    res.delete_cookie('name')
    return res

七、会话控制session

1、概述

因为HTTp协议是无状态协议 每一次请求都是一次新的会话 所以出现了cookie和session 会话保持

会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份

2、值的存储

session基于cookie

session的值存储于服务器端 数据库/内存/redis/文件中

将sessionid存储在cookie中 也就是当前数据的钥匙

3、启用session(默认开启)

settings.py

INSTALLED_APPS = [
    'django.contrib.sessions',
]
MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
]

session开启后 req才会有session属性

4、session配置数据库

session默认存储在数据库中

  • 生成数据库表
    python manage.py migrate
  • 数据库配置
    DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'python36django',
    'HOST':'127.0.0.1',
    'PORT': 3306,
    'PASSWORD': '123456',
    'USER':'root',
    }
    }
  • 安装pymysql
    pip install pymysql
  • project/init.py
    import pymysql
    pymysql.install_as_MySQLdb()

5、设置session

  • 属性
    req.session[key] = value
  • 过期时间
    req.session.set_expiry(value)
    • inter 整数秒
    • 0 当前浏览会话结束时
    • None 依赖于全局过期时间
      settings.py
      SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
  • 实例
    路由
    path('set_session/', test_session.set_session, name='set_session'),
    path('set_session_lifetime/', test_session.set_session_lifetime, name='set_session_lifetime'),
    视图
    def set_session(req):
    # 默认过期时间为2周
    req.session['name'] = 'lucky'
    req.session['age'] = '18'
    return HttpResponse('设置session
    def set_session_lifetime(req):
    # 过期时间为0 浏览会话结束时
    req.session.set_expiry(0)
    # 设置session存活时间为1分钟
    req.session.set_expiry(60)
    req.session['name'] = 'lucky'
    req.session['age'] = '18'
    return HttpResponse('设置session并设置过期时间')

6、获取session

  • 方法
    req.session.get(key)
  • 实例
    def get_session(req):
    val = req.session.get('name', 'default')
    return HttpResponse('获取session---'+val)

7、删除session

方法:

  • pop() 通过key删除值
  • del req.session[key] 删除指定的key
  • clear() 清除当前用户的session数据
  • flush() 一般用于退出 清空session表中的数据
  • logout(req) 退出 清空session表中的数据
    from django.contrib.auth import logout
  • clear_expired() 清除过期的session

实例

def delete_session(req):
    req.session.pop('name')
    del req.session['name']
    req.session.clear()
    req.session.flush()
    logout(req)
    req.session.clear_expired()
    return HttpResponse('删除session')

8、存储位置

  • 默认存储在数据库中
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'
  • 存储在文件中
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'
    # 存储文件路径
    SESSION_FILE_PATH = '/home/xlg/桌面/session_cache'
  • 存储在内存中
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
  • 存储在内存与数据库中
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
    优先查找内存中 不存在则去数据库中
  • 缓存在redis中
    安装
    sudo pip install redis
    sudo pip install django-redis-sessions==0.5.6
    配置
    # 更改存储在redis中
    SESSION_ENGINE = 'redis_sessions.session'
    # 主机
    SESSION_REDIS_HOST = '127.0.0.1'
    # 端口
    SESSION_REDIS_PORT = '6379'
    # 数据库
    SESSION_REDIS_DB = 0
posted @ 2022-02-28 18:54  寻月隐君  阅读(34)  评论(0)    收藏  举报