5、视图层
一、视图层三板斧
from django.shortcuts import render, HttpResponse, redirect
HttpResponse # 返回字符串类型的数据
render # 返回html文件
redirect # 重定向,url网址
1、书写视图函数
# 在views.py文件,直接导入三板斧
from django.shortcuts import render, HttpResponse, redirect
def index1(request): # 参数request:请求相关所有的数据对象
return HttpResponse('哈喽,沃德!') # 返回字符串类型的数据
def index2(request):
return render(request, 'user.html') # 导入html文件
# 首先你要有个html文件,html文件都是在templates文件下的
def index3(request):
return redirect('https://www.mzitu.com/') # 跳转到其他网址
return redirect('/home/') # 还可以跳转到自己的页面,自己的网址可以只写后缀
"""
然后去路由层配置三个视图函数的路由,
启动Django去访问这三个资源,就能看到三个不同返回类型的数据了
"""
接下来的【render返回html文件】和【redirect重定向】也如法炮制,和HttpResponse一模一样的用法,这里我就不写了,直接拿上面的index演示把
def index(request):
return render(request, 'user.html') # 导入html文件
# 首先你要有个html文件,html文件都是在templates文件下的
def index(request):
return redirect('https://www.mzitu.com/') # 跳转到其他网址
return redirect('/home/') # 还可以跳转到自己的页面,自己的网址可以只写后缀
2、render两种传值方式
render可以在后端为HTML文件传值,这样HTML文件在浏览器可以显示后端传值过来的数据了,而render有两种传值的方法
# views.py文件
from django.shortcuts import render, HttpResponse, redirect
def index(request): # 视图函数必须要接受一个形参request
user_dict = {'username':'jason','age':18}
# 第一种传值方式:更加的精确 节省资源
return render(request,'user.html',{'data':user_dict})
# 第二种传值方式:当你要传的数据特别多的时候
return render(request,'user.html',locals())
# locals会将所在的名称空间中所有的名字全部传递给html页面
然后我们在user.html文件下写入下面代码,就可以在浏览器看到后端传来的数据了
<body>
{{ data }}
</body>
二、JsonResponse对象
将数据序列化成json格式展示给前端,默认只能序列化字典,其他类型需要加一些参数,可以通过查看源码分析需要的参数
def cd_json(request):
l = [1,2,3,4,5,5,6]
return JsonResponse(l,safe=False)
def ab_json(request):
user_dict = {'username':'索隆', 'password':123}
return JsonResponse(user_dict,json_dumps_params={'ensure_ascii': False})
三、request对象
print(request.method) # 获取该请求的方法,比如:GET、POST .........
request.POST # 获取用户post请求提交的普通数据不包含文件
request.POST.get() # 只获取列表最后一个元素
request.POST.getlist() # 直接将列表取出
request.GET # 获取用户提交的get请求数据
request.GET.get() # 只获取列表最后一个元素
request.GET.getlist() # 直接将列表取出
# request补充
request.POST # 获取用户post请求提交的普通数据不包含文件
request.FILES # 获取用户上传的文件!
request.path # 获取用户url后缀路径
request.get_full_path() # 能获取完整的url以及问号后面的参数
四、form表单上传文件以及后端获取
'''
form表单上传文件注意事项
1、一定要是post
2、enctype默认是传不了文件的,要把它改成form-data,才能传文件
<form action="" method="post" enctype="multipart/form-data">
'''
def ab_file(request):
if request.method == 'POST':
file_obj = request.FILES.get('file') # 括号的file对应HTML上传文件那个标签的name值
# 将获取到的用户文件保存下来
with open(file_obj.name,'wb') as f: #.name是获取到文件的名字
for line in file_obj.chunks():
f.write(line)
return render(request,'file-form.html')
五、FBV与CBV
视图函数既可以是函数也可是类,我们之前写的视图函数一直都是FBV这种模式,所有就没什么好讲的,
那CBV是什么,CBV是基于类的视图。比如说你在类中写了两个方法,一个叫get,一个叫post,前端提交get请求就触发get方法,提交post请求就触发post方法,如何实现,下面我们就来看看
url(r'^ab_file/', views.ab_file), # FBV路由
url(r'^login/',views.MyLogin.as_view()) # CBV路由
class MyLogin(View):
def get(self,request):
return render(request,'form.html')
def post(self,request):
return HttpResponse('post方法')

浙公网安备 33010602011771号