4. Django 视图函数
一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应。
响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。
无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。
一个简单的视图
下面是一个以HTML文档的形式返回当前日期和时间的视图:
from django.http import HttpResponse
import datetime
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
HttpRequest对象的属性和方法:
path: 请求页面的全路径,不包括域名
method: 请求中使用的HTTP方法的字符串表示。全大写表示。例如
if req.method=="GET":
do_something()
elseif req.method=="POST":
do_something_else()
GET: 包含所有HTTP GET参数的类字典对象
POST: 包含所有HTTP POST参数的类字典对象
服务器收到空的POST请求的情况也是可能发生的,也就是说,表单form通过
HTTP POST方法提交请求,但是表单中可能没有数据,因此不能使用
if req.POST来判断是否使用了HTTP POST 方法;应该使用 if req.method=="POST"
COOKIES: 包含所有cookies的标准Python字典对象;keys和values都是字符串。
FILES: 包含所有上传文件的类字典对象;FILES中的每一个Key都是<input type="file" name="" />标签中 name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
filename: 上传文件名,用字符串表示
content_type: 上传文件的Content Type
content: 上传文件的原始内容
user: 是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前
没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
可以通过user的is_authenticated()方法来辨别用户是否登陆:
if req.user.is_authenticated();只有**Django中的AuthenticationMiddleware
时该属性才可用
session: 唯一可读写的属性,代表当前会话的字典对象;自己有**Django中的session支持时该属性才可用。
方法
get_full_path(), 比如:http://127.0.0.1:8000/index33/?name=123 ,
req.get_full_path()得到的结果是 /index33/?name=123
req.path得到的结果就是 /index33
HttpResponse对象:
对于HttpRequest对象来说,是由django自动创建的,但是,HttpResponse对象就必须我们自己创建。每个view请求处理方法必须返回一个HttpResponse对象。
HttpResponse类在django.http.HttpResponse
在HttpResponse对象上扩展的常用方法:
1 2 3 |
|
render()
在前面blog\urls.py的基础上,添加一条路由条目,以显示我们的blog.html文件:
urlpatterns = [
path("home/", views.blog, name='bl'), #html中引用的别名,这里添加上别名
re_path(r'^articles/2003/$', views.special_case_2003),
re_path(r'^articles/([0-9]{4})/$', views.year_archive),
re_path(r'articles/(?P<y>[0-9]{4})/(?P<m>[0-9]{2})$', views.month_archive)
]
在views.py中处理blog的函数,我们可以传入参数:
def blog(request):
name = 'weizu'
time = datetime.datetime.now()
return render(request, 'blog.html', {'name':name, 'time':time})
然后,在转向的blog.html文件中,可以使用我们传入的参数name和time:
<head>
<title>{{ name }}</title>
</head>
<body>
<h1>{{ name }} 时间是: {{ time }}</h1>
</body>
对于views.py中的传入参数的另一种写法:
def blog(request):
name = 'weizu'
time = datetime.datetime.now()
return render(request, 'blog.html', locals()) #使用局部变量
由于request也是局部变量,所以在html中也可以使用request下面的属性。
render_to_response()
使用比较简单,首先导入render_to_response,然后修改如下:
# return render(request, 'blog.html', locals()) #修改如下
return render_to_response('blog.html', locals())
用法基本和render是相同的,直观上的区别就在于render_to_response中没有传入request对象。
redirect(
"路径"
)
默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
传递一个视图的名称
def my_view(request): ... return redirect('some-view-name', foo='bar')
传递要重定向到的一个具体的网址
def my_view(request): ... return redirect('/some/url/')
当然也可以是一个完整的网址
def my_view(request): ... return redirect('http://example.com/')
参考:https://www.cnblogs.com/wangkun122/p/8312767.html
参考:http://www.cnblogs.com/yuanchenqi/articles/6083427.html
作者:无涯明月
上篇:3. 初识 Django
下篇:
上一篇: 企业级安全框架—spring security(一)
下一篇: hashcode和equals