第三章 视图和URL配置

1.第一份视图

  使用Django,页面的内容是靠view function(视图函数)来产生,URL定义在URLconf中。

  views.py

from django.shortcuts import render
from django.http import HttpResponse

def hello(request):
        return HttpResponse('hello')

  首先从django.http模块导入Httpresponse类,接下来定义视图函数,每个视图函数至少有一个参数,通常request。这是一个触发视图,包含web请求信息的对象,是类django.http.HttpRequest的一个实例。函数返回一个HttpResponse对象

2.第一个URLconf

  URLconf是Django所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用视图函数之间的映射表。

   在工程目录下的urls.py文件中

from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^news/',include('news.urls')),
]

  在app目录下,新建urls.py文件

from django.conf.urls import url
from django.contrib import admin
from news import views
urlpatterns = [
    #url(r'^admin/', admin.site.urls),
    url(r'^hello/$',views.hello),
]

  这样所有指向URL/hello/的请求都应由hello这个视图函数处理。

   在setting.py文件中,在官方文档中有:设置APPEND_SLASH,默认值:True,当设定为True时,如果请求的URL没有匹配URLconf里面的任何URL,并且URL没有/(斜杠)结束,将重定向到以/(斜杠)URL。需要注意的是任何重定向都有可能导致post数据丢失。APPEND_SLASH设置只有在安装了CommonMiddleware时才能用到。

  Django是怎么处理请求的

  在自动创建的setttings.py中包含一个ROOT_URLCONF配置用来指向自动产生的urls.py,在setttings.py文件中如下:

  ROOT_URLCONF = 'mysite.urls'

  总结一下:

  1. 进来的请求转入/hello/

  2. Django通过在ROOT_URLCONF配置来决定根URLconf。

  3. Django在URLconf中的所有URL模式中,查找第一个匹配/hello/的条目

  4. 如果找到匹配,将调用相应的视图函数

  5. 视图函数返回一个HttpResponse

  6. Django转换HttpResponse为一个适合的HTTP response,以Web page显示出来

第二个视图:动态内容

  利用datetime模块获取当前时间,显示在当前页面。代码如下:

  

from django.shortcuts import render
from django.http import HttpResponse
import datetime

def hello(request):
        return HttpResponse('hello')

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

  然后在urls.py中添加URL模式,以告诉Django由哪一个URL来处理这个视图

 第三个视图 动态URL

  正则表达式字符串的开头字母'r',它告诉python这是一个原始字符串,不需要处理里面的反斜杠(转译字符)。

  在URL中,

from news import views
urlpatterns = [
    #url(r'^admin/', admin.site.urls),
    url(r'^hello/$',views.hello),
    url(r'^current_datetime/$',views.current_datetime),
    url(r'^time/plus/(d{1,2})/$',views.hours_ahead),

  在视图函数中,

def hours_ahead(request,offset):
        try:
                offset = int(offset)
        except ValueError:
                raise Http404()
        dt = datetime.datetime.now()+datetime.timedelta(hours=offset)
#       assert False
        html = "<html><body>after %s hours,it will be %s.</body></html>" % (offset,dt)
        return HttpResponse(html)

  offset是从url中提取出来的,如果请求的是/time/plus/3/,那么offset=3,如果请求的是/time/plus/21/,那么offset=21,捕获值永远为字符串(string),而非整数。变量名无关紧要,

它是函数第二个参数,可以使用关键字定义它,而非位置。

  在urls.py中,重新定义:

from django.conf.urls import url
from django.contrib import admin
from news import views
urlpatterns = [
    #url(r'^admin/', admin.site.urls),
    url(r'^hello/$',views.hello),
    url(r'^current_datetime/$',views.current_datetime),
    url(r'^time/plus/(?P<offset>d{1,2})/(?P<test>d*)/$',views.hours_ahead),
]

  在views.py中添加一个参数:

def hours_ahead(request,test,offset):
        try:
                offset = int(offset)
        except ValueError:
                raise Http404()
        dt = datetime.datetime.now()+datetime.timedelta(hours=offset)
#       assert False
        html = "<html><body>after %s hours,it will be %s.</body></html>" % (offset,dt)
        test = int(test)
        print(test)
        return HttpResponse(html)

  

原文地址:https://www.cnblogs.com/homle/p/8028276.html