Django的路由层

一 简单的路由配置

from django.conf.urls import url

from app import views

urlpatterns = [
   path('/',views.index)   
]

二 有名分组

先欠着

三 分发

from django.conf.urls import include, url

urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'^blog/', include('blog.urls')),  #include 就是分发
]

四 反向解析

反向代理的作用是 当有一个需求或多个需求导致URL的改变,也就是修改原来URL,以获取新的URL最终形式,以用于切入到生成的内容中,人们不希望一个个的去修改这些URL(就是硬编码URL)。

因此 在需要URL的地方,对于不同层级,Django提供不同的工具用于URL反查,反向解析有两种方式:

1 在模板中:使用URL模板标签

2 在Python中:使用django.core.urlresolvers.reverse()函数

urls.py

from django.conf.urls import url

from . import views

urlpatterns = [
   
    url('/index', views.index, name='indexs'),
    
]

方式一:python的视图函数中(使用reverse反向解析):

from django.core.urlresolvers import reverse  #reverse就是反向解析
from django.http import HttpResponseRedirect

def redirect_to_year(request):
    # ...
    year = 2006
    # ...
    return HttpResponseRedirect(reverse('indexs', args=(year,))


   ## 同redirect("/index")

方式二:在模板中使用(使用url):

<a href="{% url 'indexs' 2012 %}">2012 Archive</a>

<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'indexs' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>



#在模板中 url 就是反向解析

注意;当命名你的URL 模式时,请确保使用的名称不会与其它应用中名称冲突。如果你的URL 模式叫做comment,而另外一个应用中也有一个同样的名称,当你在模板中使用这个名称的时候不能保证将插入哪个URL。在URL 名称中加上一个前缀,比如应用的名称,将减少冲突的可能。

五 名称空间

命名空间是表示标识符的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。

project的urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app01/', include("app01.urls",namespace="app01")),
    url(r'^app02/', include("app02.urls",namespace="app02")),
]



#namespace 就是名称空间

app01.urls:

urlpatterns = [
    url(r'^index/', index,name="index"),
]

app02.urls:

urlpatterns = [
    url(r'^index/', index,name="index"),
]

app01.views

from django.core.urlresolvers import reverse

def index(request):

    return  HttpResponse(reverse("app01:index"))

app02.views

from django.core.urlresolvers import reverse

def index(request):

    return  HttpResponse(reverse("app02:index"))
原文地址:https://www.cnblogs.com/mlhz/p/10289742.html