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>
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')