zoukankan      html  css  js  c++  java
  • 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: xiaobingzhang29@gmail.com
    # 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









  • 相关阅读:
    JDK集合框架--LinkedList
    JDK集合框架--ArrayList
    JDK集合框架--综述
    JDK常用类解读--StringBuffer、StringBuilder
    JDK常用类解读--String
    【spring 注解驱动开发】扩展原理
    【spring 注解驱动开发】spring事务处理原理
    【spring 注解驱动开发】Spring AOP原理
    【spring 注解驱动开发】spring自动装配
    【spring 注解驱动开发】spring对象的生命周期
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3297302.html
Copyright © 2011-2022 走看看