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









 

你可能感兴趣的:(django)