Django之视图

Django视图

Django的视图是指项目的视图函数或视图类,当浏览器发送请求时,视图函数或类会给与响应,响应的网页可以是HTML文件,可以是字符串信息,也可以是重定向等。视图函数和视图类的代码一般放置于项目或APP的views.py文件中。

每个视图函数或视图类都负责给对应的URL返回一个网页。

CBV和FBV

CBV是指基于类的视图,FBV是指基于函数的视图

FBV示例

from django.http import HttpResponse

def add_grader(request):
    if request.method == 'POST':
        new_gradername=request.POST.get('gradername')
        models.Grader.objects.create(gradername=new_gradername)
        return redirect('/grader_list/')
    return render(request,'add_grader.html',)
# home是一个视图函数,每个视图函数默认使用HttpRequest对象作为第一个参数,并且通常称之为request,该参数中包含了请求的信息。
# 视图会返回一个HttpResponse对象,其中包含响应的内容。

CBV示例

from django import views

class AddGrader(views.View):
    
    def get(self,request):  # 请求方式为GET时执行
        return render(request, 'add_grader.html', )
    
    def post(self,request):  # 请求方式为POST时执行
        new_gradername = request.POST.get('gradername')
        models.Grader.objects.create(gradername=new_gradername)
        return redirect('/grader_list/')

# 定义的视图类需要继承views.View
# urls.py中的对应关系如下
 url(r'^add_grader/$', views.AddGrader.as_view())

 Request对象

浏览器发送请求,Django会将请求信息包装到请求对象中,响应视图函数通过request参数得到请求对象。

请求相关的常用值

请求常用值 说明
request.path_info 只返回用户访问的URL,不包括域名
request.method 获取请求使用的方法
request.GET 返回GET请求的所有参数,类似字典的k:v形式
request.POST 返回POST请求的所有参数,类似字典的k:v形式
request.body 返回请求体,byte类型

上传文件示例

def upload_file(request):
    if request.method=='POST':
        # print(request.POST)
        # <QueryDict: {'username': ['chris'], '提交': ['提交']}>
        # post提交的文件需要在request.FILES中获取
        # print(request.FILES)
        # <MultiValueDict: {'photo1': [<InMemoryUploadedFile: a.jpg (image/jpeg)>], 'photo2': [<InMemoryUploadedFile: b.gif (image/gif)>]}>
        # 得到文件对象字典,文件名对应文件对象,可根据文件名拿到文件对象
        file_obj1 = request.FILES.get('photo1')
        file_obj2 = request.FILES.get('photo2')
        # print(file_obj1,type(file_obj1))
        # a.jpg <class 'django.core.files.uploadedfile.InMemoryUploadedFile'>
        file_name=file_obj1.name
        # print(file_name)  # a.jpg
        with open(file_name, 'wb')as f:
            for line in file_obj1:
                f.write(line)
        return HttpResponse('成功')
    return render(request,'upload_file.html')
视图函数
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">

</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
    <input type="text" name="username">
    <input type="file" name="photo1">
    <input type="file" name="photo2">
    <input type="submit" name="提交">
</form>

<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
</body>
</html>
upload_file.html

 Respanse对象

相关操作

# 响应字符串
from Django.http import HttpResponse
response=HttpResponse('text page')


# 设置响应头信息
response = HttpResponse()
response['Content-Type'] = 'text/html; charset=UTF-8'
# 删除响应头信息
del response['Content-Type']


# 示例
def home(request):
    response = HttpResponse
    print(response)
    # <class 'django.http.response.HttpResponse'>
    response = HttpResponse("Text only, please.", content_type="text/plain")
    print(response)  # <HttpResponse status_code=200, "text/plain">
    response['Content-Type'] = 'text/html; charset=UTF-8'
    print(response)
    # <HttpResponse status_code=200, "text/html; charset=UTF-8">
    del response['Content-Type']
    print(response)
    # <HttpResponse status_code=200>
    return HttpResponse('hello')
原文地址:https://www.cnblogs.com/mingkong-z/p/9188030.html