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

Django的url解析的更多相关文章

  1. Django之逆向解析url

    Django中提供了一个关于URL的映射的解决方案,你可以做两个方向的使用: 1.有客户端的浏览器发起一个url请求,Django根据URL解析,把url中的参数捕获,调用相应的试图, 获取相应的数据 ...

  2. Django学习笔记之Django的url反向解析

    0x00 URL反向解析和三种不同的反向解析方式 Django中提供了关于URL的映射的解决方案,可以做两个方向的使用: 1.普通解析过程:由客户端的浏览器发起一个url请求,Django根据URL解 ...

  3. Django 的逆向解析url(转)

    Django中提供了一个关于URL的映射的解决方案,你可以做两个方向的使用: 1.有客户端的浏览器发起一个url请求,Django根据URL解析,把url中的参数捕获,调用相应的试图, 获取相应的数据 ...

  4. Django 的逆向解析url--reverse(转)

    https://www.cnblogs.com/zhenfei/p/6368955.html Django中提供了一个关于URL的映射的解决方案,你可以做两个方向的使用: 1.有客户端的浏览器发起一个 ...

  5. Python - Django - 命名 URL 和反向解析 URL

    命名 URL: test.html: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  6. Django之url反向解析

    在urls.py文件中,在进行url映射时,为请求的url命个名,以便在模板页面或者views.py视图中可以进行反向解析,同时在修改了url映射的请求路径,名称不变的情况下,不再修改模板页面或者视图 ...

  7. Django的URL路由系统

    一. URL配置 URL配置就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图之间的映射表.你就是以这种方式告诉Django,对于哪个URL调用的这段代码. 基本格式 from ...

  8. Django之URL路由系统

    一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...

  9. Django之url路由

    Django之url路由 url路由介绍 url路由是关联url及其视图函数关系的过程. 作用就是使views里面处理数据的函数与请求的url建立映射关系 url路由配置 Django的url路由配置 ...

随机推荐

  1. win7如何快速设置开机启动项?

    添加开机启动项方法: 找到windows开始菜单->所有程序->启动,右键打开, 进入C:\Users\Ocean\AppData\Roaming\Microsoft\Windows\St ...

  2. CentOS7 安装JDK

    链接地址:http://jingyan.baidu.com/article/c74d60007b85510f6a595dfa.html VMware 10 centos 安装jdk 及mysql 方法 ...

  3. Python之路:Python 函数

    一.函数式编程:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装 二. 函数的定义和使用 def 函数名(参数): ... 函数体 ... 函数的定义主要有 ...

  4. Code 49 码

    Code 49码是一种多层.连续型.可变长度的条码符号,它可以表示全部的128个ASCII字符.每个Code 49条码符号由2到8层组成,每层有18个条和17个空.层与层之间由一个层分隔条分开.每层包 ...

  5. QT学习 之 QwtPlot(数学绘图)

    QT对于统计图像.函数图像等的绘制是没有相关组件的帮助的,只有利用手工绘制图片. QwtPlot是用来绘制二维图像的widget,继承自QFrame 和 QwtPlotDict.不过严格的说来,它只是 ...

  6. 生成唯一32位ID编码代码Java(GUID)

    源码下载链接:http://pan.baidu.com/s/1jGCEWlC 扫扫关注"茶爸爸"微信公众号 坚持最初的执着,从不曾有半点懈怠,为优秀而努力,为证明自己而活. /* ...

  7. Uva 572 Oil Deposits

    思路:可以用DFS求解.遍历这个二维数组,没发现一次未被发现的‘@’,便将其作为起点进行搜索.最后的答案,是这个遍历过程中发现了几次为被发现的‘@’ import java.util.*; publi ...

  8. javascript使用消息框

    之前很多地方都用过alert,它的作用是弹出一个警告框,我们调用的方法是alert("输入的内容");其实更正确的写法是 window.alert("输入的内容" ...

  9. Android Touch事件传递机制具体解释 上

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/37961997 近期总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,曾经 ...

  10. hadoop源代码解读namenode高可靠:HA;web方式查看namenode下信息;dfs/data决定datanode存储位置

    点击browserFilesystem,和命令查看结果一样 当我们查看hadoop源代码时,我们看到hdfs下的hdfs-default.xml文件信息 我们查找${hadoop.tmp.dir}这是 ...