概述
一个视图函数(类),简称视图,接收web请求(request)并且返回web响应(return)
无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你当前项目目录下面。除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中。
CBV和FBV
CBV: 基于类
# CBV版添加班级 from django.views import View class AddClass(View): def get(self, request): # GET请求走这个函数 return render(request, "add_class.html") def post(self, request): # POST请求走这个函数 class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/")
使用CBV时,urls.py中也做对应的修改:url(r'^add_class/$', views.AddClass.as_view()),
FBV: 基于函数
# FBV版添加班级 def add_class(request): if request.method == "POST": class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/") return render(request, "add_class.html")
urls.py中也做对应: url(r'^add_class/$', views.add_class),
Request请求相关
request.method 获取请求的方法(GET POST等) request.GET 获取URL里面的参数 request.POST 获取POST提交过来的数据 提交的数据是多个的时候一定要用 request.POST.getlist("value") request.path_info 获取用户请求的路径
request.get_full_path() 获取用户请求的路径+参数 request.body 请求体 request.FILES 上传过来的文件
上传文件的例子
def upload(request): if request.method == 'POST': # file_name = request.FILES['file'].name file_name = request.FILES.get('file').name # 获取上传的文件名字 print(type(file_name), file_name) with open(file_name, 'wb') as f: # for i in request.FILES['file'].chunks(): for i in request.FILES.get('file').chunks(): # 从上传过来的文件对象中一点一点的读 f.write(i) # 写入本地文件 return HttpResponse("上传成功") return render(request, 'upload.html')
html文件里,表单上传文件要加上:encype = "multipart/form-data"
Response响应相关
可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片。
1. HttpResponse --> 返回字符串内容 2. render --> 返回一个html页面 3. redirect --> 返回一个重定向(告诉浏览器再去访问另外的网址) 4. JsonResponse --> 返回 json字符串 格式
JsonResponse的例子
from django.http import JsonResponse
def test_json(request): dic = {"aa": 11, 'bb': 22} lis = ['11', '22', '33'] # return JsonResponse(dic) return JsonResponse(lis, safe=False)
默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。 --> 设成 safe=False