【Django】视图

本文为 Django 学习笔记的讲解。

运行环境

  • Windows 10
  • Pycharm Community Edition 2020.1.3
  • Django 3.0.8

所有的代码见【Django】系列

概述

视图的作用是接收并响应 web 请求,其本质是一个 python 中的函数。视图可以对网页和 JSON 数据进行响应,其中网页包括重定向和错误视图(如 404,500, 400);JSON 数据是网页中发出 Ajax 请求的问题。

其响应过程如图:

在这里插入图片描述

url 配置

配置流程

首先制定根级 url 配置文件,在 settings,py 中的 ROOT_URLCONF = 'project.urls',一般默认实现无需修改。

urlpatterns

urlpatterns 是一个 url 实例的列表,里面存 url 对象,实例化时传三个参数,分别为:正则表达式,视图名称,名称(使用反向解析,后面会讲到),include() 表示从下个文件中找视图名称。

urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
    re_path(r'^', include('myApp.urls')),
]

url 匹配正则的注意事项

如果想从 url 中获取一个值,则需要对正则加小括号,例如在 Django 模板基本操作中,我们通过 (\d+) 获得班级序号。我们通常会在匹配正则最后加反斜杠,则匹配正则前无需重复加反斜杠。正则前加 r 表示字符串不进行转义。

引入其他 url 配置

我们一般在应用中创建 urls.py 文件,定义本应用的 url 配置。因为整个工程不止一个项目,如果全写在 project 下的 urls.py 中,则不方便应用的管理。因此我们需要在 project/urls.py 中使用 include 方法:

from django.contrib import admin
from django.urls import re_path, include

urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
    re_path(r'^', include('myApp.urls', namespace="myApp")), # 反向代理
]
from django.urls import re_path
from . import views
# app_name = 'myApp' # 要加app_name才能使用反向代理
urlpatterns = [
    re_path(r'^$', views.index, name="index"), # 反向代理
]

匹配过程见 Django 模板基本操作

URL 的反向解析

如果在视图、模板中使用了硬编码的链接。如点击首页的 a,则生成 url 跳转到下一个页面:

<body>
    <h1>Mike is a good man</h1>
    <a href="first/second">a</a>
</body>

在这里插入图片描述

下个页面路径,如果我们匹配了路径 first/second 则会响应新的页面:

在这里插入图片描述

但当我们修改了 project/urls.py 中的 url 时,我们需要重新写应用中的所有 url 路径,工作量极大。我们可以使用方向解析/代理来解决这个问题,上面代码中的 namespace 的作用就是在 url 配置改变时,动态生成链接的地址。使用 url 模板时经常使用。

视图函数

定义视图

视图的本质在 Django 视图基本操作中已经讲过,就是一个函数。函数的第一个参数是一个 HttpRequest 的实例,是由浏览器发送过来的,浏览器发来的信息全部存在里面,通常写为 request (形参想叫什么都可以)。后面的参数为正则表达式获取的参数。一般将视图放在 views.py 文件下定义。

错误视图

404 视图

找不到网页(即 url 匹配不成功)时返回。404 视图是相对于整个工程的视图,因此需要在 templates 下定义 404.html,且文件名必须为 404。无需配置 url。

<head>
    <meta charset="UTF-8">
    <title>404页面</title>
</head>
<body>
    <h1>页面丢失</h1>
    <h2>{
  {request_path}}</h2> <!--request_path为导致错误的网址-->
</body>

想要展示 404 页面,我们还需要配置 settings.py 文件:

DEBUG = False # 如果为True则永远无法调用404

ALLOWED_HOSTS = ['*'] # 允许访问,'*'为任何人可访问

得到结果:

在这里插入图片描述

500 视图

在视图代码中出现错误(服务器代码出错)

400 视图

错误出现在客户操作,如网络爬虫或用户操作修改 cookies。

HttpRequest

概述

服务器接收 http 请求后,Django 会根据报文创建 HttpRequest 对象,在之后调用视图时传递给视图,视图的第一个参数就是 HttpRequest 对象。

属性

以下属性都是字符串形式

  • path:请求的完整路径,不包括域名和端口

  • method:请求的方式,常用的有 GET、POST

  • encoding:表示浏览器提交数据的编码方式,可设置,一般为 utf-8。例如使用 google chrome 打开 www.baidu.com 并按 f12,点击 Network 找到 www.baidu.com 中的 Request Header,就可以找到 Accept-Encoding 字段:

    在这里插入图片描述

  • GET:类似字典的对象,包含了 get 请求的所有参数:

    在这里插入图片描述

  • POST:类似字典的对象,包含了 post 请求的所有参数。

  • FILES:类似字典的对象,包含了所有上传的文件(文件数据)。

  • COOKIES:字典,包含所有的 cookie

  • session:类似字典的对象,表示当前会话

我们可以打印查看以上的这些值:

def attribles(request):
    print(request.path)
    print(request.method)
    print(request.encoding)
    print(request.GET)
    print(request.POST)
    print(request.FILES)
    
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值