一、位置分组关键字分组

位置分组:

-按位置传参

-分组之后,会把分组出来的数据,当位置参数,传到视图函数,所以,视图函数需要定义形参

urls.py

# 精确匹配

url(r'^publish/$',views.publish)

views.py

defpublish(request):ifrequest.method=='GET':returnHttpResponse("Thisisget")elifrequest.method=='POST':returnHttpResponse('ThisisPOST')

#访问:http://127.0.0.1:8000/publish/

This is get


urls.py

# 匹配publish 后四位数字

url(r'^publish/[0-9]{4}/$',views.publish)

# 匹配任意长度的数字

url(r'^publish/\d+/$',views.publish)

views.py

同上面一样


urls.py

#配后面的publish/数字4位/与数字2位 ,其他均为404 (注:多个分组中都带有小括号)

url(r'^publish/([0-9]{4})/([0-9]{2})/$',views.publish),

views.py

defpublish(request,year,month):#有括号(分组)的必须要传参数过去ifrequest.method=='GET':returnHttpResponse('Thisisget')elifrequest.method=='POST':returnHttpResponse('ThisisPOST')

视图函数还可以这样写(*args):

defpublish(request,*args):ifrequest.method=='GET':returnHttpResponse('Thisisget')elifrequest.method=='POST':returnHttpResponse('ThisisPOST')

访问:http://127.0.0.1:8000/publish/1234/20/

This is get


urls.py

# 有括号(分组)的必须要传参数过去,publish后面匹配多个数字

url(r'^publish/(\d+)/$',views.publish),

views.py

defpublish(request,year):returnHttpResponse("publish")

访问:http://127.0.0.1:8000/publish/任意数字



关键字分组:

-按关键字传参

-有名分组之后,会把分组出来的数据,当关键字参数,传到视图函数,所以,视图函数需要定义形参,形参名字要跟分组的名字对应,与顺序无关

urls.py

#关键字分组是按照关键字传参数

