一、路由层
1.1路由匹配
1.1.1 什么是路由?
- 路由可以看成是跟在 ip 和 port 之后的地址
1.1.2 url( ) 方法
# 示例
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login_func),
url(r'^register/$', views.register_func),
]
url( )
方法的第一个参数其实是正则表达式, 一旦第一个参数匹配到了内容直接结束匹配, 并调用对应的视图函数
注:不需要在路由前面添加反斜杠 "/", 因为每个 url 自带
建议在正则表达式之前添加原生字符 "r"
每个由正则匹配成功并通过分组捕获的参数都会作为一个普通的Python字符串传递给视图函数
如果路由结尾没有"/", 在第一次正则匹配机制没有匹配到想要的内容时, 会在匹配字符后加一个"/", 然后Django内部重定向在匹配一次
2、分组命名匹配
1.2.1 无名分组
rl( ) 方法中第一个参数正则表达式分组 : 给正则表达式前后加一个小括号
会将括号内正则表达式匹配到的内容当做位置参数传递给后边的视图函数
get请求的第一种方式:
http://127.0.0.1:8000/test/?a=1&b=2
get请求的第二种方式:
http://127.0.0.1:8000/test/123/11
1.2.2 有名分组
- 将正则表达式分组捕获到的内容定义一个名字
- 会将括号内正则表达式匹配到的内容当做关键字参数传递给后面的视图函数
url(r'^login/$', views.login_func)
# 有名分组
url(r'^login/(?P<id>\d+)/$', views.login_func)
# 视图函数
def login_func(request,**kwargs):
print(kwargs)
return Httpresponse(args)
1.2.3 有名和无名是否能够混合使用
- 不能结合使用
url(r'^login/(\d+)/(?P<id>\d+)/$', views.login_func)
# 官方说不能混着用, 混着用只能取到有名分组捕获的值
# 只要不混着用,有名分组和无名分组支持多个相同类型的传参
- 可以单个重复使用
url(r'^login/(\d+)/(\d+)/$', views.login_func)
url(r'^login/(?P<id>\d+)/(?P<id>\d+)/$', views.login_func)
3、 反向解析
1.3.1 .什么是反向解析?
- 反向解析就是通过一些方法得到一个结果, 该结果可以直接访问对应的 url 并触发视图函数
1.3.2 反向解析的作用
- 在使用一个 Django 项目时, 我们经常需要将一个 url 嵌入到生成的内容中去, 如果将这些 url 固定写死, 那么可扩展性很差, 并且一定程度上会产生过期的 url
- 使用反向解析就是当路由频繁变化的时候, 让 html 界面上的连接地址做到动态解析
1.3.3 如何使用反向解析
- 给路由与视图函数对应关系添加一个别名 (名字由自己指定, 只要不冲突即可)
- # 路由层
url(r'^login/$', views.login_func,name='login_name')
1.3.4 无名有名分组反向解析
1.无名分组反向解析url(r'^v1/v2/v3/home/(\d+)/(\d+)/$', views.home, name='home')
# 后端解析
res=reverse('home', args=(123, 11)) # /v1/v2/v3/home/1
print(res)# 前端解析
<a href="{% url 'home' 1 123 %}">点我看美女</a>
4、 路由分发
Django的全局路由文件是urls.py这个文件
随着项目的复杂程度越来越来越大,路由肯定也是越来越多,路由文件就会增加很多的路由地址,就会导致路由文件很混乱,不好管理,也不够清晰,我们可以把总路由文件进行拆分,拆分到各个应用下面去,每一个应用都可以有自己的路由文件# 路由分发之后,总路由文件就不在作为地址匹配了,只是为了分发而已
# 路由的分发
# url(r'^app01/', include(app01_urls)),
# url(r'^app02/', include(app02_urls)),
# 第二种方式
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),"""分发的路由第一个参数最后一个不要加 $ """
5. 名称空间(了解)
1.5.1 为什么使用名称空间
当多个应用设置了相同的别名, 在反向解析的时候前面路由会被后面的路由覆盖, 那么就无法触发前面路由对应的视图函数, 正常情况下, 反向解析是无法自动识别前缀的, 为了避免这种错误, 引入了名称空间.
6.伪静态的概念(了解)
- 目的是为了更好的被搜索引擎收录以及seo查询几率而通过一定的规则, 把动态页面的地址转换成以 htm 或 html 结尾的地址, 看起来是静态的, 实际是依然是动态页面
- 比如博客园的文章地址结尾就是
.html
, 但我们是可以对文章内容进行修改的