`
美丽的小岛
  • 浏览: 298282 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Django_urls.py(01)

 
阅读更多

Django 框架中,urls.py 的设置很关键,它决定了所有页面的 URL 长什么样子。所以很有必要我们开一个专题来探讨它的使用。

我们先来粗略看看 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('',
    # Examples:
    # url(r'^$', 'nowamagic.views.home', name='home'),
    # url(r'^nowamagic/', include('nowamagic.foo.urls')),

    # Uncomment the admin/doc line below to enable admin documentation:
    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

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

 

前面也谈过,只要配置这么一条规则:

(r'^hello/$',hello),

就可以定义 http://127.0.0.1:8000/hello/ 路径显示 views.py 中的 hello 函数。

  •  
    模式包含了一个尖号(^)和一个美元符号($)。这些都是正则表达式符号,并且有特定的含义:上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。^hello/$匹配hello/字符串,即在网址http://127.0.0.1:8000/hello/找到hello/后,使用hello()函数显示出来,如果没有'$'结尾,则网址中输入hello1/;hello2/都会对应以hello()函数显示出来。

hello 函数我们随便写写:

from django.http import HttpResponse,Http404

def hello(request): 	#每个视图函数至少要有一个参数,通常被叫作request。 
    return HttpResponse("Hello NowaMagic!")	#一个视图功能必须返回一个HttpResponse

 

那么我需要显示首页,就是域名直接映射到某个 view 函数下,那么又怎么写呢?

(r'^$', index),

index 函数就是生成首页的 view 函数。

顺便说下,在 view 函数里,return HttpResponseRedirect('../'):返回主页,即127.0.0.1。

 

***************************************************************************************************

urls.py 的规则

URL配置(URLconf)就像是 Django 所支撑网站的目录。它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。 你就是以这种方式告诉 Django,对于这个 URL 调用这段代码,对于那个 URL 调用那段代码。 例如,当用户访问/foo/时,调用视图函数foo_view(),这个视图函数存在于Python模块文件view.py中。

  •  
    执行 django-admin.py startproject 时,该脚本会自动为你建了一份 URLconf(即 urls.py 文件)。在同时自动创建的settings.py文件中,创建一个变量ROOT_URLCONF,其变量的值就是根URLconf的模块名。默认值是urls.py文件的模块名。

例如:我的 Django 项目的根目录名为“pearl”,ROOT_URLCONF的默认值为“pearl.urls”。我们知道,urls.py 是用来配置 URL 的,那么它是如何工作的呢?

我们先来看看这个规则的原型:

from django.conf.urls.defaults import *
urlpatterns = patterns('',
    (r'^login/$', openid_login, {}, 'openid-login'),
)

即:

from django.conf.urls.defaults import *
urlpatterns = patterns(前缀,
    (表达式, 视图函数, 视图函数, 名称),
)

“前缀”会在视图函数里面会自动加上指引。view = prefix + '.' + view,最后调用RegexURLPattern(regex, view, kwargs, name)。

那么 RegexURLPattern() 又是长什么样子呢?先看看,暂不作深入讨论。

class RegexURLPattern(object):
    def __init__(self, regex, callback, default_args=None, name=None):
        self.regex = re.compile(regex, re.UNICODE)
        if callable(callback):
            self._callback = callback

URL的规则,Django会如何处理?

要弄清Django如何处理URL配置规则,先要了解几个概念。

  • URL模式:URL模式是指在Django urls模块中,名为urlpatterns的元组中包含的每一个值。通常由patterns方法生成urlpatterns元组的内容。
  • URL分解器:通常,一个URL分解器对应一个URL配置模块,它可以包含多个URL模式,也可以包含多个其他URL分解器。通过这种包含结构设计,实现Django对URL的层级解析。URL分解器是Django实现app与项目解耦的关键。通常由include方法操作的URL配置模块,最终会被解释成为URL分解器。
  • 匹配结果:匹配结果是指当URL被正确匹配时,需返回的匹配结果。

由于每个处理方式都需要一定篇幅介绍,故这里只作概念介绍,具体的介绍放在后面的小节里。

 

 

 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics