视图层
1. Django中的视图函数
函数视图主要写一些逻辑函数,函数视图主要分为两种:
1、FBV function based view 写函数处理逻辑 2、CBV class based view 通过类处理逻辑
1.1 一个简单的视图函数
面是一个以HTML文档的形式返回当前日期和时间的视图
from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
让我们来逐行解释下上面的代码:
-
首先,我们从 django.http模块导入了HttpResponse类,以及Python的datetime库。
-
接着,我们定义了current_datetime函数。它就是视图函数。每个视图函数都使用HttpRequest对象作为第一个参数,并且通常称之为request。
注意,视图函数的名称并不重要;不需要用一个统一的命名方式来命名,以便让Django识别它。我们将其命名为current_datetime,是因为这个名称能够比较准确地反映出它实现的功能。
-
这个视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都负责返回一个HttpResponse对象。
Django使用请求和响应对象来通过系统传递状态。
当浏览器向服务端请求一个页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据。然后,Django加载相应的视图,将这个HttpRequest对象作为第一个参数传递给视图函数。
每个视图负责返回一个HttpResponse对象。
1.2 CBV和FBV
常见的几种提交方式
get :请求数据
post :提交数据
delete :删除数据
put :更新数据
patch :更新部分数据
【注意】
-
form表单提交 只支持get、post
-
ajax支持所有
1.2.1 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")
1.2.2 CBV
from django.views import View class Login(View): def dispatch(self, request, *args, **kwargs): super(Login, self).dispatch(request, *args, **kwargs) # 自定制逻辑 def get(self): return render(request, "add_class.html") def post(self): class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/") # 如果是get提交就进入get函数,post提交就进入post函数 # 底层走的是dispatch函数,他会根据你的提交方式分发到不同函数里 # 我们也可以重写这个方法,加入一些其他限制,例如限制ip等等
2. Request对象
2.1 请求相关的方法
path_info # 返回用户访问url,不包括域名 method # 请求中使用的HTTP方法的字符串表示,全大写表示。 GET # 包含所有HTTP GET参数的类字典对象 POST # 包含所有HTTP POST参数的类字典对象 body # 请求体,byte类型 request.POST的数据就是从body里面提取到的 FILLES # 获取文件
【注意】
注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:
request.POST.getlist("hobby")
2.2 案例演示
def upload(request): """ 保存上传文件前,数据需要存放在某个位置。默认当上传文件小于2.5M时,django会将上传文件的全部内容读进内存。从内存读取一次,写磁盘一次。 但当上传文件很大时,django会把上传文件写到临时文件中,然后存放到系统临时文件夹中。 :param request: :return: """ if request.method == "POST": # 从请求的FILES中获取上传文件的文件名,file为页面上type=files类型input的name属性值 filename = request.FILES.get('file') # 在项目目录下新建一个文件 with open(filename, "wb") as f: # 从上传的文件对象中一点一点读 for chunk in request.FILES["file"].chunks(): # 写入本地文件 f.write(chunk) return HttpResponse("上传OK") 方法
3. Response对象
响应对象主要有三种形式:
HttpResponse()
render()
redirect()
3.1 HttpResponse()
HttpResponse()括号内直接跟一个具体的字符串作为响应体
from django.http import HttpResponse response = HttpResponse("Here's the text of the Web page.") response = HttpResponse("Text only, please.", content_type="text/plain")
3.2 render()
from django.shortcuts import render def my_view(request): # 视图的代码写在这里 return render(request, 'myapp/index.html', {'foo': 'bar'})
3.3 redirect()
参数可以是:
- 一个模型:将调用模型的get_absolute_url() 函数
- 一个视图,可以带有参数:将使用urlresolvers.reverse 来反向解析名称
- 一个绝对的或相对的URL,将原封不动的作为重定向的位置。
默认返回一个临时的重定向;传递permanent=True 可以返回一个永久的重定向。
【最常用的参数为一个url】
def my_view(request): ... return redirect('/some/url/')
【了解】
传递一个具体的ORM对象
from django.shortcuts import redirect def my_view(request): ... object = MyModel.objects.get(...) return redirect(object)
传递要重定向到的一个具体的网址
def my_view(request): ... return redirect('http://example.com/')
传递一个视图的名称
def my_view(request): ... return redirect('some-view-name', foo='bar')
4. JsonResponse
JsonResponse是HttpResponse的子类,专门用来生成JSON编码的响应。
# 第一种方式 import json data={'name':'lqz','age':18} data1=['lqz','egon'] return HttpResponse(json.dumps(data1)) # 第二种方式 from django.http import JsonResponse # data = {'name': 'lqz', 'age': 18} data1 = ['lqz', 'egon'] return JsonResponse(data) return JsonResponse(data1,safe=False) # 默认只能传递字典类型,如果要传递非字典类型需要设置一下safe关键字参数。