URL是Web服务的入口,用户经过浏览器发送过来的如何请求,都是发送到一个知道的URL地址,而后被响应。
URL路由在Django项目中的体现就是urls.py文件,这个文件能够是多个的,但绝对不会再同一目录下.实际上Django提倡项目有个根urls.py,各个app下分别有本身的一个urls.py,既集中又分开,是一种解耦的模式。html
在django项目中编写路由就是向外暴露咱们接收哪些URL的请求,除此以外任何的URL都不会被处理,URL路由就是web服务对外暴露的APIweb
urlpatterns = [ #url(正则表达式,视图函数,参数,别名) url(r'^index/$', index,name='index'), ]
注意:正则表达式
^articles
而不是^/articles
。开启URL访问地址后面不为“/”跳转至带有“/”路径的配置项:django
APPEND_SLASH=True Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其做用就是自动在网址结尾加'/'
按位置传参浏览器
分组后,将分好组的数据当作位置传参到视图函数,因此视图函数须要定义形参服务器
示例: app
url:(r'^articles/([0-9]{4})/([0-9]{2})/$', views.article_detail)
视图函数函数
def article_detail(request,*args)
有名分组的语法是: (?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反查:
案例: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')