本文为 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)