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 代
表的视图函数。
 模板链接中使用
<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"来访问

  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<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'

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容