View

 视图接受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 代
表的视图函数。
 模板链接中使用
{{ book.btitle }}
{{ book.btitle }}
 编写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"来访问

  1. 首先我们在 view.py 中定义index 函数:
    def index(reqeust):
    booklist = BookInfo.books.all()
    return render(reqeust, 'booktest/index.html', {'booklist': booklist})
  2. 然后在应用的 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的使用

  1. 在应用中创建 urls.py 文件,定义本应用中的 urlconf

  2. 再在项目的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[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 {{ book.btitle }}
o django 早期版本:
{{ book.btitle }}
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'

你可能感兴趣的:(View)