概要:页面的内容是靠view function(视图函数)产生,URL定义在URLconf中
视图:约定俗称用 view.py 命名, views.py 在项目目录下,建立后的目录应该为:
输出hello world 视图demo
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
代码解析:
1,从 django.http 模块导入(import) HttpResponse 类。
2,定义一个叫做 hello 的视图函数。每个视图函数至少要有一个参数,通常被叫作 request 。 这是一个触发这个视图、包含当前Web请求信息的对象,是类 django.http.HttpRequest 的一个实例。在这个示例中,我们虽然不用 request 做任何事情,然
而它仍必须是这个视图的第一个参数。注意视图函数的名称并不重要;并不一定非得以某种特定的方式命名才能让 Django 识别它。
总结: 一个视图就是Python的一个函数。这个函数第一个参数的类型是HttpRequest;它返回一个HttpResponse实例。为了使一个Python的函数成为一个Django可识别的视图,它必须满足这两个条件。
现在运行 python manage.py runserver 发现刚那个hello world 并没有返回,是因为我们没有对视图进行URL绑定。要能访问,则需要配置URLconf
URLconf 就像是 Django 所支撑网站的目录。 它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表
当前目录在django -admin startproject的时候已经在项目目录下自动创建了urls.py,配置:
from django.conf.urls import url
from django.contrib import admin
from . import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello/$', views.hello),
url(r'^times/', views.current_datetime),
]
配置说明:
1,import 视图
2,在urlpatterns 新增配置: (‘^hello/$’, view.hello), 这行被称作URLpattern,它是一个Python的元组。元组中第一个元素是模式匹配字符串(正则表达式);第二个元素是那个模式将使用的视图函数。
知识扩展:
1,Django在检查URL模式前,移除每一个申请的URL开头的斜杠(/)。 这意味着我们为/hello/写URL模式不用包含斜杠(/)
2,模式包含了一个尖号(^)和一个美元符号($)。这些都是正则表达式符号,并且有特定的含义: 上箭头要求表达式对字符串的头部进行匹配,美元符号则要求表达式对字符串的尾部进行匹配。
3,默认地,任何不匹配或尾部没有斜杠(/)的申请URL,将被重定向至尾部包含斜杠的相同字眼的URL。(如果所有URL都以’/’结尾的(Django开发者的偏爱),只需要在每个URL后添加斜杠,并且设置”APPEND_SLASH”为”True”. 如果不喜欢URL以斜杠结尾或者根据每个URL来决定,那么需要设置”APPEND_SLASH”为”False”,)
4,hello视图函数作为一个对象传递,而不是调用它。 这是 Python (及其它动态语言的) 的一个重要特性: 函数是一级对象(first-class objects), 也就是说你可以像传递其它变量一样传递它们。
5,正则匹配URL扩展:
从项目manage.py 所在目录cmd :python manage.py runserver 进行运行:返回127.0.0.1:8000
1,动态内容:
动态显示当前时间:
from django.http import HttpResponse
import datetime
def hello(request):
return HttpResponse('hello world')
def current_datetime(request):
now = datetime.datetime.now()
html = "now %s" % now
return HttpResponse(html)
URLconf上一步已经多写了一个time的路由,不断刷新127.0.0.1:8000/tiems 会不断显示当前时间
知识扩展:
1,字符串中的%s是占位符,字符串后面的百分号表示用它后面的变量now的值来代替%s。变量%s是一个
datetime.datetime对象。它虽然不是一个字符串,但是%s(格式化字符串)会把它转换成字符串
2,setting 时区和语言设置:LANGUAGE_CODE = 'zh-hans' ,TIME_ZONE = 'Asia/Shanghai'
3,动态接收参数显示不同页面:url 通配符配置:
from django.conf.urls import url
from django.contrib import admin
from . import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^hello/$', views.hello),
url(r'^times/', views.current_datetime),
url(r'^art_list/art/(\d{1,2})/$', views.art_list),
]
视图:
from django.http import Http404,HttpResponse
import datetime
def hello(request):
return HttpResponse('hello world')
def current_datetime(request):
now = datetime.datetime.now()
html = "now %s" % now
return HttpResponse(html)
def art_list(request,art_id):
try:
art_id = int(art_id)
except ValueError:
raise Http404()
dt = datetime.datetime.now() + datetime.timedelta(hours=art_id)
html = "In %s hour(s), it will be %s." % (art_id, dt)
return HttpResponse(html)
运行:python manage.py runserver,即可看到运行成功
注意点:
1,捕获值永远都是字符串(string)类型,而不会是整数(integer)类型,即使这个字符串全由数字构成(如:“21”)
2,如果在一个不能转换成整数类型的值上调用int(),Python将抛出一个ValueError异常
3,每一个视图 总是以一个 HttpRequest 对象作为 它的第一个参数。