zoukankan      html  css  js  c++  java
  • Django系列教程:三、动态视图和动态Url

    注明:python版本为3.3.1、Django版本为1.5.1,操作系统为Windows7,其他版本有一些不同的地方读者可以自行探讨。

    前一章我们简略的讲解了下Django的视图和Url的配置,那么这一章我们就通过一个简单的例子来讲解下动态视图和动态Url。

    照例使用python manage.py runserver 命令启动web服务。下面我们将用datetime模块显示和计算时钟。

    打开上一章建立的view.py文件,在原有代码后面加入以下代码:

    import datetime
    def current_datetime(request):
        now=datetime.datetime.now()
        html="<html><body>It's now %s.</body></html>" %now
        return HttpResponse(html)

    上面代码的意思如果大家稍微知道点python知识就应该明白,%now其实就是给%s传递了一个值,而已这里就不做过多解释。

    再打开urls.py文件建立相应的url配置,url配置文件代码如下。

    from django.conf.urls import patterns,include,url
    urlpatterns = patterns('',
        # Examples:
         url(r'^hello/$','firstsite.view.hello',name='hello'),
         url(r'^time/$','firstsite.view.current_datetime',name='current_datetime'),
    )

    这里看到代码只是增加了倒数第二行一行,而且还删除了from firstsite.view import hello这一行(这是我后来才注意到到的在url中其实已经有导入的意思了,这行代码显得有点多余,并不影响代码的执行,也能输出helloworld,这里做个纠正。另外name的名字也不一定要是current_datetime,只是为了好记所以这样写。
    打开浏览器输入:http://127.0.0.1:8000/time/ 显示出当前的时间。如下图:

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

    每次刷新页面都可以看到数字有变化哦。当然现在这只是静态的变化,如果我想得到一个小时候的时间该怎么办呢?下面我们就解决这个问题,也就是动态Url。

    我们要实现的输入:http://127.0.0.1:8000/time/plus/1/ 则显示比当前时间晚1个小时的时间,输入:http://127.0.0.1:8000/time/plus/2/ 则显示比当前时间晚2个小时的时间,当然为了简便点我们将规定最大值为99,也就是最大显示99个小时以后的时间。

    一般来说新手看到这个问题可能会直接在urls.py文件中写代码,比如下面这个:

    from django.conf.urls import patterns,include,url
    urlpatterns = patterns('',
        # Examples:
         url(r'^hello/$','firstsite.view.hello',name='hello'), 
         url(r'^time/$','firstsite.view.current_datetime',name='current_datetime'),
         url(r'^time/plus/1/$','firstsite.view.current_datetime_addone',name='current_datetime_addone'),
         url(r'^time/plus/2/$','firstsite.view.current_datetime_addtwo',name='current_datetime_addtwo’),
         url(r'^time/plus/3/$','firstsite.view.current_datetime_addthree',name='current_datetime_addthree'),
    )

    上面这些代码结合在view.py里面添加的current_datetime_addone、current_datetime_addtwo、current_datetime_addthree三个函数虽然可以显示:

    http://127.0.0.1:8000/time/plus/1/

    http://127.0.0.1:8000/time/plus/2/

    http://127.0.0.1:8000/time/plus/3/

    这三个页面,但要显示4小时后则又要添加函数和url配置,显得好不麻烦,所以下面有一个更好的方法。

    更改view.py代码如下:

    def hours_add(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)

    其中的try和except是因为从url获得的参数可能会是数字以外的字符,offset可以随便为一个名称,接受url传递过来参数,try后面的offset=int(offset)只是因为timedelta()函数里面的几个参数要求的都要是整数,所以必须转换,如果传递过来的参数不是整数,比如:http://127.0.0.1/time/plus/ab/ 传递过来的就是ab,这时没法将ab转换成整形,便会引发Http404()这个函数,至于这个函数怎么显示,大家可以百度之哦。

    再更改urls.py文件代码如下:

    from django.conf.urls import patterns,include,url
    urlpatterns = patterns('',
        # Examples:
         url(r'^hello/$','firstsite.view.hello',name='hello'),
         url(r'^time/$','firstsite.view.current_datetime',name='current_datetime'),
         url(r'^time/plus/(\d{1,2})/$', 'firstsite.view.hours_add',name='time-plus'),
         url(r'^.*$', 'firstsite.view.error', name='error'),
    )

    倒数第二行其实是一个404的页面,只要在view.py里面再定义一个error函数就可以了,可以模仿hello。
    倒数第三行的(\d{1,2})这个正则表达式的意思则是输入一个0-99(包括0和99)之间的数字。

    好了现在输入:http://127.0.0.1:8000/time/plus/2/ 试试看是不是得到了下面的结果。

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

     更改数字试试看是不是有变化哦。

    最后我们回到view.py文件的hours_add()函数,目前里面只传递了两个参数,那么我们是不是可以传递第三个参数呢?想到这,聪明的你应该知道怎么做了吧,这个问题就留给大家了。

    另外本教程参考了DjangoBook2里面的很多内容,我也是每天学完一章然后隔一天就写个教程复习下,所以很多例子可能会很相似,大家也可以直接去看这本书,在我博客主页的连接上就有它的翻译版本,大家也可以网上下载,不过一定要注意版本哦。

    这一章暂时就到这把,下周一就要交毕业设计了,论文才写了两章,要加油了。下一章我们讲讲Django的模板吧。

    本人既是python的初学者也是Django的初学者,写这一系列教程的目的就是为了加深自己的理解,希望大家多多包涵和指教,有什么问题请留言,谢谢。

    鹜落霜洲,雁横烟渚,分明画出秋色。暮雨乍歇,小楫夜泊,宿苇村山驿。何人月下临风处,起一声羌笛。离愁万绪,闲岸草、切切蛩吟似织。 为忆芳容别后,水遥山远,何计凭鳞翼。想绣阁深沉,争知憔悴损,天涯行客。楚峡云归,高阳人散,寂寞狂踪迹。望京国。空目断、远峰凝碧。
  • 相关阅读:
    使用 Spring data redis 结合 Spring cache 缓存数据配置
    Spring Web Flow 笔记
    Linux 定时实行一次任务命令
    css js 优化工具
    arch Failed to load module "intel"
    go 冒泡排序
    go (break goto continue)
    VirtualBox,Kernel driver not installed (rc=-1908)
    go运算符
    go iota
  • 原文地址:https://www.cnblogs.com/thunderest/p/3073448.html
Copyright © 2011-2022 走看看