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



添加:

          当请求的url没有后面的斜线时,由Django的APPEND_SLASH自动添加上去,这个设置在安装的django库中有,

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







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,关于DjangoURL解析的定义方法,我来简单地介绍一下。 在Django中,URL解析是指将客户端请求的URL地址和对应的视图函数进行匹配的过程Django中通过URLConf文件来定义URL解析规则,URLConf文件是一个Python模块,它包含了一个URL模式列表,每个URL模式都由一个正则表达式和一个视图函数组成。 下面是Django URL解析的定义方法: 1. 在某个应用(app)的目录下创建`urls.py`文件; 2. 导入Django的`urls`模块:`from django.urls import path`; 3. 定义一个URL模式列表,每个模式都由一个正则表达式和一个视图函数组成; 4. 使用`path()`函数定义URL模式,其中第一个参数是正则表达式,第二个参数是视图函数,第三个参数是该URL模式的名称,可以用于反向解析; 5. 在项目的`urls.py`文件中导入应用(app)的`urls.py`文件,并将该应用的URL模式列表加入到项目URL模式列表中。 下面是一个简单的例子: ```python # app_name/urls.py from django.urls import path from . import views urlpatterns = [ path('hello/', views.hello, name='hello'), ] ``` ```python # project_name/urls.py from django.urls import path, include urlpatterns = [ path('app_name/', include('app_name.urls')), ] ``` 在上面的例子中,定义了一个URL模式,当用户访问`/app_name/hello/`时,Django就会调用`views.hello`函数来处理请求。 以上就是DjangoURL解析的定义方法的简要介绍,希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值