1. 程式人生 > >五、Django之路由系統

五、Django之路由系統

場景 個數 簡單 ear 參數 span char epo arc

1、普通路由匹配

URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL模式以及要為該URL模式調用的視圖函數之間的映射表;它就是以這種方式告訴Django,用哪個URL調用哪段代碼。URL的加載是從配置文件中開始。

urlpatterns = [
    url(正則表達式, views視圖函數,參數,別名),
]

  

參數說明:

  • 一個正則表達式字符串
  • 一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串
  • 可選的要傳遞給視圖函數的默認參數(字典形式)
  • 一個可選的name參數

例子:

from django.conf.urls import url 
from . import views

urlpatterns = [
    #匹配articles開頭,2003結尾的url,精確匹配。   
    url(r‘^articles/2003/$‘, views.special_case_2003),

    #articles開頭,4個數字結尾的url,模糊匹配
    url(r‘^articles/([0-9]{4})/$‘, views.year_archive),

    #articles開頭,再接4位數字,最後接2位數字結尾的url
    url(r‘^articles/([0-9]{4})/([0-9]{2})/$‘, views.month_archive),

    #articles開頭,再接4位數字,再接2位數字,最後接數字,至少1個數字
    url(r‘^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$‘, views.article_detail),
]

  

2、命名路由匹配

通過正則表達式進行匹配url。

from django.conf.urls import url
  
from . import views
  
urlpatterns = [
    #匹配articles開頭,2003結尾的url
    url(r‘^articles/2003/$‘, views.special_case_2003),

    #匹配articles開頭,視圖函數包含4位數字的year參數
    url(r‘^articles/(?P<year>[0-9]{4})/$‘, views.year_archive),

    #匹配articles開頭,視圖函數包含4位數字的year參數,2位數字的month參數
    url(r‘^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$‘, views.month_archive),

    #匹配articles開頭,包含4位數字的year,2位數字的month,2位數字的day
    url(r‘^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$‘, views.article_detail),
]

  

3、二級路由(Including)

如果映射 url 太多怎麽辦,全寫一個在 urlpatterns 顯得繁瑣,所以二級路由應用而生。所以include主要是用於減少重復代碼。

此外,還有一個應用場景,就是在多個app裏面,使用include將url分開,這樣就不會顯得url有很多,且看上去簡潔明了。

例子1:

作用:簡單明了。

from django.conf.urls import include, url

from apps.main import views as main_views
from credit import views as credit_views

extra_patterns = [
    url(r‘^reports/$‘, credit_views.report),
    url(r‘^reports/(?P<id>[0-9]+)/$‘, credit_views.report),
    url(r‘^charge/$‘, credit_views.charge),
]

urlpatterns = [
    url(r‘^$‘, main_views.homepage),
    url(r‘^help/‘, include(‘apps.help.urls‘)),
url(r‘^credit/‘, include(extra_patterns)), ]

  

例子2:

作用:減少重復代碼。

# include前版本
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r‘^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/history/$‘, views.history),
    url(r‘^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/edit/$‘, views.edit),
    url(r‘^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/discuss/$‘, views.discuss),
    url(r‘^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/permissions/$‘, views.permissions),
]


# include後版本
from django.conf.urls import include, url
from . import views

urlpatterns = [
    url(r‘^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/‘, include([
        url(r‘^history/$‘, views.history),
        url(r‘^edit/$‘, views.edit),
        url(r‘^discuss/$‘, views.discuss),
        url(r‘^permissions/$‘, views.permissions),
    ])),
]

  

例子3:多app分散url

作用:url分配到對應的app,簡潔明了。

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^blog/‘, include(‘blog.urls‘)),#一個為blog的app的url單獨為一個文件
]

  

4、傳遞額外的參數到視圖函數

作用:對於某一批URL具有固定參數的時候就可以使用此方法。

urlpatterns = [
    url(r‘^blog/(?P<year>[0-9]{4})/$‘, views.year_archive, {‘foo‘: ‘bar‘}),
]
#視圖函數裏面調用
views.year_archive(request, year=‘2005‘,foo=‘bar‘)

  

5、帶別名的url

作用:對於url很長的時候比較有用。

urlpatterns = [
    url(r‘^index‘,views.index,name=‘myindex‘),
]

#調用別名
<body>
{#<form action="/index/" method="post">#}
     <form action="{% url ‘myindex‘ %}" method="post">
         用戶名:<input type="text" name="username">
         密碼:<input type="password" name="password">
         <input type="submit" value="submit">
     </form>
</body>

  

五、Django之路由系統