您的位置:首页 > 编程语言 > Go语言

django--URL配置

2017-09-07 23:16 155 查看


你的第一个URLconf

现在,如果你再运行:python manage.py runserver,你还将看到Django的欢迎页面,而看不到我们刚才写的Hello world显示页面。 那是因为我们的mysite项目还对hello视图一无所知。我们需要通过一个详细描述的URL来显式的告诉它并且激活这个视图。 (继续我们刚才类似发布静态HTML文件的例子。现在我们已经创建了HTML文件,但还没有把它上传至服务器的目录。)为了绑定视图函数和URL,我们使用URLconf。

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

前一章中执行 django-admin.py startproject 时,该脚本会自动为你建了一份
URLconf(即 urls.py 文件)。
默认的urls.py会像下面这个样子:
from django.conf.urls.defaults import *

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
# Example:
# (r'^mysite/', include('mysite.foo.urls')),

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

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


默认的URLconf包含了一些被注释起来的Django中常用的功能,仅仅只需去掉这些注释就可以开启这些功能. 下面是URLconf中忽略被注释的行后的实际内容
from django.conf.urls.defaults import *

urlpatterns = patterns('',
)


让我们逐行解释一下代码:

第一行导入django.conf.urls.defaults下的所有模块,它们是Django URLconf的基本构造。 这包含了一个patterns函数。

第二行调用 patterns() 函数并将返回结果保存到 urlpatterns 变量。patterns函数当前只有一个参数—一个空的字符串。
(这个字符串可以被用来表示一个视图函数的通用前缀。具体我们将在第八章里面介绍。)

当前应该注意是 urlpatterns 变量,
Django 期望能从 ROOT_URLCONF 模块中找到它。
该变量定义了 URL 以及用于处理这些 URL 的代码之间的映射关系。 默认情况下,URLconf 所有内容都被注释起来了——Django 应用程序还是白版一块。 (注:那是上一节中Django怎么知道显示欢迎页面的原因。 如果 URLconf 为空,Django 会认定你才创建好新项目,因此也就显示那种信息。

如果想在URLconf中加入URL和view,只需增加映射URL模式和view功能的Python tuple即可. 这里演示如何添加view中hello功能.
from django.conf.urls.defaults import *
from mysite.views import hello

urlpatterns = patterns('',
('^hello/$', hello),
)


请留意:为了简洁,我们移除了注释代码。 如果你喜欢的话,你可以保留那些行。)

我们做了两处修改。

首先,我们从模块 (在 Python 的 import 语法中, mysite/views.py 转译为 mysite.views )
中引入了hello 视图。
(这假设mysite/views.py在你的Python搜索路径上。关于搜索路径的解释,请参照下文。)

接下来,我们为urlpatterns加上一行: (‘^hello/$’, hello), 这行被称作URLpattern,它是一个Python的元组。元组中第一个元素是模式匹配字符串(正则表达式);第二个元素是那个模式将使用的视图函数。

简单来说,我们只是告诉 Django,所有指向 URL /hello/ 的请求都应由 hello 这个视图函数来处理。

Python 搜索路径

Python 搜索路径 就是使用 import 语句时,Python
所查找的系统目录清单。

举例来说,假定你将 Python 路径设置为['','/usr/lib/python2.4/site-packages','/home/username/djcode/'] 。如果执行代码 from foo import bar,Python
将会首先在当前目录查找 foo.py 模块(
Python 路径第一项的空字符串表示当前目录)。 如果文件不存在,Python将查找 /usr/lib/python2.4/site-packages/foo.py 文件。

如果你想看Python搜索路径的值,运行Python交互解释器,然后输入:
>>> import sys
>>> print sys.path


通常,你不必关心 Python 搜索路径的设置。 Python 和 Django 会在后台自动帮你处理好。

讨论一下URLpattern的语法是值得的,因为它不是显而易见的。 虽然我们想匹配地址/hello/,但是模式看上去与这有点差别。 这就是为什么:

