一、URL路由的简单配置
1、URL路由基础:
URL是Web服务的入口,用户通过浏览器发送过来的如何请求,都是发送到一个知道的URL地址,然后被响应。
URL路由在Django项目中的体现就是urls.py文件,这个文件可以是多个的,但绝对不会再同一目录下.实际上Django提倡项目有个根urls.py,各个app下分别有自己的一个urls.py,既集中又分开,是一种解耦的模式。
在django项目中编写路由就是向外暴露我们接收哪些URL的请求,除此之外任何的URL都不会被处理,URL路由就是web服务对外暴露的API
2、路由简单配置:
urlpatterns = [ #url(正则表达式,视图函数,参数,别名) url(r'^index/$', index,name='index'), ]
注意:
- 若要从URL中捕获一个值,只需要在它周围放置一对圆括号。
- 不需要添加前导的反斜杠,因为每个URL都有。 例如,应该是
^articles
而不是^/articles
。 - 每个正则表达式前面的'r'是可选的但是建议加上。它告诉Python这个字符串是“原始的” —— 字符串中任何字符都不应该转义。
- urlpatterns列表中的元素按照书写顺序从上往下逐行匹配正则表达式,一旦匹配成功则不再继续
开启URL访问地址后面不为“/”跳转至带有“/”路径的配置项:
APPEND_SLASH=True Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'
二、有名分组和无名分组
1、无名分组
按位置传参
分组后,将分好组的数据当做位置传参到视图函数,所以视图函数需要定义形参
示例:
url:(r'^articles/([0-9]{4})/([0-9]{2})/$', views.article_detail)
视图函数
def article_detail(request,*args)
2、有名分组
有名分组的语法是: (?P<name>pattren) ,其中name是组的名字,pattren
按关键字传参
分组后,会把分组出来的数据当做关键字参数传到视图函数,所以视图函数需要定义形参,形参名字和分组的名字相对应,与顺序无关
示例:
url:(r'^articles/(?P<year>[0-9]{4})/(?P<mouth>[0-9]{2})/$', views.article_detail),
函数视图
def article_detail(request,mouth,year)
注:有名分组和无名分组最好不要混用!
三、反向解析
在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。
在需要URL的地方,对于不同层级,Django提供不同的工具用于URL反查:
- 在模板语言中:使用URL模板标签
- 在Python代码中:使用reverse() 函数
- 在更高层的处理Django模型实例相关的代码中:使用get_absolute_url()方法
案例:urls.py
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test,name='year_month'), ]
HTML中:
<a href="{% url 'year_month' 1001 12 %}">点击下载2333</a>
在视图函数中:
from django.shortcuts import HttpResponse,reverse def test(request,year ,month): print(year,month) url = reverse('year_month',args=(1000,20,)) print(url) return HttpResponse('2018-12')
总结:
1.在html中使用{% url '别名' 参数 参数 %} 参数之间用空格分隔
2.在视图函数中:
2.1 url=reverse('year_month')
2.2 url=reverse('year_month',args=(1000,20))
四、名称空间
命名空间(英语:Namespace)是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。
由于name没有作用域,Django在反解URL时,会在项目全局搜索,当查找到第一个name指定URL时,立即返回。所以当两个不同app下的URL的name重复时,会产生冲突。
为了解决这一问题,有两种解决方法:
#方法一,在分发路由时,分配名称空间 url(r'^app01/', include('app01.urls',spacename='app01')), #使用 app01:路由别名 #方法二,在设置路由别名时,加上前缀,不要重复 url(r'^delauthor/(d+)(.html)$',delauthor,name='app01_delauthor') url(r'^delauthor/(d+)(.html)$',delauthor,name='app02_delauthor')