1. 视图简介
- 视图负责接收 web 请求并返回 web 响应。
- 视图就是一个 python 函数,被定义在 views.py 中。
- 响应可以是一张网页的 HTML 内容、一个重定向、一个 404 错误等等。
响应处理过程如下图:
- 用户在浏览器中输入网址:www.demo.com/1/100
- Django 获取网址信息,去除域名和端口后剩下 URI:1/100
- 按照 urlconf 中正则的配置顺序逐一匹配,一旦匹配成功,则调用对应的视图函数
- 调用对应的视图函数,接收 request 对象(及正则中获取的值),处理并返回 response 对象
2. URLconf
在项目目录下的 settings.py 中通过 ROOT_URLCONF 指定根级 url 的配置:
ROOT_URLCONF = 'ViewDemo.urls'
项目目录下的 urls.py 中的 urlpatterns 是一个包含 url() 实例的列表。一个 url() 对象包括:
- 正则表达式
- 视图函数
- 名称 name
1)关联各应用下的 URLconf
在应用中创建 urls.py,定义本应用中的 urlconf。如 hero_info 应用目录下的 urls.py:
urlpatterns = [url(r'^$', views.index, name='index'), # 正则匹配成功时访问index函数url(r'^([0-9]+)/$', views.detail, name='detail'), # 正则匹配成功时访问detail函数
]
再在项目的 urls.py 中使用 include() 关联对应应用的 urls.py:
urlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^hero_info/', include('hero_book.urls', namespace='hero_info')), # 关联hero_book包下的urls.py
]
使用 include 可以去除 urlconf 的冗余。
注意:django 2.0 起,urls 不支持正则表达式问题。如果需要使用正则,需要导入 re_path:
from django.urls import path, re_pathurlpatterns = [path('admin/', admin.site.urls),re_path(r'^test-(\d+)-(\d+)/', views.test),path('index/', views.index),
]
匹配过程
解析 web 请求地址时,先与主 URLconf 匹配,成功后再用剩余的部分与应用中的 URLconf 匹配。如下示例:
- 请求 http://www.demo.cn/hero_info/1/
- 匹配部分是 /hero_info/1/
- 在 settings.py 中与“hero_info/”匹配成功,再用“1/”与 hero_info 应用的 urls 匹配成功
2)URLconf 的编写
- url 的正则表达式不需要添加一个前导的反斜杠,如应该写作'hero_info/',而不应该写作'/hero_info/'。
- 每个正则表达式前面的 r 表示字符串不转义。
- 请求的 url 被看做是一个普通的 python 字符串,进行匹配时不包括 get 或 post 请求的参数及域名。
http://www.itcast.cn/python/1/?i=1&p=new # 只匹配“/python/1/”部分
- 若要从 url 中捕获一个值,则要使用正则中的分组。
- 优先使用命名参数,如果没有命名参数则使用位置参数。
- 每个捕获的参数都作为一个普通的 python 字符串传递给视图。
url(r'^([0-9]+)/$', views.detail, name='detail') # 通过位置参数传递给视图
url(r'^(?P<id>[0-9]+)/$', views.detail, name='detail') # 通过分组名称传递参数给视图函数,本例的参数名称为id
3)namespace 反向解析
在 include 中通过 namespace 定义命名空间,用于反向解析。
URL 的反向解析
问题:如果在视图、模板中使用硬编码的链接,在 urlconf 发生改变时,维护是一件非常麻烦的事情。
解决:在做链接时,通过指向 urlconf 中的 namespace 名称,动态生成链接地址。
- 视图:使用 django.core.urlresolvers.reverse() 函数。
- 模板:使用 url 模板标签。
3. 视图函数&错误视图
视图本质就是一个函数。在应用目录下默认有 views.py 文件,一般视图都定义在这个文件中。
视图的参数:
- 一个 HttpRequest 实例
- 通过正则表达式分组获取的位置参数或关键字参数
如果处理功能过多,可以将函数定义到不同的 py 文件中(但不建议)。示例:
# 新建views1.py
from django.http import HttpResponsedef index(request):return HttpResponse("你好")# 在urls.py中修改配置
from . import views1
url(r'^$', views1.index, name='index'),
错误视图
Django 原生自带了几个默认视图用于处理 HTTP 错误。
404 (page not found) 视图
- 默认的 404 视图将传递一个变量 request_path 给模板,它是导致错误的 url。
- 如果Django在检测URLconf中的每个正则表达式后没有找到匹配的内容时,将调用 404 视图。
- 如果在 settings.py 中 DEBUG 设置为 True,那么将永远不会调用 404 视图,而是显示 URLconf。 并带有一些调试信息。
1)在 templates 中创建 404.html:
2)编写 404.html:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{{request_path}}
<h1>Oops!该网页不存在..</h1>
</body>
</html>
3)在 settings.py 中修改两个配置:
DEBUG = False # 取消调试状态
ALLOWED_HOSTS = ['*', ] # 允许所有主机访问
4)访问不存在的地址: