Django的url解析

Django中採用正則表達式來匹配所請求的url,這個叫做URLconf,作爲MVC中的C(控制器),

這樣再調用相應的試圖,達到控制器控制試圖的顯示的效果。

看一下Django的url解析過程

第一步:

            我的項目叫做mysite,結構如下:

zhang@h:~/workspace/python-web$ tree mysite/
mysite/
├── hello
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── templates
│   │   └── base_site.html
│   ├── urls.py
│   ├── urls.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
└── polls
    ├── admin.py
    ├── admin.pyc
    ├── __init__.py
    ├── __init__.pyc
    ├── models.py
    ├── models.pyc
    ├── tests.py
    ├── urls.py
    ├── urls.py~
    ├── urls.pyc
    ├── views.py
    └── views.pyc

其中,hello文件是sqlite3生成的sql文件,有一個模塊polls

            當在地址欄輸入http://localhost:8000/polls/34

            Django會加載由mysite/settings.py文件指定的ROOT_URLCONF指定的模塊文件

            我的ROOT_URLCONF='mysite.urls'

            當加載進入polls.urls文件時,會查找變量urlpatterns 然後變量所有的正則,並調用相應的include()函數,

            但請注意:這裏的正則沒有$符號,但有一個反斜"/",在這裏,Django會切掉所匹配的部分url,並把剩餘的

            部分給include()中的URLconf進一步處理:如

            url請求:http://localhost:8000/polls/34/

           mysite/urls:

zhang@h:~/workspace/python-web$ cat mysite/mysite/urls.py
from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',

    url(r'^polls/', include('polls.urls')),
    # Uncomment the next line to enable the admin:
    url(r'^admin/', include(admin.site.urls)),

          這裏會匹配polls/,然後把剩下的部分34給include()所包含的URLconf,即polls.urls處理

           polls/urls.py:

zhang@h:~/workspace/python-web/mysite$ cat polls/urls.py
#!/usr/bin/python
#-*- coding:utf-8 -*- 
# Filename: urls.py
# Author: xiaobing
# E-mail: [email protected]
# Date: 2013-09-01
# Description: 

from django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('',
	#ex: /polls/
	url(r'^$', views.index, name='index'),
	#ex: /polls/5/
	url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
	#ex: /polls/5/results/
	url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
		
	#ex: /polls/5/vote/
	url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
	
)

           這時,34/會被傳入polls/urls.py文件中,並查找urlpatterns變量,並逐個匹配正則,其中:

                 \d+匹配數字,那麼34被匹配成功,

                 r'^(P<poll_id>\d+)'結果爲: detail(request=<HttpRequest object>, poll_id='34')

                poll_id=34是由正則(?P<poll_id>\d+)捕獲的,並把變量值賦值給poll_id,這樣,再調用第二個參數

      試圖views.detail,然後detail返回httpResponse對象的數據給客戶端,這樣就完成了url的請求和響應


     總結一下:

           在mysite/mysite.py中會匹配'^polls/',把剩下的部分給include()函數調用的URLconf處理

           polls/urls.py匹配'\d+'匹配34,並有(?P<poll_id>\d+).將其捕獲並賦值到poll_id中,並調用

                          url函數的第二個參數試圖polls/views.py中的detial()函數來處理,最終返回到客戶端

             

注意:在URLconf中的url()函數的第一個參數正則表達式不搜索GET和POST參數,或者協議,域名,端口號,例如:

http://localhost:8000/myapp,這個URLconf只匹配myapp/,然而,http://localhost:8000/myapp:?page=3也只匹配

myapp



添加:

          當請求的url沒有後面的斜線時,由Django的APPEND_SLASH自動添加上去,這個設置在安裝的django庫中有,

          我的文件在:/usr/local/lib/python2.7/dist-packages/django/conf/global_settings.py中







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章