django路由系统
伪静态
网站形态分两种,静态和动态,伪静态并不是真正的静态,实质上也是动态页面。
动态页面的含意就是,网页会根据访问者的请求,从服务器数据库里筛选访问者想要的内容显示到访问者的浏览器上,不同的人访问同一页面,会看到不同的内容
静态页面,访问者访问一个页面,会直接从服务器把这个页面读出来显示到访问者的浏览器里,不需要数据库的支持。
伪静态页面,其目的是为了更好的被搜索引擎收录而通过一定的规则,把动态页面的地址转换成以htm或html结尾的地址,看起来是静态的,实际是依然是动态页面。
网址匹配中自己添加.html。这样访问时网页就会有.html
url(r'^product.html', views.product.product, name='product'),
url(r'^index/(\w+)/(\w+)/'.html, index), url(r'^test/(?P<id>\w+)/(?P<name>\w+)/', test),
路由分发
总路由不再直接做路由与视图函数的对应关系,而是将获取的路由分发给下面的app去处理对应关系
路由配置: 路径-->视图函数 (哪个路径,交给哪个函数处理)
在路径也就是一级url中配置一级路由,前面依然使用正则来匹配,这组路由指向二级路由的地址
首先导入include模块,其次确保app下有urls文件
from django.conf.urls import url, include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^classes/', include('classes.urls')),
url(r'^teacher/', include('teacher.urls')),
url(r'^student/', include('student.urls')),
url(r'^login/', include('login.urls')),
url(r'',not_found)
]
视图也就是二级路由指向具体的位置
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^classes/', views.classes), url(r'^cadd/', views.cadd), url(r'^del_c/', views.del_c), url(r'^up_c/', views.up_c), ]
反向路由
随着功能的增加会出现更多的视图,可能之前配置的正则表达式不够准确,于是就要修改正则表达式,但是正则表达式一旦修改了,之前所有对应的超链接都要修改,真是一件麻烦的事情,而且可能还会漏掉一些超链接忘记修改,有办法让链接根据正则表达式动态生成吗? 就是用反向解析的办法。
定义url时,需要为include定义namespace属性,为url定义name属性,通过这个name参数,可以反向解析URL、反向URL匹配、反向URL查询或者简单的URL反查。
使用时,在模板中使用url标签,在视图中使用reverse函数,根据正则表达式动态生成地址,减轻后期维护成本。
在需要解析URL的地方,对于不同层级,Django提供了不同的工具用于URL反查:
-
在模板语言中:使用
url
模板标签。(也就是写前端网页时) -
在Python代码中:使用
reverse()
函数。(也就是写视图函数等情况时) -
在更高层的与处理Django模型实例相关的代码中:使用
get_absolute_url()
方法。(也就是在模型model中)
使用
urlpatterns = [ #... path('articles/<int:year>/', views.year_archive, name='news-year-archive'), #... ]
在前端想要使用这一条路由的时候(在前端解析)
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a> {# Or with the year in a template context variable: #} <ul> {% for yearvar in year_list %} <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li> {% endfor %} </ul>
在后端视图函数中使用
from django.urls import reverse def redirect_to_year(request): # ... year = 2019 # ... return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))