定義:
URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要為該URL調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對于這個URL調用這段代碼,對于那個URL調用那段代碼。
URL配置格式:
'''urlpatterns = [url(正則表達式, views視圖函數,參數,別名), ]參數說明:一個正則表達式字符串一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串可選的要傳遞給視圖函數的默認參數(字典形式)一個可選的name參數'''
URL配置的幾種方式:
1、基本配置
url(r'^index$', views.index),
2、基于正則的路由
url(r'^index/(\d*)', views.index), url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),
這時在view中的相對應的方法就必須接受正則分組中的id
3、添加額外的參數
url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),
這時會在views里的方法調用中額外傳遞一個默認的參數,而且必須得接收
4、為路由映射設置名稱
url(r'^home', views.home, name='h1'), url(r'^index/(\d*)', views.index, name='h2'),
設置名稱之后,可以在不同的地方調用,如:
- 模板中使用生成URL ? ? {% url 'h2' 2012 %}
- 函數中使用生成URL ? ??reverse('h2', args=(2012,)) ? ? ?路徑:django.urls.reverse
- Model中使用獲取URL ?自定義get_absolute_url() 方法
5、根據app對路由規則進行分類
url(r'^web/',include('web.urls')),
?URL反向解析:
一、原因:
在使用Django 項目時,一個常見的需求是獲得URL 的最終形式,以用于嵌入到生成的內容中(視圖中和顯示給用戶的URL等)或者用于處理服務器端的導航(重定向等)。
人們強烈希望不要硬編碼這些URL(費力、不可擴展且容易產生錯誤)或者設計一種與URLconf 毫不相關的專門的URL 生成機制,因為這樣容易導致一定程度上產生過期的URL。
換句話講,需要的是一個DRY 機制。除了其它有點,它還允許設計的URL 可以自動更新而不用遍歷項目的源代碼來搜索并替換過期的URL。
獲取一個URL 最開始想到的信息是處理它視圖的標識(例如名字),查找正確的URL 的其它必要的信息有視圖參數的類型(位置參數、關鍵字參數)和值。
Django 提供一個辦法是讓URL 映射是URL 設計唯一的地方。你填充你的URLconf,然后可以雙向使用它:
- 根據用戶/瀏覽器發起的URL 請求,它調用正確的Django 視圖,并從URL 中提取它的參數需要的值。
- 根據Django 視圖的標識和將要傳遞給它的參數的值,獲取與之關聯的URL。
第一種方式是我們在前面的章節中一直討論的用法。第二種方式叫做反向解析URL、反向URL 匹配、反向URL 查詢或者簡單的URL 反查。
在需要URL 的地方,對于不同層級,Django 提供不同的工具用于URL 反查:
- 在模板中:使用url 模板標簽。
- 在Python 代碼中:使用
django.core.urlresolvers.reverse()
?函數。 - 在更高層的與處理Django 模型實例相關的代碼中:使用
get_absolute_url()
?方法。
二、方式:
1、先配置URL
from django.conf.urls import urlfrom . import viewsurlpatterns = [#...url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),#... ]
2、在模版中使用URL反向生成
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a><ul> {% for yearvar in year_list %} <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li> {% endfor %} </ul>
3、在py中使用
from django.core.urlresolvers import reverse from django.http import HttpResponseRedirectdef redirect_to_year(request):# ...year = 2006# ...return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
其他:
url(r'^app01/', include('app01.urls', 'app01', 'app01')),# app01.urls url(r'^index/(?P<name>\w+)/$', views.index, name='index'),# url(r'^app01/', ([ # url(r'^index/(?P<name>\w+)/$', views.index, name='index'), # ], 'app01', 'app01')),
from django.shortcuts import HttpResponse
from django.urls import reverse
def index(request, name):print(reverse('app01:index', kwargs={'name': name}))return HttpResponse('ok')
?