View 视图

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不要重名
      key重名的
  • 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')
posted @ 2022-02-28 18:51  寻月隐君  阅读(42)  评论(0)    收藏  举报