一、URL路由基础
URL是web服务的路口,用户通过浏览器发送过来的任何请求都会被发送到一个指定的URL地址里,然后被响应。
在django项目中编写路由就是向外暴露我们接收哪些URL的请求,除此之外任何的URL都不会被处理,URL路由就是web服务对外暴露的API
二、Django处理请求
确定要使用的 URLconf 模块,通常是settings中 ROOT_URLCONF 设置的值,如果传入的 HttpRequest 对象具有 urlconf 属性(中间件设置),则使用其值代替settings中 ROOT_URLCONF
Django加载模块并查找可用的 urlpatterns ,它是 django.conf.urls.url() 实例的一个列表
按顺序运行每个URL模式,匹配成功就停下来,所以 顺序很关键
匹配成功导入给定的视图,它是一个python函数,或基于类的视图,视图将获得如下参数
- 一个HttpRequest实例
- 如果匹配的正则表达式返回了无名分组,那么它将作为位置参数提供给视图
- 关键字参数由正则的有名分组组成,但是可以被django.conf.urls.url()的可选参数kwargs覆盖
如果没有URL模式匹配,或者过程出错了,将调用错误处理视图
三、简单的路由配置
from django.conf.urls import url
urlpatterns=[ url(正则表达式,view视图函数,参数,别名) ]
示例的URLconf:
from django.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ]
注:
- 从URL中捕获一个值,可以加园括号或者尖括号
- 不要添加前导的防斜杠,因为每个URL都有,例如,应该是 ^articles 而不是 ^/articles
- 每个正则表达式前面的'r'是可选的,建议添加上,它告诉python这个字符串中的任何字符都不应该被转义
请求的例子及匹配的url
/articles/2005/03/将匹配列表中的第三个模式。Django将调用函数views.month_archive(request, '2005', '03')。
/articles/2005/3/不匹配任何URL模式,因为列表中的第三个模式要求月份是两个数字。
/articles/2003/将匹配列表中的第一个模式不是第二个,因为模式按顺序从上往下匹配,第一个会首先被匹配。Django会调用函数views.special_case_2003(request)
/articles/2003不匹配任何一个模式,因为每个模式都要求URL以一个斜杠结尾。
/articles/2003/03/03/将匹配最后一个模式。Django将调用函数views.article_detail(request, '2003', '03', '03')。
是否开启URL访问地址后面 不为/跳转至带有/路径的配置项
APPEND_SLASH=True
Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。
四、有名分组
有名分组的语法是 ("htmlcode">
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/("htmlcode">from django.shortcuts import reverse
- 无参数: url=reverse('ddd')
- 无名分组: url=reverse('ddd',args=(2018,12,))
- 有名分组: url=reverse('ddd',args=(2018,12,)) 还可以 url=reverse('ddd',kwargs={'year':2018,'mounth':12})
七、路由分发
在每个app里各自创建一个urls.py路由模块,然后从根路由出发,将app所属的url请求全部转发到相应的urls.py模块中。
Django1.1版本的分发
from django.conf.urls import url,include
例子:
总路由:
- -from django.conf.urls import include
- -url(r'^blog/',include('blog.urls')),
- -url(r'^app01/',include('app01.urls')),
各自路由配置url
- app01--url(r'^publish/$', views.publish,name='app01_test'),
- blog--url(r'^blogtest/$', views.test,name='blog_test'),
路由分发使用的是include()方法,需要提前导入,他的参数是转发目的地地路径的字符串。
重点:总路由后面不能加 $
两个不同的app,在各自的urlconf中为某一条url取了相同的name,这就会带来麻烦。为了解决这个问题,又引出了下面的命名空间。
八、命名空间
由于name没有作用域,Django在反解URL时,会在项目全局顺序搜索,当查找到第一个name指定URL时,立即返回。URL命名空间可以保证反查到唯一的URL,即使不同的app使用相同的URL名称。
示例:
urls.py
url(r'^blog/',include('blog.urls')), url(r'^app01/',include('app01.urls')),
blog的urls.py
url(r'^blogtest/$', views.test,name='test'),
app01的urls.py
url(r'^publish/$', views.publish,name='test'),
blog的视图函数
def test(request): url=reverse('test') return HttpResponse('blog test)
app01的视图函数
def test(request): url=reverse('test') return HttpResponse('app01 test)
无论如何找index都是找的app01的index。
解决方法:在总路由分发的时候指定名称空间,实现命名空间的做法很简单,在urlconf文件中添加 namespace='xxx' 即可。
url(r'^blog/',include('blog.urls',namespace='blog')), url(r'^app01/',include('app01.urls',namespace='app01')),
在视图函数反向解析的时候,指定是哪个名称空间下的
url = reverse('blog:test')
在模板里也指定是
{% url 'blog:test'%}
不是很推荐使用名称空间,推荐的是在子路由的name中加入app的前缀
url(r'^publish/$', views.publish,name='app01_test'),
九、伪静态
和真静态URL类似。他是通过伪静态规则把动态URL伪装成静态网址。
在urls.py文件中自己添加匹配 .html
url(r'^book/(?P<id>\d+.html)',views.book),
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
Django,路由控制
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。