视图接受Web 请求并且返回 Web 响应
视图就是一个python 函数,被定义在 views.py 中
响应可以是一张网页的 HTML 内容,一个重定向,一个 404 错误等等
URLconf
在Django框架中,提供了非常清晰简洁的url管理方法
在项目文件夹下settings.py 文件中通过ROOT_URLCONF 指定根级 url 的配置
新建一个Django project之后,在项目文件夹urls.py中的urlpatterns列表中来配置 url,
每一个列表项就是一个由url函数的调用。
urlpatterns 是一个 url 实例的列表
django 的 url 配置有效的降低了后台和页面的耦合度
url()方法
def url(regex, view, kwargs=None, name=None)
o regex :正则表达式
o view:视图函数
o name: 名称
o name 用来唯一区分一个视图对应多个 urlconf 的场景
o kwargs: 就是一个字典类型的参数
o url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}, "arch-summary"),
o 视图函数中使用:
def index(reqeust):
booklist = BookInfo.books.all()
return render(reqeust, 'booktest/index.html', {'req':reqeust,'booklist': booklist})
功能:凡是与regex 匹配的 URL 请求都会执行到 url()函数中对应的第二个参数 view 代
表的视图函数。
模板链接中使用
<a href="detail/{{book.id}}/">{{ book.btitle }}</a>
<a href=" {{book.id}}/">{{ book.btitle }}</a>
编写URLconf 的注意:
o 不需要添加一个前导的反斜杠,如应该写作'booktest/',而不应该写作'/booktest/',否
则意味着从根目录匹配
o 表单action 的 url 除外,要有前导的反斜杠
o 每个正则表达式前面的 r 表示字符串不转义
请求的url 被看做是一个普通的 python 字符串,进行匹配时不包括 get 或 post 请求的
参数及域名
http://www.qikuedu.com/python/1/?i=1&p=new,只匹配“python/1/”部分
性能:urlpatterns 中的每个正则表达式在第一次访问它们时被编译,这使得系统相当快
包含其它的URLconfs
include方法
假设我们在booktest 模块中定义了一个 index 页面,想通过
"http://localhost:8000/booktest/index"来访问
- 首先我们在 view.py 中定义index 函数:
def index(reqeust):
booklist = BookInfo.books.all()
return render(reqeust, 'booktest/index.html', {'booklist': booklist}) - 然后在应用的 urls.py 的 urlpatterns 列表中添加一个 url 配置:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/$', views.index),
]
然后运行:通过"http://localhost:8000/booktest/index"来访问
新的问题:但假如一个 project 中有多个 app,用以上的方式来管理 url 可能会造成比较
混乱的局面
为了解决这个问题,我们可以用 include 的方法来配置 url
include(arg, namespace=None)
参数1:包含booktest 应用的urlconf
参数2:定义命名空间,用于反解析
命名空间(英语:Namespace)是表示标识符的可见范围。
一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。
这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,
因为已有的定义都处于其它命名空间中。
多个urlconf的使用
-
在应用中创建 urls.py 文件,定义本应用中的 urlconf
-
再在项目的url.py 中使用 include() 包含应用 app 的 urlconf
from django.conf.urls import include, url
urlpatterns = [
url(r'^', include('booktest.urls', namespace='booktest')),# 包含booktest 应用的
urlconf
]
匹配过程:先与主 URLconf 匹配,成功后再用剩余的部分与应用中的 URLconf 匹配
请求http://127.0.0.1:8000/booktest/1/
在项目urls.py中的配置:
url(r'^booktest/', include('booktest.urls', namespace='booktest')),
url(r'^([0-9]+)/$', views.detail, name='detail'),
匹配部分是:1/
匹配过程:用“1/”与 booktest 应用的urls 匹配
使用include 可以去除 urlconf 的冗余
视图参数的传递
正则表达式非命名分组,通过位置参数传递给视图
url(r'^([0-9]+)/$', views.detail, name='detail'),
正则表达式命名分组,通过关键字参数传递给视图,本例中关键字参数为 id
url(r'^(?P<id>[0-9]+)/$', views.detail, name='detail'),
参数匹配规则:优先使用命名参数,如果没有命名参数则使用位置参数
每个捕获的参数都作为一个普通的 python 字符串传递给视图
若要从url 中捕获一个值,需要在它周围设置一对圆括号
参数:视图会收到来自父 URLconf、当前URLconf 捕获的所有参数
URL的反向解析
问题:如果在视图、模板中使用硬编码的链接,在 urlconf 发生改变时,维护非常麻烦
解决:通过指向urlconf 的名称,根据正则表达式动态生成链接地址
视图:使用django.urls.reverse()函数
from django.urls import reverse
from django.http import HttpResponseRedirect
def test(reqeust, id):
url name 的使用:
return HttpResponseRedirect(reverse('booktest:detail', args=(1,)))
说明:
第一个参数:" bookTest: detail": ' booktest应用下的 name = detail 的函数。
booktest应用url conf:
url(r'^booktest/detail/([0-9]+)/$',views.detail,name='detail')
第二个参数:self.pk会替代正则表达式里面的pk
然后 reverse 函数去解析视图函数对应的URL。
项目的 url conf:url(r'^', include('booktest.urls', namespace='booktest'))
o 在模版中使用:
o django2.x:
o <a href="{% url 'booktest:detail' book.id %}">{{ book.btitle }}</a>
o django 早期版本:
<a href="{% url 'booktest.views.detail' book.id %}">{{ book.btitle }}</a>
o 否则报错:
o NoReverseMatch at /booktest/
o Reverse for 'detail 2' not found. 'detail 2' is not a valid view function or
pattern name.
在 booktest 应用urls.py 中的配置
app_name='app_name'
网友评论