• 视图和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)
  • 相关阅读:
    bzoj 1026
    mysql索引面试题
    Mybatis基础,动态sql (mybatis中的重点)
    Mybatis基础,利用mybatis实现复杂查询,多对一,一对多
    Mybatis基础:注解开发,面向接口(引出三个面向的区别)
    Mybatis基础,limit分页,和RowsBounds分页,分页插件
    Mybatis基础,日志工厂
    Mybatis基础一,生命周期,和作用域,resultMap(结果集映射)
    Mybatis配置解析三,typeAliases(别名),setting(设置)
    浅谈JPA
  • 原文地址:https://www.cnblogs.com/A-FM/p/6396059.html
Copyright © 2020-2023  润新知