一、什么是视图函数?
Django框架中的视图函数其实就是个普通的python函数,这个函数可以接收web请求,并且返回web响应。
视图函数响应给客户端浏览器的内容,可以是一个html文档,还可以是一个重定向,还可以是一张图片,还可以是一个重定向......
无论视图函数中包含什么样的逻辑,都需要返回web响应。
一般情况下,我们喜欢把视图函数放在views.py这个文件中。
二、初识视图函数的执行流程与结构。
from django.shortcuts import render
from django.shortcuts import redirect
from django.http import HttpResponse
from django.urls import reverse
import datetime
def show_datetime(request):
now = datetime.datetime.now()
html = "< html >< body >*It is now %s.< /body >< /html >" % now
print(request)
return HttpResponse(html)
(1)首先,我们从 django.http模块导入了HttpResponse类,以及Python的datetime模块。
(2)接着,我们定义了show_datetime函数。它是一个视图函数。每个视图函数都应接收HttpRequest对象作为第一个参数,一般叫做request。
(3)最终,这个视图函数会返回出一个HttpResponse(响应)对象。(每个视图函数都要返回一个HttpResponse对象)
(也就是说,每个视图函数至少要接收一个参数,接收的这个参数就是HttpRequest【http请求对象】,另外,每个视图函数也要返回一个对象,这个对象就是 HttpResponse【http响应对象】 )
http请求对象(HttpRequest)与http响应对象:HttpResponse这两个对象的所在位置是django.http。
三、view视图函数中常用的快捷函数。
1、 render函数。
结合django模板,返回一个经过django模板语言渲染的HttpResponse 对象。
render的常用参数如下:
格式 render(request, template_name[, context])
request:render函数要传的第一个参数就是用来生成这个响应的请求对象。
template_name :返回给浏览器的模板名称,这个名称是字符串格式。(这个参数是可选的。)
context:添加到模板上下文的一个字典。默认是一个空字典。如果字典中的某个值是可调用的,视图将在渲染模板之前调用它。(说的通俗一点,就是给模板传递python变量或者指定的值,替换掉指定的字符串。)
content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
status:用来指定http的响应的状态码。默认为200。
四、获取httprequest内容的方法(获取请求体内容)。
1.获取当前请求类型:
request.method
例如说,现在需要判断当前请求是否为post类型:
if request.method == 'POST':
2.获取get请求或者post请求的内容。
如果需要获取POST请求的所有内容,可以使用request.POST这个方法,使用了request.POST之后,会将post请求的所有内容以QueryDict这种类型返回,这个数据类型和python内置的字典特别类似,如果需要取出post请求中的某个值,可以使用request.POST.get('key')方法,取出QueryDict这个字典中指定的值。
示例:
def auth_user(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
print(username,password)
print(request.POST)
if username == "admin" and password == "123456":
return redirect('/test/admin/')
return render(request,'login.html')
如果需要获取客户端浏览器提交的GET请求中的值,需要使用http请求的 request.GET方法,获取GET请求的值没什么好需要特殊介绍的了,用法和request.POST一样,也会返回一个QueryDict字典,要取出字典中的某个值,就使用get()方法。
3。获取form表单中checkbox中所有的值。
当需要获取form表单中的checkbox勾选框中所有的值时,就不能在使用.get方法了!
这一点需要特别注意!
当需要接收checkbox中的值,如果使用之前的request.POST.get()方法,如果使用checkbox多选框,那么只会接收到checkbox的第一个值!其余的值无法接收!!
这个时候就需要使用request.POST.getlist()方法!
假如说,现在需要获得form表单中,同一个name属性中的多个值,或者说是QueryDict字典中同一个key里面的多个value,这个时候就需要使用request.POST.getlist()方法!。
当使用了request.POST.getlist()方法后,同一个key中的多个值,会以列表的方式返回。
下面是个例子:
HTML部分:
< body >
< form action="/test/login2/" method="post" >
< p >
选择1:
选择2:
选择3:
< /form>
body>
view视图函数部分:
def test_check(request):
if request.method == 'POST':
t_check = request.POST.getlist('c1') #获取key为c1的所有值。
print(request.POST)
print(t_check)
return render(request,'login.html')
这时,我们打开浏览器,选中3个checkbox 然后提交,这时t_check这时获取到的值将会是一个列表['1', '2', '3']。
4.通过form表单实现上传文件。
django接收form表单传过来的文件,则需要request.FILES方法。
下面是文件上传功能的示例:
【1】html文档:
< body>
< form enctype="multipart/form-data" method="post">
< input type="file" name="up_load_file"/>
< input type="submit" value="上传" >
< /form >
< /body >
注意!!:在制作上传文件的form表单时,一定要注意添加enctype="multipart/form-data"这个属性!!否则会导致文件无法上传!!这个属性的作用就是用来设置,form表单提交给服务器的媒体类型!!
【2】view视图:
def upload_file(request):
if request.method == 'POST':
upfile = request.FILES.get('up_load_file')
write_file = open(upfile.name,mode='wb')
for item in upfile.chunks(): #!chunks生成迭代器对象。
write_file.write(item)
write_file.close()
return render(request,'upload.html')
#!注意!!!!!当equest.FILES.get接收到了form表单传送过来的文件对象时,执行这个文件对象的chunks方法,就会生成一个迭代器对象,只要循环这个迭代器对象,就可以获取到文件中的内容。
五、通过另一种方式创建view视图(通过类的方式创建视图)。
下面是通过类(class)的方式创建视图函数的方法。
通过类创建的view视图,创建方法如下:
from django.views import View
class Test(View):
def get(self,request):
print('当浏览器发起get请求时执行我!')
def post(self,request):
print('当浏览器发起post请求时执行我!')
那么这个view视图的类如何在url路由中调用呢?
urlpatterns=[
url(r'^datetime/',views.show_datetime),
url(r'^login/',views.auth_user),
url(r'^admin/',views.admin),
url(r'^req/',views.http_req),
url(r'^upload/',views.upload_file),
url(r'^home/',views.Test.as_view()), #!!!注意看这里!!!
]
转载于:https://blog.51cto.com/suhaozhi/2044375