URL配置
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。
基本格式
from django.conf.urls import url #循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数执行,就不再往下循环了,并给函数传一个参数request,和wsgiref的environ类似,就是请求信息的所有内容 urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ]
参数说明:
正则表达式:一个正则表达式字符串
views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
参数:可选的要传递给视图函数的默认参数(字典形式)
别名:一个可选的name参数
正则表达式
from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^articles/$', views.articles), # 匹配articles/ url(r'^articles/2003/$', views.articles_2003), # 匹配articles/2003/ url(r'^articles/(\d{4})/$', views.articles_year), # 匹配四位数字当做年份 ]
views.py中视图函数的写法:
第一个参数必须是request,后面跟的三个参数是对应着上面分组正则匹配的每个参数的 def articles(request): return HttpResponse('文章') def articles_2003(request): return HttpResponse('2003') def articles_year(request, year): return HttpResponse(year)
test:
注意事项
- urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。
- 若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
- 不需要添加一个前导的反斜杠(也就是写在正则最前面的那个/),因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
- 每个正则表达式前面的'r' 是可选的但是建议加上。
- ^articles& 以什么结尾,以什么开头,严格限制路径
补充说明
# 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项 APPEND_SLASH=True
Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。其效果就是:我们定义了urls.py:
from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^blog/$', views.blog), ]
访问 http://www.example.com/blog 时,默认将网址自动转换为 http://www.example/com/blog/ 。
如果在settings.py中设置了 APPEND_SLASH=False,此时我们再请求 http://www.example.com/blog 时就会提示找不到页面。
分组命名匹配
其实上面的举例中也涉及到了分组命名,使用简单的正则表达式分组匹配(通过圆括号)来捕获URL中的值并以位置参数形式传递给视图。
from django.conf.urls import url urlpatterns = [ url(r'^articles/(\d{4})/(\d{1,2})/$', views.articles_year_month), # 匹配年月,年份是4位数字,月份是1位或2位数字 url(r'^articles/(?P<year>\d{4})/(?P<month>\d{1,2})/$', views.articles_year_month), # 分组命名匹配 ]
views.py写法:
def articles_year_month(request,month,year): return HttpResponse(year+month)
test:
视图函数中指定默认值
# urls.py中 from django.conf.urls import url from . import views urlpatterns = [
url(r'^articles/$', views.articles2), # 默认显示2003
url(r'^articles/(?P<year>\d{4})/$', views.articles2), # 用户输入任意四位数,会显示输入的数字
]
# views.py中,可以为year指定默认值
def articles2(request, year='2003'):
return HttpResponse(year)
test:
include其他的URLconfs(也叫URL分发)
由于views和models文件都放在每一个app应用里面,而urls.py这个文件放在项目文件夹里面,导致所有的app都在使用它,如果你一个项目有10个应用,每个应用有100个url,那意味着你要在urls文件里面要写很多,并且所有的app的url都写在了这一个urls文件里面啊,这样好吗,当然也没有问题,但是耦合程度太高了,所以django在url这里给你提供了一个分发接口,叫做include条url对应关系。
# 在应用文件夹里面创建一个自己的urls路由文件
from django.conf.urls import url,include from django.contrib import admin from app01 import views
urlpatterns = [ # include #app01应用的 url(r'^app01/', include('app01.urls')), #app02应用的 url(r'^app02/', include('app02.urls')), ]
# urls from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^index/(?P<year>\d+)/', views.index,{'foo':'xxxxx'}), ] # views def index(request, foo, year): print(foo) return HttpResponse('app01')
# urls from django.conf.urls import url,include from django.contrib import admin from app02 import views urlpatterns = [ # url(r'^admin/', admin.site.urls), url(r'^index', views.index), ] # views from django.shortcuts import render,HttpResponse # Create your views here. def index(request): return HttpResponse('app02')
test:
传递额外的参数给视图函数(了解)
URLconfs 具有一个钩子,让你传递一个Python 字典作为额外的参数传递给视图函数。
django.conf.urls.url()
函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。
例如:
from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),#注意,这就像一个命名分组一样,你的函数里面的必须有一个形参,形参必须叫做foo才行,如果是命名分组的url,那么foo参数写在函数的哪个位置都行,如果不是命名分组,那么都是将这个形参写在参数的最后。 ]
在这个例子中,对于/blog/2005/请求,Django 将调用views.year_archive(request, year='2005', foo='bar')。
这个技术在Syndication 框架中使用,来传递元数据和选项给视图。