路由控制
1.路由关系:
重点先来:无名分组和有名分组
首先来说下url参数里面内容:
url请求地址,也就是第一个参数,可以写成正则表达式。第二个参数是视图函数,第三个参数是别名,后面再细说。
用户输入请求从上往下匹配,一旦匹配成功就不往下走了。
如果分成几个组,相应的视图函数就应该有几个参数去接受。具体的怎么把分组的值传给形参我也不太清楚。
在setting里设置:APPEND_SLASH=False,请求时,浏览器不会自动补全斜杠,带上斜杠就匹配失败。slash是斜杠的意思。默认为True。
伪静态:优点:加上html让别人以为是静态网页。静态网页一般后期不会改。seo(搜索引擎)收录的权限高,可以被收录到百度数据库中。
百度会把一些静态文件收录到自己的数据库里。
无名分组:例如url(r'^admin/2005/12',views.admin) ==》并没有给分组指定名称
有名分组:
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来接收。和函数传参类似,打印kwargs是以恶搞字典,args是一个元组。
5.捕获到的参数(实参)都是字符串类型。
6.可以给形参设置默认值。如果实参没有传值就用默认值,传值了用实参的。
路由分发
首先要导入include方法
1.from django.conf.urls import include
2.两种方式路由分发:
方式一:url(r'^app01/',include('app01.urls')) ===>方式一更直接点
方式二:from app01 import urls
url(r'^app01/',include(urls))
3.在相应的app里创建urls文件,叫别的名字也可以,规范一下就叫urls。
4 urlpatterns 不能变名字 ,后面的写法就一样了 url(r'^test',views.test3 ),
5 重复上面步骤,分发多个
django 1.几版本和2.几把那本的区别
2.几版本的re_path就是原来的1.几版本的url
2.几版本多了个正则多了个path。
反向解析:重点
1.先加一个别名
url(r'^admin/',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,))
分析:想我们一开始写的硬编码,也就是吧action要跳转的路径写死了。但是像淘宝,天猫等都会经常更新新东西,,那么你的页面上的url路径也会时不时的变化。但是如果有特别多的商品,那么你就得去服务端一个一个的改,这样显得很麻烦,那么有没有一种机制帮我们解决问题呢?那就按照我下面的办法解决。就把url路径写活了。
1、首先给url起一个别名。
2、然后在login.html中写上{% url ‘别名’’ %} ,如果在页面中点击查看元素,它会变成login.html,,,当然我的是分发了,,就会变成test/login.html
3、这样你就可以修改你的正则了,,因为他是按照别名走的,不会影响。
urls.py
login.html
查看元素的结果
这样的好处是:无论你怎么改你要匹配的url,只要你写上了别名。在html实现了模板语法,就会去找别名对应的那个url,以后不管你怎么改url都没事,就写活了,就不像一开始写的硬编码了。
模板:{% 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的时候,其它地方不需要改动<===最大的作用 用于较大的开发项目
名称空间:(知道它,但是建议不同app的url里name不能重名,app的名字_name,name是别名,比如app01_test)
1 url(r'^app01/', include('app01.urls',namespace='app01')),
urlpatterns = [
url(r'^test',views.test3 ,name='test'),
]
url(r'^app02/', include('app02.urls',namespace='app02')),
urlpatterns = [
url(r'^test02',views.test3 ,name='test'),
]
2 在视图函数里:
url=reverse('app02:test')
print(url)
3 在模板里:
<a href="{% url 'app02:test' %}">点我跳到首页</a>