Django 视图响应函数详解-HttpResponse、JsonResponse、StreamingHttpResponse、FileResponse、Render
视图相应函数
视图函数接收HTTP请求并相应,可以放在任何地方,可以是任何功能。
- 视图函数可以返回web文本、重定向、页面、请求、图片等任何内容。
- 视图函数通过HttpResponse、JsonResponse等类表达并返回响应。
- 视图函数一般放在对应app中的views.py中。
Django的相应类型:
-     - HttpResponse类及子类
 
-     - JsonResponse类
 
-     - StreamingHttpResponse类
 
-     - FileResponse类
 
-     - Render类
 
一、 HttpResponse 响应函数
1.1. HttpResponse响应一览表
| 编码 | 定义 | 描述 | 
|---|---|---|
| 200 | HttpResponse | 常规响应,表示正常 | 
| 301 | HttpResponsePermanentRedirect | 永久重定向 | 
| 302 | HttpResponseRedirect | 访问重定向 | 
| 304 | HttpResponseNotModified | 网页未发生变化 | 
| 400 | HttpResponseBadRequest | 不良响应 | 
| 403 | HttpResponseForbidden | 禁止访问 | 
| 404 | HttpResponseNotFound | 网页丢失 | 
| 405 | HttpResponseNotAllowed | 响应不被允许 | 
| 410 | HttpResponseGone | 网页丢失 | 
| 500 | HttpResponseServerError | 服务器错误 | 
1.2. HttpResponse响应格式
HttpResponse(content, content_type=None,\
status=200, charset=None)
其中
content:拟返回的字符串
content_type:MIME格式的返回内容类型
status:响应的状态码
char_set:响应的字符集
1.3. HttpResponse 示例
# 在框架的url中增加HttpResponse函数对应的路径
# 这个是yourhtml下的urls
from yourapp import views as yourappviews
urlpatterns = [
	path('', yourappviews.func)
	]
# 在yourapp中的views增加对应的func
from django.http import HttpResponse
def func(request):
	response = HttpResponse()
	response.write('do something now.') # 这里会生成一个新的网页。
二、JsonResponse 响应
2.1. JsonResponse结构
JsonResponse(data):主要用于数据类型的相应,其中:
 data是{key:value}的字典键值对,返回Json的数据格式。
2.2 JsonResponse示例
from django.http import JsonResponse
def func(request):
	Response= JsonResponse({
   'key':'value'})
	return response
下面展示Django下载文件最优的两种方法
三、StreamingHttpResponse 响应
3.1 StreamingHttpResponse结构
StreamingHttpResponse(streaming_content):流式相应,内容的迭代器形式,以内容流的方式响应。
注:
StreamingHttpResponse一般多现实在页面上,不提供下载。
以下为示例代码
def streamDownload(resquest):
	def file_iterator(filepath, chunk_size = 512):
		with open(filepath, 'rb') as f:
			while True:
				con = f.read(512)
				if con:
					yield con
				else:
					break
	filename = os.path.abspath(__file__) + 'test.txt'
	response = StreamingHttpResponse(file_iterator(filename)
	return response	
# 最后程序会将结果打印在显示器上
四、FileResponse响应
4.1 FileResponse结构
FileResponse(stream):以流形式打开后的文件
FileResponse是StreamingHttpResponse的子类
def homeproc2(request):
	cwd = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
	response = FileResponse(open(cwd + "/msgapp/templates/youfile", "rb"))
	response['Content-Type] = 'application/octet-stream'
	response['COntent-Disposition'] = 'attachment;filename="filename"'
	return response
需要解释说明的是:
	response['Content-Type] = 'application/octet-stream'
	response['COntent-Disposition'] = 'attachment;filename="filename"'
Content-Type:用于指定文件类型。
COntent-Disposition:用于指定下载文件的默认名称,对,没错! “CO”两个字符都要大写。
两者都是MIME协议里面的标准类型。
五、Render 响应函数
开发一个网页,如何“跨”多级MVC的类,如何变静态网页为***页,如何将自己的上下文组合成内容再返回到网页前端?
 ——此时就需要render()函数了。
5.1 render函数结构
render(request, template_name, context=None, content_type=None, status=None, using=None)
必选参数
request:用于生成相应的请求对象。
template_name:要使用的模板的全名或者模板的序列。如果给定了一个列表,则选择存在的第一个模板。可选参数
context:表示要添加到模板上下文的值的字典。默认情况下,是一个空的字典,如果字典是可调用的,则视图将在渲染模板前调用它。
content_type:用于结果文档MIME类型默认为:setting配置文件:DEFAULT_CONTENT_TYPE的值。
status:默认相应为200。
using:用于加载模块的模块引擎:setting配置文件:NAME
5.2 render函数示例
from django.shortcuts import render
def my_view(request):
	return render(request, 'my_app\index.html', {
   'foo':'bar'}, content_type='application\xhtml+xml)
↓↓↓相当于以下内容↓↓↓
from django.http import HttpResponse
from django.template import loader
def my_view(request):
	t = loader.get_template("my_app\index.html")
	c = {
   "foo":"bar"}
	return HttpResponse(t.render(request, c), content_type='application\xhtml+xml')

