zoukankan      html  css  js  c++  java
  • 视图和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)
  • 相关阅读:
    标签的讲解
    属性分类
    LeetCode 003. 无重复字符的最长子串 双指针
    Leetcode 136. 只出现一次的数字 异或性质
    Leetcode 231. 2的幂 数学
    LeetCode 21. 合并两个有序链表
    象棋博弈资源
    acwing 343. 排序 topsort floyd 传播闭包
    Leetcode 945 使数组唯一的最小增量 贪心
    Leetcode 785 判断二分图 BFS 二分染色
  • 原文地址:https://www.cnblogs.com/A-FM/p/6396059.html
Copyright © 2011-2022 走看看