路由层urls.py
路由匹配
第一个问题:
url方法第一个参数是正则表达式
# 只要第一个参数正则表达式能够匹配到内容,那么就会立刻停止往下匹配,直接执行对应的视图函数
eg:url(r'test',views.test)
url(r'testadd',views.testadd)
# 通过上述的描述那么这个案例就永远访问不到testadd路由
解决上述问题:
url(r'test/',views.test)
url(r'testadd/',views.testadd)
我们在输入路由后缀的时候,一般不会添加一个'/'那么为什么这里就可以匹配到呢
我们知道在输入test和testadd的时候都不满足正则匹配,因为都少了一个'/'
这就是django内部重定向方法:django在匹配路由的时候,如果都没有匹配到,那么会自动加一个'/'再来试一次,所以加一个'/'就可以避免上述问题
补充:
# 进入settings.py配置文件 加入这一行命令
# 取消自动加斜杠
APPEND_SLASH = Flase # 默认为True(一般情况下也应该让他自动补全)
第二个问题:
# 我们看到我们在前后随便输入文本他都可以匹配
# 这里就是正则的不严谨导致的
url(r'^test/$',views.test)
url(r'^testadd/$',views.testadd)
# 这样就可以完全解决上述问题
# ^表示以什么开头 $表示以什么结尾
第三个问题:
主页:
# 现在我们只可以访问到路由后缀为/test/和/testadd/ 的页面,那么如何访问到主页面呢
url(r'^$',views.home)
报错页面:
# 那么如果没有一个路由后缀匹配到,那是不是应该返回一个报错页面反馈给用户
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 首页
url(r'^$',views.home),
# 路由匹配
url(r'^test/$',views.test),
url(r'^testadd/$',views.testadd),
# 尾页(了解)
url(r'',views.error),
]
# 这里就可以写一个空字符串,这样不管谁都可以匹配到,这里就可以编写一些报错页面或者重定向链接页面(这个方法不建议使用,会使用一个异常捕获的方式来编写,如果系统没有自动补全'/'后缀那么这个方法就会出现其他路由后缀也会到这一层页面。)
无名分组
# 分组:在正则表达式中,只需要给某一段正则表达式添加一个'()'即可
无名分组:在urls.py里如果给正则表达式加入'()'分组那么会将这个正则表达式匹配到的内容当作位置参数传给后面的视图函数views.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/(\d+)/',views.test), # 无名分组(\d表示数字 , +表示一个或多个)
url(r'^testadd/$',views.testadd)
]
def test(request,noname): # 需要一个位置参数接收
print(noname)
return HttpResponse('test')
有名分组
# 格式:(?P<起名字关键字>正则表达式)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/(\d+)/',views.test), # 无名分组(\d表示数字 +表示一个或多个)
url(r'^testadd/(?<name>\d+)',views.testadd) # 有名分组
]
无名分组是否可以和有名分组混用
"""
不能混用
但是同一个分组可以使用N多次
"""
# 单个的分组可以使用多次
url(r'^index/(\d+)/(\d+)/(\d+)/',views.index),
url(r'^index/(?P<year>\d+)/(?P<age>\d+)/(?P<month>\d+)/',views.index),
# 不可以混用:(错误示范)
url(r'index/(\d+)/(?P<name>\d+)/')