Django 视图响应函数详解-HttpResponse、JsonResponse、StreamingHttpResponse、FileResponse、Render

视图相应函数

  • 一、 HttpResponse 响应函数
    • 1.1. HttpResponse响应一览表
    • 1.2. HttpResponse响应格式
    • 1.3. HttpResponse 示例
  • 二、JsonResponse 响应
    • 2.1. JsonResponse结构
    • 2.2 JsonResponse示例
  • 三、StreamingHttpResponse 响应
    • 3.1 StreamingHttpResponse结构
  • 四、FileResponse响应
    • 4.1 FileResponse结构
  • 五、Render 响应函数
    • 5.1 render函数结构
    • 5.2 render函数示例

视图函数接收HTTP请求并相应,可以放在任何地方,可以是任何功能。

  • 视图函数可以返回web文本、重定向、页面、请求、图片等任何内容。
  • 视图函数通过HttpResponse、JsonResponse等类表达并返回响应。
  • 视图函数一般放在对应app中的views.py中。

Django的相应类型:

    1. HttpResponse类及子类
    1. JsonResponse类
    1. StreamingHttpResponse类
    1. FileResponse类
    1. 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 示例

Created with Raphaël 2.2.0 在全局路径中增加需要相应HttpResponse路径 在应用中增加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):以流形式打开后的文件

FileResponseStreamingHttpResponse的子类

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

你可能感兴趣的:(Django,60天创建个人网站,Python学习,django,视图,views,视图响应,Render,渲染)