Django学习笔记之视图响应类型
视图函数编写原则
- 视图函数接受HTTP请求并返回响应,可以放在任何地方,可以是任何功能的;
- 视图函数可以返回Web文本,页面,重定向,错误,图片等任何内容;
- 视图函数通过HttpResponse(10个)、JsonResponse、streamingHttpResponse、FileResponse等类表达并返回响应;
- 按约定,视图函数放在对应app的views.py文件中。
响应类型详解
(1)HttpResponse类及其子类:
类型 | 说明 | 状态码 |
---|---|---|
HttpResponse | 主要反馈类型,父类 | 默认码为200 |
HttpResponseRedirect | 重定向 | 302 |
HttpResponsePermanentRedirect | 永久重定向 | 301 |
HttpResponseNotModified | 网页无改动,该类型无任何参数 | 304 |
HttpResponseBadRequest | 不良响应 | 400 |
HttpResponseForbidden | 禁止访问 | 403 |
HttpResponseNotAllowed | 不被允许 | 405 |
HttpResponseGone | 无 | 410 |
HttpResponseServerError | 服务器错误 | 500 |
HttpResponseNotFound | 404错误 | 404 |
HttpResponse:
HttpResponse(content , content_type = None , status = 200 , charset = None)
其中 content:拟输入的字符串 ; content_type:MIME格式的放回内容类型 ; status:响应状态码 ; charset:响应的字符
引用方式:from django.http import HttpResponse
举例:
def homeproc(request):
response = HttpResponse()
response.write("<h1>这是首页,具体功能请访问<a href='./msggate/'>这里</a></h1>") #可忽略
response.write("<h1>hhhhhhh</h1>")
return response
实现效果:(Microsoft Edge)
(2)JsonResponse类
JsonResponse(data)
其中data是字典类型,返回Json数据类型
举例:
def homeproc2(request):
response = JsonResponse( {'key':'value'})
return response
实现效果:(在火狐浏览器下)
(3) streamingHttpResponse类
streamingHttpResponse(streaming_content) #streaming_content是内容的迭代形式,以内容流的方式响应
详见https://blog.csdn.net/qq_42245189/article/details/99937712
(4) FileResponse类
FileResponse(stream) #stream:以流的形式打开后的文件
举例:(需import os)
def homeproc3(request):
cwd = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
response = FileResponse(open(cwd + "/msgapp/templates/chelsea-gray.jpg","rb")) #随便找张图片
response['Content-Type'] = 'application/octet-stream' #用于指定文件类型
response['Content-Disposition'] = 'attachment;filename="chelsea-gray.jpg"' #用于指定下载文件的默认名称
return response
关于os.path.dirname等相关操作参考https://blog.csdn.net/JOJOY_tester/article/details/54598713
Django请求类型的判断
路由不能判断Http请求的协议,Django通过decorators在视图函数前进行基本判断:
from django.views.decorators.http import require_http_methods
@require_http_methods(['GET','POST'])
def my_view(request):
#只处理GET和POST方法,其他方法将被过滤
pass