开始制作我们网站的第一个界面:Hello World。
在我们没有学习过Web框架的时候我们编写一个“Hello World”的界面,我们只需要手写一个HTML文件然后将其放到我们的Web服务器的一个目录中即可。就像在GitHub中部署一样。
可以说视图和url配置是部署一个网站最重要的东西了。
下面我们来开始我们的第一个视图。
我们在urls.py所在的目录下创建一个名为 views.py的文件。然后写入如下内容。
#views.py from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")
我们从django.http中导入了一个名为HttpResponse的类。(根据类名可以看出起重要功能是用于http服务中的response请求。
下面我们定义了一个hello的函数。每个view函数必须要有一个参数,其通常被称为request。这是一个对象,包含了出发这个view函数的Web请求信息。如果没有这个request参数,我们的函数就不能得到来自于Web的请求信息。
一个视图本身就是一个python的函数,这个函数接受一个HttpResponse作为其第一个参数,并返回一个HttpResponse实例,这是一个python函数作为Django视图的两个必要条件。
下面我们介绍Django如何找到上述的view视图。
如果你对Web方便有一点经验的话你就应该知道我们是通过urls.py来进行视图寻找的。
下面附上该文件的原始内容
"""mysite URL Configuration The `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.10/topics/http/urls/ Examples: Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ from django.conf.urls import url from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), ]
下面我们加上我们需要的代码
from mysite import views urlpatterns = patterns( 。。。 url(r'^hello/$', views.hello), )
我么可以看到我们通过正则表达式来匹配hello,然后使用我们的views文件中hello函数。相信你已经对其工作原理有所了解了。
在这里我们告诉django所有对url/hello/的请求都由hello这个函数来处理。
这时候我们打开网站会显示 Page not found 。这是因为在我们没有添加任何内容之前Django是初始化文件,所以会有欢迎界面,这时候我们已经添加内容,所以访问 http://127.0.0.1:8000/
我们会得到如上信息。这是因为我们没有在urls.py中指定该链接的处理函数。
我们访问 http://127.0.0.1:8000/hello/ 就会得到,hello world界面。Django在后台都做了那些让该页面得以成功输出呢?所有的均开始于 setting.py文件,自动创建的 settings.py 包括了 ROOT_URLCONF ,并且将其指向了自动生产的 urls.py 。
当你访问一个特定的URL时,比如 /hello/ , Django会加载 ROOT_URLCONF 指向的URLconf, 然后按顺序逐个检查里面的URLpattern,直到找到和请求的URL匹配的URLpattern。当找到匹配的URLpattern后, Django会调用和这个URLpattern相关联的view function,并把当前的请求作为一个 HttpRequest 对象 传到view function的第一个参数。
说了那么多,然并卵。这不适合我以前写的HTML差不多么。我们的“Hello world”视图是用来演示Django的工作方式,它还不是一个 动态 的网页,因为 它的内容总是一样的。每次你访问 /hello/ 都会看到一样的内容,这还是和一个静态HTML文件 一样。
下面我们开始举另一个栗子,让页面每次刷新的时候都会显示当时的服务器时间。这个视图(view)需要做两件事,第一:计算当前时间,第二返回HttpResponse。
xpower@xpower-CW65S:~$ python3 Python 3.5.2 (default, Nov 17 2016, 17:05:23) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import datetime >>> time = datetime.datetime.now() >>> time datetime.datetime(2017, 2, 14, 3, 50, 51, 561610) >>> print(time) 2017-02-14 03:50:51.561610
好的,刀磨好了。下面我们去写视图函数。
from django.conf.urls import url from django.contrib import admin from mysite import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^hello/$', views.hello), url(r'^time/$', views.time), ]
然后访问 http://127.0.0.1:8000/time/ 得页面。
对了,如果发现时间不对的话,那是因为django的默认时区是django的诞生地。我们在setting.py中修改时区。
TIME_ZONE = 'Asia/Beijing'
截止目前我们可以做静态页面,动态页面。但是正如你看的博客每一片的博客地址都是不一样的
http://www.cnblogs.com/A-FM/p/6396050.html
http://www.cnblogs.com/A-FM/p/6379822.html
后缀不同得到的信息也就不同,现在我们开始讲怎样去写动态url。
我们的目标是/time/plus/1/ 显示当前时间+1个小时的页面, /time/plus/2/ 显示当前时间+2个小时的 页面, /time/plus/3/ 显示+3个小时的页面,以此类推。后面的数字限制为1-100.
因为url发生变化,所以我们就要修改我们的urls.py ,加入下面的代码。
url(r'^time/plus/(?P<offset>d{1,2})/$', views.hours_ahead,name = 'hours_ahead'),
可以看到正则表达式最后匹配了一个1-100的数字,然后交给views下的hours_ahead来实现,name 用于代码复用, = 视图名。
#views.py from django.http import HttpResponse import datetime def hello(request): return HttpResponse("Hello world") def time(request): now = datetime.datetime.now() html = "<html><body>It is now %s</body></html>" % now return HttpResponse(html) def hours_ahead(request, offset): try: offset = int(offset) except ValueError: raise Http404() dt = datetime.datetime.now() + datetime.timedelta(hours=offset) html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt) return HttpResponse(html)