Django在检查URL模式前,移除每一个申请的URL开头的斜杠(/)。 这意味着我们为/hello/写URL模式不用包含斜杠(/)。(刚开始,这样可能看起来不直观,但这样的要求简化了许多工作,如URL模式内嵌,我们将在第八章谈及。)

模式包含了一个尖号(^)和一个美元符号($)。这些都是正则表达式符号,并且有特定的含义: 上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。

最好还是用范例来说明一下这个概念。 如果我们用尾部不是$的模式’^hello/’,那么任何以/hello/开头的URL将会匹配,例如:/hello/foo 和/hello/bar,而不仅仅是/hello/。类似地,如果我们忽略了尖号(^),即’hello/$’,那么任何以hello/结尾的URL将会匹配,例如:/foo/bar/hello/。如果我们简单使用hello/,即没有^开头和$结尾,那么任何包含hello/的URL将会匹配,如:/foo/hello/bar。因此,我们使用这两个符号以确保只有/hello/匹配,不多也不少。

你大多数的URL模式会以^开始、以$结束,但是拥有复杂匹配的灵活性会更好。

你可能会问:如果有人申请访问/hello(尾部没有斜杠/)会怎样。 因为我们的URL模式要求尾部有一个斜杠(/),那个申请URL将不匹配。 然而,默认地,任何不匹配或尾部没有斜杠(/)的申请URL,将被重定向至尾部包含斜杠的相同字眼的URL。 (这是受配置文件setting中APPEND_SLASH项控制的,参见附件D。)

如果你是喜欢所有URL都以’/’结尾的人(Django开发者的偏爱),那么你只需要在每个URL后添加斜杠,并且设置”APPEND_SLASH”为”True”. 如果不喜欢URL以斜杠结尾或者根据每个URL来决定,那么需要设置”APPEND_SLASH”为”False”,并且根据你自己的意愿来添加结尾斜杠/在URL模式后.

另外需要注意的是,我们把hello视图函数作为一个对象传递,而不是调用它。 这是 Python (及其它动态语言的) 的一个重要特性: 函数是一级对象(first-class objects), 也就是说你可以像传递其它变量一样传递它们。 很酷吧?

启动Django开发服务器来测试修改好的 URLconf, 运行命令行 python manage.py runserver 。
(如果你让它一直运行也可以,开发服务器会自动监测代码改动并自动重新载入,所以不需要手工重启) 开发服务器的地址是http://127.0.0.1:8000/ ,打开你的浏览器访问 http://127.0.0.1:8000/hello/
你就可以看到输出结果了。 开发服务器将自动检测Python代码的更改来做必要的重新加载, 所以你不需要重启Server在代码更改之后。服务器运行地址`` http://127.0.0.1:8000/`` ,所以打开浏览器直接输入`` http://127.0.0.1:8000/hello/`` ,你将看到由你的Django视图输出的Hello world。

万岁! 你已经创建了第一个Django的web页面。

正则表达式

正则表达式 (或 regexes ) 是通用的文本模式匹配的方法。 Django URLconfs 允许你 使用任意的正则表达式来做强有力的URL映射,不过通常你实际上可能只需要使用很少的一 部分功能。 这里是一些基本的语法。
符号匹配
. (dot)任意单一字符
\d任意一位数字
[A-Z]A 到 Z中任意一个字符(大写)
[a-z]a 到 z中任意一个字符(小写)
[A-Za-z]a 到 z中任意一个字符(不区分大小写)
+匹配一个或更多 (例如, \d+ 匹配一个或 多个数字字符)
[^/]+一个或多个不为‘/’的字符
?零个或一个之前的表达式(例如:\d? 匹配零个或一个数字)
*匹配0个或更多 (例如, \d* 匹配0个 或更多数字字符)
{1,3}介于一个和三个(包含)之前的表达式(例如,\d{1,3}匹配一个或两个或三个数字)
有关正则表达式的更多内容,请访问 http://www.djangoproject.com/r/python/re-module/.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: