對於一個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導入匹配到的視圖函數並執行。傳遞給函數的參數有:
5.若是匹配不到或者中間出現異常,則會調用相應的異常處理函數。詳情參見Error handling。
注意:
命名組
正則中命名組的語法:
(?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
reverse()
。get_absolute_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: 應用程序的名稱空間。