视图和URL配置

开始制作我们网站的第一个界面: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)

 

转载于:https://www.cnblogs.com/A-FM/p/6396059.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值