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,)))

 

原文地址:https://www.cnblogs.com/duGD/p/11192148.html