路由层
路由匹配
1、路由就是ip和port后面的地址
2、url()方法
3、urlpatterns = [
url(r'^admin/', admin.site.urls),
] 第一个参数其实是一个正则表达式,一旦第一个参数匹配到了内容直接结束匹配,执行对应的视图函数
路由层之APPEND_SLASH
urlpatterns = [
url(r'^test/$', views.test),
] APPEND_SALSH默认值是True,就是加入你没有添加斜线,会自动帮你添加上。也就是,它请求了两次。
无名分组
--> 回顾 正则分组就是括号括起来
urls.py 路由层
url(r'test(\d+)/$', views.test1),
views.py视图层
def test1(request,xx):
print(xx)
return HttpResponse('aa')
最终路由层得到的结果是:
123
总结:无名分组就是将括号内正则表达式匹配的内容,当作位置参数传递给函数,所以要给视图的函数,加一个形参。
有名分组
urls.py 路由层
url(r'test(?P<id>\d+)/$', views.test1),
views.py视图层def test1(request,id):
print(id)
return HttpResponse('aa')
最终路由层得到的结果是:
123
总结:有名名分组就是将括号内正则表达式匹配的内容,当作关键字参数传递给函数,所以要给视图的函数,加一个参数名为id就是有名分组的组名。
结合使用
有名分组和无名分组是不可以将混合使用的
相同的组是可以多个使用的
反向解析
当路由频繁变化的时候,html界面上的地址需要做到动态解析
(1)路由层:
url(r'test1/', views.test1),
url(r'test2/', views.test2),
(2)视图层:
def test1(request):
return HttpResponse('judyjudyjudy')
def test2(request):
return render(request,'test2.html')
(3)模版层
<a href="/test1/">111</a>
注意:href既可以写完整的网址,也可以写路由
准备好环境之后,当我们开启项目,输入test2路由的时候,看到的页面就是111的链接,由于在后端已经写好会向test1发get请求,但是此时如果路由层的test1这个url需要改变的话,在页面上点111就找不到原本的页面了,所以第一个方法就是在模版层改一下,但是如果有很多很多呢,手动改不现实了,所以此时无名就需要动态解析了。
反向解析方法
1、给路由和视图函数对应关系添加一个别名,
url(r'test1/', views.test1,name='test1_name'),
2、根据别名动态解析出一个结果,该结果可以直接访问对应的路由
在前端的使用
<a href="{% url 'test1_name' %}">111</a>
在后端的使用
(1)导模块reverse
(2)(reverse('test1_name')) 就可以拿到变更过的url
(3)return redirect('test1_name')-->注意:redirect后面可以直接跟url和视图函数关系的别名
无名有名反向解析
准备案例
路由层
url(r'test(\d+)/$', views.test1, name='test1_name'),
视图层
def test1(request,xx):
print(reverse('test1_name'))
return HttpResponse('judyjudyjudy')
正确写法