url(r'^publish/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.publish),

views.py

defpublish(request,year,month):#有括号(分组)的必须要传参数过去ifrequest.method=='GET':returnHttpResponse('Thisisget')elifrequest.method=='POST':returnHttpResponse('ThisisPOST')


urls.py

# 位置分组与关键字分组混合使用

url(r'^publish/([0-9]{4})/(?P<month>[0-9]{2})/$',views.publish),

views.py

#位置分组与关键字分组混合使用,可以使用*args,**kwargs 接收 (建议不要混着用)

defpublish(request,*args,**kwargs):ifrequest.method=='GET':print(args,kwargs)#(){'month':'12'}returnHttpResponse('Thisisgetpublish')elifrequest.method=='POST':returnHttpResponse('ThisisPOST')


二、反向解析

# 分组

作用:

例如:当我访问http://127.0.0.1:8000/publish/去点击某一个链接的时候,去访问到了http://127.0.0.1:8000/publishadd/

urls.py

url(r'^publish/$',views.publish),url(r'^publishadd/$',views.publishadd,name='pub'),

#若以后要去到这个地址(publishadd)会发生改变的话,后面可以加上‘name=自已定义的名字与pub.html网页标签中定义的名字一致’,这样,publishadd这个路由再如何变化,访问到/publish/中指定某一个链接时,也还是会去到你已改变的那个路由上的。(类似给publishadd,取了一个别名)

views.py

defpublish(request):ifrequest.method=='GET':returnrender(request,'pub.html')defpublishadd(request):returnHttpResponse('publishadd')

templates/pub.html

<!DOCTYPEhtml><htmllang="zh"><head><metacharset="UTF-8"><title>反向解析</title></head><body>{#位置分组#}<ahref="{%url'pub'%}">点我去publishadd</a></body></html>


对于redirect重定向的解决方案:

没改前:

# 当我访问:http://127.0.0.1:8000/publish,它会帮我跳转到http://127.0.0.1:8000/publishadd/这个页面中,但我路由层的publishadd换了其他名字的时候,便会报错了。

urls.py

url(r'^publish/$',views.publish),url(r'^publishadd/$',views.publishadd,name='pub'),

views.py

defpublish(request):ifrequest.method=='GET':returnredirect('/publishadd/')defpublishadd(request):returnHttpResponse('publishadd')

templates/pub.html

<!DOCTYPEhtml><htmllang="zh"><head><metacharset="UTF-8"><title>反向解析</title></head><body>{#位置分组#}<ahref="{%url'pub'%}">点我去publishadd</a>{#<ahref="{%url'pub'year=2018month=12%}">test去点我</a>#}</body></html>

改之后:路由中的publishadd后面再如何改也会访问到views.py文件中的publishadd这个函数属性中

例如:访问http://127.0.0.1:8000/publish,路由层publishadd改成了publishadd777,它也会访问到publishadd这个函数的属性中

urls.py

url(r'^publish/$',views.publish),url(r'^publishadd/$',views.publishadd,name='pub'),

views.py

fromdjango.shortcutsimportrender,HttpResponse,redirect,reversedefpublish(request):ifrequest.method=='GET':url=reverse('pub')#改之后,reverse反向解析的模块returnredirect(url)#改之后defpublishadd(request):returnHttpResponse('publishadd')

templates/pub.html 不变


#位置分组,参数传递

urls.py

url(r'^publish/$',views.publish),url(r'^publishadd/([0-9]{4})/$',views.publishadd,name='pub'),#如果publishadd后面是两个参数的话,views.py中的也需要跟着加

views.py

defpublish(request):ifrequest.method=='GET':returnrender(request,'pub.html')defpublishadd(request,year):#urls.py中的publishadd后面要加2个参数的话,这里也要跟着加上2个参数,例如:defpublishadd(request,year,month):returnHttpResponse('publishadd')

templates/pub.html

<!DOCTYPEhtml><htmllang="zh"><head><metacharset="UTF-8"><title>反向解析</title></head><body>{#位置分组#}<ahref="{%url'pub'2018%}">点我去publishadd</a>{#如果上面是两个参数的话2018的后面还需要多传一个参数#}</body></html>

访问:http://127.0.0.1:8000/publish/

点击页面中的 "点我去publishadd"

访问到:http://127.0.0.1:8000/publishadd/2018/

显示:publishadd成功。


使用reverse模块重定向

urls.py

url(r'^publish/$',views.publish),url(r'^publishadd/([0-9]{4})/([0-9]{2})/$',views.publishadd,name='pub'),

views.py

fromdjango.shortcutsimportrender,HttpResponse,redirect,reversedefpublish(request):ifrequest.method=='GET':url=reverse('pub',args=(2018,12,))returnredirect(url)defpublishadd(request,year,month):returnHttpResponse('publishadd')

templates/pub.html

<!DOCTYPEhtml><htmllang="zh"><head><metacharset="UTF-8"><title>反向解析</title></head><body>{#位置分组#}<ahref="{%url'pub'201802%}">点我去publishadd</a></body></html>

访问:http://127.0.0.1:8000/publish

自动跳转到:http://127.0.0.1:8000/publishadd/2018/12/

显示:publishadd 成功。


#关键字分组 --- 模板层

urls.py

url(r'^publish/$',views.publish),url(r'^publishadd/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$',views.publishadd,name='pub'),

views.py

defpublish(request):ifrequest.method=='GET':returnrender(request,'pub.html')defpublishadd(request,year,month):returnHttpResponse('publishadd')

templates/pub.html

<!DOCTYPEhtml><htmllang="zh"><head><metacharset="UTF-8"><title>反向解析</title></head><body>{#关键字分组#}<ahref="{%url'pub'year=2018month=12%}">点我去publishadd</a></body></html>

访问:http://127.0.0.1:8000/publish/

点击 :点我去publishadd

访问到:http://127.0.0.1:8000/publishadd/2018/12/

显示:publishadd 成功~


# 关键字视图层

urls.py与templates/pub.html内容不变(与上面的一致)

views.py

defpublish(request):ifrequest.method=='GET':url=reverse('pub',args=(2018,12,))#url=reverse('pub',kwargs={'month':12,"year":2018})#两种都支持,效果一样。returnredirect(url)defpublishadd(request,year,month):returnHttpResponse('publishadd')

访问:http://127.0.0.1:8000/publish

会重定向到:http://127.0.0.1:8000/publishadd/2018/12/

显示 :publishadd !~~~成功


总结:

-先命一个名:-1无参数:url(r'^publishadd133/$',views.publishadd,name='ddd'),-2位置分组:url(r'^publishadd/([0-9]{4})/([0-9]{2})/$',views.publishadd,name='ddd'),-3关键字分组:url(r'^publishadd/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$',views.publishadd,name='ddd'),-在模板层:-1无参数:{%url'ddd'%}-2位置分组的:{%url'ddd'201812%}-3关键分组:{%url'ddd'201812%}还可以{%url'ddd'year=2018mounth=12%}-在视图层:fromdjango.shortcutsimportreverse在视图函数里:1无参数:url=reverse('ddd')2位置分组:url=reverse('ddd',args=(2018,12,))如果只有一个参数,后面必须要加一个逗号3关键字分组:url=reverse('ddd',args=(2018,12,))还可以url=reverse('ddd',kwargs={'year':2018,'mounth':12})


三、路由分发

作用:由总路由urls.py中先分发,然后再到不同的app中由它们再次分发。

1、首先要再次手动创建一个app

命令:python3 manage.py startapp appname (我这里就叫blog了,另一个为app01)

2、在settings.py中注册

INSTALLED_APPS的列表中添加

'blog.apps.BlogConfig',

3、在每个app的目录下面创建一个名为urls.py的文件。内容为:

app01目录下的urls.py中:

fromdjango.conf.urlsimporturlfromapp01importviewsurlpatterns=[url(r'^app01_test/$',views.test),]

app01目录下的视图函数views.py文件中:

defapp01(request):returnHttpResponse('app01--test')

blog目录下的urls.py中:

fromdjango.conf.urlsimporturlfromblogimportviewsurlpatterns=[url(r'^blog_test/$',views.test)]

blog目录下的视图函数views.py文件中:

defblog(request):returnHttpResponse('blog----test')

4、在总路由中的urls.py中的需要配置以下:

fromdjango.conf.urlsimporturl,include#总路由中添加:url(r'^app01/',include('app01.urls')),url(r'^blog/',include('blog.urls')),

5、访问:

http://127.0.0.1:8000/blog/blog_test/

http://127.0.0.1:8000/app01/app01_test/

总结:

路由分发1在不同的app里创建urls.py2在总路由-fromdjango.conf.urlsimportinclude-url(r'^blog/',include('blog.urls')),-url(r'^app01/',include('app01.urls')),3在不同的app的urls里配置路由关系***重点***总路由,不能加结束符$

四、名称空间

作用:以防止两个应用的子路由后面的name='名字'相同或者怕冲突,这样是为了让它们自已找到属于自已的名称空间,以防冲突(或者不要把子路由后面的name='名字'名字命名成一样的也可。做了解)

1、总路由urls.py

url(r'^app01/',include('app01.urls',namespace='app01')),url(r'^blog/',include('blog.urls',namespace='blog')),

app01下的文件:

app01下的urls.py

fromdjango.conf.urlsimporturlfromapp01importviewsurlpatterns=[url(r'^app01_test/$',views.app01,name='test'),]

app01下的views.py

defapp01(request):url=reverse('app01:test')print(url)returnrender(request,'app01.html')

templates/app01.html

<!DOCTYPEhtml><htmllang="zh"><head><metacharset="UTF-8"><title>反向解析</title></head><body><ahref="{%url'app01:test'%}">app01_test</a></body></html>

blog下的文件:

blog下的urls.py

fromdjango.conf.urlsimporturlfromblogimportviewsurlpatterns=[url(r'^blog_test/$',views.blog,name='test')]

blog下的views.py

defblog(request):url=reverse('blog:test')print(url)returnrender(request,'blog.html')

templates/blog.html

<!DOCTYPEhtml><htmllang="zh"><head><metacharset="UTF-8"><title>反向解析</title></head><body><ahref="{%url'blog:test'%}">blog_test</a></body></html>

五、伪静态

伪静态是相对真实静态来讲的,使用*.html的话,搜索引擎会认为这些页面不太会经常改动,被收录的可能性就会大,而搜索关键字的时候,就会把你的页面通过搜索引擎搜索出来,而其实这些页面都是通过数据库中查找出来的页面,然后再返回给的客户。

-路由:url(r'^book/(?P<id>\d+.html)',views.book),

-访问:http://127.0.0.1:8000/book/4.html