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)