zoukankan      html  css  js  c++  java
  • Django笔记 —— 视图

      最近在学习Django,打算玩玩网页后台方面的东西,因为一直很好奇但却没怎么接触过。Django对我来说是一个全新的内容,思路想来也是全新的,或许并不能写得很明白,所以大家就凑合着看吧~

      本篇笔记(其实我的所有笔记都是),并不会过于详细的讲解。因此如果有大家看不明白的地方,欢迎在我正版博客下留言,有时间的时候我很愿意来这里与大家探讨问题。(当然,不能是简简单单就可以百度到的问题-.-)

      我所选用的教材是《The Django Book 2.0》,本节是视图部分,对应书中第三章。

    ------------------------------------------------------------------------------------------------------------------------------------------------

    0、视图部分代码(先给出代码方便大家看,后面一一解释)

      在上节的基础上(创建一个网站qiqisite,代码是django-admin.py startproject qiqisite),修改urls.py和views.py。

    urls.py

     1 from django.conf.urls import include, url
     2 from django.contrib import admin
     3 from qiqisite.views import *
     4 
     5 urlpatterns = [
     6     # Examples:
     7     # url(r'^$', 'qiqisite.views.home', name='home'),
     8     # url(r'^blog/', include('blog.urls')),
     9 
    10     # url(r'^admin/', include(admin.site.urls)),
    11     url('^$', homepage),
    12     url('^hello/$', hello),
    13     url('^time/$', current_datetime),
    14     url(r'^time/plus/(d{1,2})/$', hours_ahead),
    15 ]

    views.py

     1 from django.http import Http404, HttpResponse
     2 import datetime
     3 import time
     4 
     5 def hello(request):
     6     return HttpResponse("Hello world")
     7 
     8 def homepage(request):
     9     return HttpResponse("Homepage -- I'm qiqi.")
    10 
    11 def current_datetime(request):
    12     now = datetime.datetime.now()
    13     html = "<html><body>"
    14     html += "time_UTC = %s.<br/>" % now
    15     html += "time_UTC = %s.<br/>" % time.ctime()
    16     html += "time_UTC+8 = %s.<br/>" % (now + datetime.timedelta(hours=8))
    17     html += "time_UTC+8 = %s.<br/>" % (time.asctime(time.localtime(time.time() + 3600 * 8)))
    18     html += "</body></html>"
    19     return HttpResponse(html)
    20 
    21 def hours_ahead(request, offset):
    22     try:
    23         offset = int(offset)
    24     except ValueError:
    25         raise Http404()
    26     dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    27     #assert False
    28     html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
    29     return HttpResponse(html)

      当我们运行服务器(python manage.py runserver)后,便可以用访问到下列网页了:

    网页 网址 内容
    A http://127.0.0.1:8000/ "Homepage -- I'm qiqi."
    B http://127.0.0.1:8000/hello/ "Hello World"
    C http://127.0.0.1:8000/time/ 当前时间
    D http://127.0.0.1:8000/time/plus/num/ 当前时间+num小时(num必须是1~99之间的一个正整数)

    1、静态视图

      所谓静态视图,顾名思义,就是网页内容是静态的,随时打开内容都一样。本例子中,A、B都属于静态视图。

      我们首先以网页B为例,说明Django显示网页的实际步骤:

        1. 发现地址为/hello/

        2. Django找到settings.py中的ROOT_URLCONF的值(本例子中为mysite.urls),定位到URLconf(即urls.py)

        3. Django在URLconf内所有URL模式中,找到第一个匹配/hello/的条目,找不到则报错

        4. 调用相应的视图函数(本例子中即views.py中的hello函数)

        5. 视图函数返回一个HttpResponse

        6. Django将HttpResponse转换为一个对应的HTTP response(详见本书附录H,“HTTP请求(Request)与回应(Response)对象”,http://djangobook.py3k.cn/appendixH/),以网页的形式显示出来(这里大家不妨从浏览器中查看一下网页B的源代码,会发现不只有我们写进去的"Hello world",还自动为我们加上了<html><head><body>三组标签,从而构成了一个html网页)

       这过程很好理解,因此,如果我们需要在网站中加一个页面,那么我们应当做以下几步(其顺序能体现出你的思路):

    1. 在urls.py的urlpatterns列表中加入一项 url('^pagename/$', onepage)
    2. 在views.py中写出对应函数

    def onepage(request):

      return HttpResponse("a new page")

    3. 在urls.py中import此函数 from qiqisite.views import onepage
    4. 可以访问此页面了 http://127.0.0.1:8000/pagename/

      如此一来,我们便可以生成一个静态页面了。(关于'^pagename/$'的详细解释,本文后面“正则表达式”处会讲,先不急)

      至于网页A,则向大家展示了如何使用直接让网站的根http://127.0.0.1:8000/成为可以访问的网页,但书中说,此方法并不常用,我并不知道为什么,欢迎大家与我交流。

    2、动态视图

      这里所说的动态视图,是指网页显示的内容会随时不同,最简单的例子莫过于显示时间了。

      因此这里使用python的函数,做了显示当前时间的网页C。

      又从正则表达式中提取数据,做了可以显示一组时间的一组网页D。

    3、正则表达式

      正则表达式内容很多,此处并非专题,因此仅介绍其基本内容。

    符号 匹配 例子 备注
    . 一个字符    
    d 一个数字   一个数字,自然不能加负号
    [A-Z] 一个大写字母    
    [a-z] 一个小写字母    
    [A-Za-z] 一个字母    
    + 一个或多个相应字符 d+,匹配一个或多个数字  
    [^x]+ 一个或多个不为x的字符 [^/]+,匹配一个或多个不为/的字符  
    ? 零个或一个相应字符 d?,匹配零个或一个数字  
    * 任意个相应字符 d*,匹配任意个数字 “任意个”表示“零个或一个或多个”
    {x,y} x~y个相应字符 d{1,3},匹配1~3个数字 必须满足x<=y,否则表达式不合法
    () 从文本中提取数据 (d{1,2}),匹配1~2个数字  
    ^ 表达式与字符串的前缀相匹配 ^hello/,匹配任何以hello/开头的字符串  
    $ 表达式与字符串的后缀相匹配 hello/$,匹配任何以hello/结尾的字符串  
    …… …… …… ……

      现在,之前并不了解正则表达式的读者应该可以看懂前面urls.py中的正则表达式了。

      还有两点需要在此说明:

        1. 在Django中,如果你写的网址中没有最后的/,也会自动帮你加上。书中说,这设置体现在settings.py中的APPEND_SLASH参数,详见书中附录D。但我却并未找到此参数,想来是新版本有所改动,我手动测试过,Django依旧会自动把网址中没有/的给你加上的。

        2. Django在检查URL模式(即你在urls.py中写的那些正则表达式,例如"^hello/$")时,会自动移除开头的/。因此,我们只需要写成hello/,而不需要写成/hello/。

        3. 书中有这样一段原文:“你可能会认为用一系列正则表达式将URLs映射到函数也许会比较慢,但事实却会让你惊讶。”

    4、Django时区

      Django是有时区设定的,大家可以打开settings.py,看看里面的TIME_ZONE参数,默认值应该是'UTC'。

      关于时区的内容,过于繁杂,我这里不多赘述。仅仅说明,UTC表示美国标准时间,而世界被分为24时区,中国标准时间是美国标准时间加上8小时,因此也简称UTC+8。但是,这里并不能简单地把参数改为UTC+8,Django是无法识别的。中国标准时间应当如何修改参数,我并未查到一个满意的答案,这里仅仅是把时间手动+8来得到的。欢迎了解的同学赐教!

    5、用报错界面调试

      Django自带的报错界面很棒,可以用来调试。

      这里用网页D来说明。大家可以把views.py中网页D对应的函数(即hours_ahead)修改两处,得到以下错误:

    修改方法 得到错误
    将offset=int(offset)改为pass 类型错误(在26行为dt赋值时,timedelta函数内参数不能是字符串类型)
    将27行注释去掉 咱们自己抛出的错误-.-||

      这时,大家从浏览器中打开网页D,自然会看到报错页面。

      这个页面,大家不妨仔细看看。我仅仅给出简单提示:

        1. Trackback中,有5处都是可以点的。

        2. 随着你知识的积累,Request Information中的信息可能会越来越有用。

        3. 你有没有想到,利用Trackback中对于Local vars的显示,我们可以在追踪调试时,把嵌入代码中的众多print,改为寥寥几条assert False?

    ------------------------------------------------------------------------------------------------------------------------------------------------

      至此,“视图与URL配置”简介完成,下一节是“模板”。

  • 相关阅读:
    在多线程中使用静态方法是否有线程安全问题(转载)
    为什么乐观的人多能成功呢?
    每个人都是超级英雄-《技巧:如何用一年的时间获得十年的经验》
    003|再谈10000小时,三板斧破四困境
    002|也谈10000小时
    在职场中如何通过讲故事,影响他人、支持自己(下篇)
    全面解读:微信服务号升级和群发增至4条的应用方法
    Technical reading July-15
    read links July-14
    Technical news July-11
  • 原文地址:https://www.cnblogs.com/icedream61/p/4514159.html
Copyright © 2011-2022 走看看