一 Django中路由的作用
本质URL配置(URLconf)就是与要为该URL调用的视图函数之间的映射表
from django.conf.urls import url
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
- 正则表达式:一个正则表达式字符串
- views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
- 参数:可选的要传递给视图函数的默认参数(字典形式)
- 别名:一个可选的name参数
from app01 import views
url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test)
'^test/$' ^是以test开头,$是以test/为结尾(当test后面没有内容时浏览器会自动补全/)
# 在settings中设置成false,再带后缀斜杠,浏览器就不能匹配该网址了
APPEND_SLASH=False
伪静态页面
# .html对于百度对网站进行SEO优化的权限相对会更高,方便被检索 url(r'^get_book/(\d+).html', views.test3),
浏览器输入:127.0.0.1:8000/get_book/3.html
urls.py:url(r'^get_book/(\d+).html',views.test.3)
views.py:
def test3(request,nid): #注意传入两个参数需要在函数内也要传入两个形参 return HttpResponse('我是这本书的详情'+nid) # 浏览器显示结果: # 我是这本书的详情3
路由关系小结:
基础知识,无名分组:url(r'^admin/', admin.site.urls),
# 第一个参数,可以写一个正则表达式
# 从上往下匹配,一旦匹配成功,就不往下走了
# 如果分几个组,相应的视图函数,就应该接收几个
# 在setting里设置:APPEND_SLASH=False,请求时,浏览器不会自动补全斜杠,带上斜杠就匹配失败
# 伪静态,方便搜索引擎收录
有名分组小结:
1、
url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.test)
2 、
def test(request,month,year): print(year) print(month) return HttpResponse('ok') #名字必须一致,否则报错,位置可以颠倒,如果分了两个组,必须用两个参数接
3、有名分组和无名分组不要混用
4、有名分组可以用**kwargs接收,无名分组可以用*args接收
5、分组捕获的参数,都是str类型
6、可以设置默认值
import re
# 括号---》分组
ret=re.search('test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})','test/2015/12')
print(ret.group())
print(ret.group(1)) #按位置,取了组内第1个:?P<year>[0-9]{4}) 结果:2015
print(ret.group(2)) #按位置,取了组内第2个:?P<month>[0-9]{2})
print(ret.group('year')) # ?P<> 为有名分组,按关键名来取值 结果:2015
print(ret.group('month'))
路由分发:
1、先在app01、app02...的urls.py中导入from django.conf.urls import include
2、路由分发,有两种方式:(推荐使用方式二)
(1) from app01 import urls
from app02 import urls as urls2
url(r'app01/',include(urls)),
(2) url(r'^app01/', include('app01.urls'))
3、在相应的app里创建urls.py文件,建议,不要改名字
4、urlpatterns不能变名字 ,后面的写法就一样了 url(r'^test',views.test3 ),
5、重复上面步骤,分发多个
在版本上对于path的不同使用:
版本2.x和版本1.x的区别
1 2.x的re_path 就是我原来的url
2 2.x多了一个path,不支持正则
反向解析
1 路由中,命一个名,url(r'^index/', views.index,name='n1'),
2 在视图函数里:from django.shortcuts import reverse #这样就能拿到我反向解析出来的url url=reverse('n1')
3 在模板里用:
{% url 'n1'%}
4 带位置参数反向解析
url(r'^index/([0-9]{4})/([0-9]{2})', views.index,name='n1'),
视图:url=reverse('n1',args=(2012,12,))
模板:{% url 'n1' 2012 12 %}
5 带关键字参数反向解析url(r'^index/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})', views.index,name='n1'),
视图:url=reverse('n1',args=(2012,12,) ---可以
url=reverse('n1',kwargs={'year':2014,'month':12})-----也可以
模板:
{% url 'n1' 2012 12 %}----可以
{% url 'n1' month=12 year=2012 %}----可以
注意:按位置传,顺序是固定的
作用:修改路由中url的时候,其它地方不需要改动