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方法')
posted @ 2021-05-28 15:46  黑影Poco  阅读(59)  评论(0)    收藏  举报