Django視圖之URLconfs

對於一個web程序而言,接收和處理用戶的請求並返回響應是一個最基本的、也是最重要的功能。html

Django爲這個功能取了一個好聽的名字——「視圖」。python

而具體的代碼實現每每是經過一個個函數,Django中也叫作視圖函數web

 

URL調度器正則表達式

Django對於URL的設計都放在一個叫作URLconf的模塊中(urls.py)。express

在該模塊中,對URL pattern和視圖函數進行了映射。django

 

處理一個請求:app

1.Django肯定所使用的根URLconf模塊,一般就是settings中的ROOT_URLCONF(字符串)這個變量。函數

   若是HTTPRequest有一個urlconf屬性,則使用該屬性設置的值覆蓋ROOT_URLCONF的值。url

2.在模塊中查詢urlpatterns變量,他是一個包含django.conf.urls.url()實例的列表。spa

url(regex, view, kwargs=None, name=None)
:param str|ugettext_lazy()  regex: 表示一個正則表達式,一般使用原始字符串(r'')。
注意:\d是個例外,r'\d'表示十進制整數而不是字符串'\d'。
:param func view: 視圖函數、as_view()或者 include()。
:param dict kwargs: 用來向視圖函數傳遞額外的參數。
:param str name: urlpattern的別名。

 3.Django依此遍歷urlpatterns,直到第一次匹配request.path

4.Django導入匹配到的視圖函數並執行。傳遞給函數的參數有:

  • HTTPRequest的實例
  • 若是匹配的正則不返回命名組,則匹配到的對象會以位置參數的形式傳遞給函數
  • 若是匹配的正則返回命名組,則該命名組會以關鍵字參數(key='value')的方式傳給函數。若是kwargs中有同名的鍵,則該命名組的值會被覆蓋。

5.若是匹配不到或者中間出現異常,則會調用相應的異常處理函數。詳情參見Error handling

注意:

  • 要給URL傳值,只須要在regex中使用括號包含該值便可(r'^articles/([0-9]{4})/$')。
  • 不須要在regex最開始處加'/'。
  • 關於原始字符串的討論可參見Dive Into Python’s explanation

命名組

正則中命名組的語法:

 (?P<name>pattern)

name是命名組的名字,pattern是匹配的模式。

區別:

 views.month_archive(request, year='2005', month='03'), instead of views.month_archive(request, '2005', '03').

 URLconf的本質就是不包含域名,方案,方法參數的字符串,相似資源路徑,不以'/'開始。

 

include()

include(module, namespace=None, app_name=None)
:param str module: URLconf模塊
:param str namespace: URL條目的實例名稱空間
:param str app_name: URL條目的應用程序的名稱空間

include(pattern_list)
:param list pattern_list: django.conf.urls.url()的實例

 

內嵌的捕捉參數

regex中的非捕捉參數

(?:...)

 

反向解析URL

# 在模板中
<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
from django.http import HttpResponseRedirect

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

 帶有名稱空間的反向解析:

# 在模板中
{% url 'polls:index' %}

# 在代碼中
reverse('polls:index', current_app=self.request.resolver_match.namespace)

 

reverse()

reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None
:param str|func viewname: urlpattern的名稱或者視圖函數
:param str urlconf: 包含urlpattern的模塊
:param all args: 傳遞給URL的參數
:param dict kwargs: 傳遞給URL的參數
:param current_app: 應用程序的名稱空間。
相關文章
相關標籤/搜索