Django 视图响应函数详解-HttpResponse、JsonResponse、StreamingHttpResponse、FileResponse、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 示例

# 在框架的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')
全部评论

相关推荐

10-23 16:33
门头沟学院 Java
本人某中9本科,成绩中等,目前没科研没实习,目前后端学到了javaWeb,开始没定好方向,在学国外课程,走工程路线起步有点晚了,到这个时间点了还在学JavaWeb,顿感迷茫,不知道是坚持走下去还是寒假去准备考研。考研这个路弄得我还是心痒痒的,因为从众考研的人也不在少数,所以会有这方面的心理安慰吧,就是“不行我可以去考研啊”,而且意味着三年的缓冲,为了复试还有积攒经验美化简历,其实现在也可以去申入实验室打杂;就业可能意味着多些工作经验,工程岗应该到后面还是经验大于学历?还是有点迷茫了,求助好心人有无路线启发
千千倩倩:同27给点建议,现在这个时间点可以快速看完外卖和点评,不用跟着敲,但一定要在看的时候总结每个部分的整个业务流程,对其中的实现有一个大概的印象。然后直接开始看八股,刷算法。八股和算法最好还是在项目学习中穿插着看。如果计算机基础,算法这些基础好,加上每天刻苦学习,两周可以达到勉强能面试的水平,到时候就直接海投中小厂,在约面和面试的过程中不断巩固知识。没找到实习也没关系,就当积累经验。再沉淀一波直接明年三月开始投暑期,毕竟是9本,总是有面试机会的,只要你这三个月不懈怠,面试发挥得一定不错,只要拿到一个中,大厂暑期实习,秋招就有竞争力了。总得而言,现在还有机会,但是时间非常紧张,需要你结合自己情况考虑,共勉
你会选择考研还是直接就业
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务