第一个基于Django的页面:Hello World
使用Django,页面的内容是靠view function(视图函数)来产生,URL定义在URLconf中。首先,我们先写一个Hello Word的视图函数
第一份视图
views.py这个Python模块包含视图。Django对于views.py的文件命名没有特别的要求,他不在乎这个文件叫什么。但是根据约定,把它命名成view.py is a good idea,这样有利于其他开发者读懂你的代码。
Hello World视图很简单,你需要输入到views.py文件
from django.http import HttpResponse
# Create your views here.
def hello(request):
return HttpResponse('<h1>Hello World!</h1>')
我们定义了一个叫hello的视图函数。每个视图函数至少要有一个参数,通常被叫做request。这是一个触发这个视图、包含当前Web请求信息的对象,是类django.http.HttpRequest的一个实例。在这个实例中,我们虽然不用request做任何事情,然而他必须是这个视图的第一个参数。
注意视图函数的名称并不重要,并不一定非得以某种特定的方式命名才能让Django识别它。在这里我们把它命名为:hello,是因为这个名称清晰的显示了视图的用意。
一个视图就是Python的一个函数。这个函数的第一个参数的类型是HttpRequest;它返回一个HttpResponse实例。为了使一个Python的函数成为一个Django可识别的视图,他必须满足这两个条件。
第一个URLconf
现在,如果你运行:python manage.py runserver,你还不能看到Hello World显示页面。我们需要通过一个详细描述的URL来显示的告诉它并且激活这个视图。为了绑定视图函数和URL,我们使用URLconf
URLconf就像是Django所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表。你就是以这种方式告诉Django,对于这个Url调用这段代码,对于那个url调用那段代码。
默认的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应用程序还是白版一块。
如果想在URLconf中加入URL和view,只需增加映射URL模式和view功能的Python tuple即可,这里演示如何添加view中hello功能。
from django.conf.urls import url
from django.contrib import admin
from hello.views import hello
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello/$', hello),
]
首先,我们从模块中引入了hello视图,接下来,我们只是告诉Django,所有指向URL/hello的请求都应由hello这个视图函数来处理。
至此,运行在工程目录下运行python manager.py runserver项目即可正常运行(首次运行时,我们还必须先运行python manage.py mirgate,然后运行python manager.py runserver,创建保存session的数据库,(Python自带的sqlite))
Python 搜索路径
Python搜索路径就是使用import语句时,Python所查找的系统目录清单
举例来说,假定你将Python路径设置为['','dir1','dir2']。如果执行代码from foo import bar,Python将会首先在当前目录查找foo,py模块(Python路径第一项空字符串表示当前目录)。如果文件不存在,Python将查找dir1/foo.py文件。
如果你想看Python搜索路径的值,运行Python交互解释器,然后输入:
通常,你不必关心Python的搜索路径的设置。Python和Django会在后台自动帮你处理好。
Django URL匹配
Django在检查URL模式前,移除每一个申请的URL开头的斜杠(/)。这意味着我们为/hello写URL模式不用包含斜杠
模式包含了一个尖号(^)和一个美元符号($)。这些都是正则表达式符号,并且有特定的含义:上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。
如果我们用尾部不是$的模式‘^hello/’,那么任何以/hello/开头的URL将会匹配,例如:/hello/foo和hello/bar,而不仅仅是/hello/。类似地,如果我们忽略了尖号(^),即'hello/$',那么任何以hello/结尾的URL将会匹配,例如:/foo/bar/hello/。如果我们简单使用/hello,即没有^开头和'$'结尾,那么任何包含hello/的url将会匹配。因此,我们使用这两个符号一确保只有/hello/匹配,不多也不少。
另外需要注意的是,我们把hello视图函数作为一个对象传递,而不是调用它。这是Python的一个重要特性:函数是一级对象(first-class objects),也就是说你可以象传递其他变量一样传递他们。
Django是怎么处理请求的
所有均开始于setting文件。当你运行python manage.py runserver,脚本将在于manage.py同一个目录下查找名为setting.py的文件。这个文件包含了所有有关这个Django项目的配置信息,均大写:TEMPLATE_DIRS,DATABASE_NAME等。最重要的设置是ROOT_URLCONF,它将作为URLconf告诉Django在这个站点中哪些Python的模块Django根据ROOT_URLCONF的设置装载URLconf。然后按顺序逐个匹配URLconf里的URLpatterns,直到找到一个匹配的。当找到这个匹配的URLpatterns就调用相关联的view函数,并把HttpRequest对象最为第一个参数。
一个视图功能必须返回一个HttpResponse。一旦做完,Django将完成剩余的转换Python对象到一个合适的带有HTTP头和body的Web Response。
总结:
1.进来的请求转入/hello/
2.Django通过ROOT_URLCONF配置来决定跟URLconf
3.Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目
4.如果找到匹配,将调用相应的视图函数
5.视图函数返回一个HttpResponse
6.Django转换HttpResponse为一个适合的HTTP Response,以web page显示出来。
URL配置和松耦合
在Django的应用程序中,URL的定义和视图之间是松耦合的,换句话说,决定URL返回哪个视图函数和实现这个视图函数是在两个不同的地方。