在Django中创建第一个静态视图


Posted in Python onJuly 15, 2015

正如我们的第一个目标,创建一个网页,用来输出这个著名的示例信息:

Hello world.

如果你曾经发布过Hello world页面,但是没有使用网页框架,只是简单的在hello.html文本文件中输入Hello World,然后上传到任意的一个网页服务器上。 注意,在这个过程中,你已经说明了两个关于这个网页的关键信息: 它包括(字符串 "Hello world")和它的URL( http://www.example.com/hello.html , 如果你把文件放在子目录,也可能是 http://www.example.com/files/hello.html)。

使用Django,你会用不同的方法来说明这两件事 页面的内容是靠view function(视图函数) 来产生,URL定义在 URLconf 中。首先,我们先写一个Hello World视图函数。

在上一章使用django-admin.py startproject制作的mysite文件夹中,创建一个叫做views.py的空文件。这个Python模块将包含这一章的视图。 请留意,Django对于view.py的文件命名没有特别的要求,它不在乎这个文件叫什么。但是根据约定,把它命名成view.py是个好主意,这样有利于其他开发者读懂你的代码,正如你很容易的往下读懂本文。

我们的Hello world视图非常简单。 这些是完整的函数和导入声明,你需要输入到views.py文件:

from django.http import HttpResponse

def hello(request):
  return HttpResponse("Hello world")

我们逐行逐句地分析一遍这段代码:

  •     首先,我们从 django.http 模块导入(import) HttpResponse 类。参阅附录 H 了解更多关于 HttpRequest 和 HttpResponse 的细节。 我们需要导入这些类,因为我们会在后面用到。
  •     接下来,我们定义一个叫做hello 的视图函数。
  •     每个视图函数至少要有一个参数,通常被叫作request。 这是一个触发这个视图、包含当前Web请求信息的对象,是类django.http.HttpRequest的一个实例。在这个示例中,我们虽然不用request做任何事情,然而它仍必须是这个视图的第一个参数。
  •     注意视图函数的名称并不重要;并不一定非得以某种特定的方式命名才能让 Django 识别它。 在这里我们把它命名为:hello,是因为这个名称清晰的显示了视图的用意。同样地,你可以用诸如:hello_wonderful_beautiful_world,这样难看的短句来给它命名。 在下一小节(Your First URLconf),将告诉你Django是如何找到这个函数的。
  •     这个函数只有简单的一行代码: 它仅仅返回一个HttpResponse对象,这个对象包含了文本“Hello world”。

这里主要讲的是: 一个视图就是Python的一个函数。这个函数第一个参数的类型是HttpRequest;它返回一个HttpResponse实例。为了使一个Python的函数成为一个Django可识别的视图,它必须满足这两个条件。 (也有例外,但是我们稍后才会接触到。
你的第一个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),
)

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

我们做了两处修改。

  1.     首先,我们从模块 (在 Python 的 import 语法中, mysite/views.py 转译为 mysite.views ) 中引入了 hello 视图。 (这假设mysite/views.py在你的Python搜索路径上。关于搜索路径的解释,请参照下文。)
  2.     接下来,我们为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页面。

Python 相关文章推荐
Python扫描IP段查看指定端口是否开放的方法
Jun 09 Python
利用Python自动监控网站并发送邮件告警的方法
Aug 24 Python
Python 基础知识之字符串处理
Jan 06 Python
Python实现对字符串的加密解密方法示例
Apr 29 Python
批量将ppt转换为pdf的Python代码 只要27行!
Feb 26 Python
《与孩子一起学编程》python自测题
May 27 Python
Python多进程与服务器并发原理及用法实例分析
Aug 21 Python
Django JWT Token RestfulAPI用户认证详解
Jan 23 Python
详解Python中import机制
Sep 11 Python
Python项目实战之使用Django框架实现支付宝付款功能
Feb 23 Python
详解Go语言运用广度优先搜索走迷宫
Jun 23 Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
Apr 09 Python
开始着手第一个Django项目
Jul 15 #Python
Python的Django框架可适配的各种数据库介绍
Jul 15 #Python
Python的Django框架安装全攻略
Jul 15 #Python
python实现爬虫下载美女图片
Jul 14 #Python
Python实现查找系统盘中需要找的字符
Jul 14 #Python
Python删除空文件和空文件夹的方法
Jul 14 #Python
Python实现批量将word转html并将html内容发布至网站的方法
Jul 14 #Python
You might like
PHP 八种基本的数据类型小结
2011/06/01 PHP
PHP实现的简单日历类
2014/11/29 PHP
PHP操作Redis常用命令的实例详解
2020/12/23 PHP
javascript实现点击单选按钮链接转向对应网址的方法
2015/08/12 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
Servlet实现文件上传,可多文件上传示例
2016/12/05 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
详解微信UnionID作用
2019/05/15 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
2019/08/26 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
[02:50]2014DOTA2 TI预选赛预选赛 大神专访第一弹!
2014/05/21 DOTA
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
解决Django连接db遇到的问题
2019/08/29 Python
python将字符串转变成dict格式的实现
2019/11/18 Python
keras中的backend.clip用法
2020/05/22 Python
Python爬虫实现selenium处理iframe作用域问题
2021/01/27 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
判断单链表中是否存在环
2012/07/16 面试题
俄语专业毕业生推荐信
2013/10/28 职场文书
委托书如何写
2014/08/30 职场文书
支教个人总结
2015/03/04 职场文书
施工安全员岗位职责
2015/04/11 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS
浅析python中特殊文件和特殊函数
2022/02/24 Python