Django入门教程

前言

第一章: django快速入门

第二章: django MTV架构

第三章: django视图

第四章: django模板

第五章: django模型

第六章: django后台管理系统

第七章: 项目实战-简易的博客系统

第八章:django表单

第九章:django用户认证系统

第十章:django中的会话

第十一章:django安全

第十二章:django性能优化

第十三章:django实用工具

首页 > Django入门教程 > 第三章: django视图 > 3.4节: 响应Json数据与文件

3.4节: 响应Json数据与文件

薯条老师 2020-08-25 07:19:57 235540 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

3.4.1 使用HttpResponse响应json数据

django视图在收到客户端的请求以后,必须返回HttpResponse对象或HttpResponse的子类对象。HttpResponse默认响应的数据类型为html文本,其对应的MIME类型为text/html。对于浏览器来说,从服务端返回的数据都是HTML文本,通过在服务端定义数据的MIME类型,可以让浏览器按不同的数据类型对数据进行解析。JSON格式进行举例,服务端将响应的MIME类型设置为application/json,那么浏览器会对响应的数据解析为json格式。

代码实例-在django中响应json格式的数据:

# 在views.py中导入json模块
import json
 
# 新增的视图类Json
class Json(View):
    def get(self, request):
        data = {"author": "薯条老师"}
        # 响应的数据中包含非ASCII字符,需要将ensure_ascii设置为False
        json_data = json.dumps(data, ensure_ascii=False)
        # 通过HttpResponse的content_type参数来指定MIME类型
        return HttpResponse(json_data, content_type="application/json")

urls.py中定义与Json视图的路由:

urlpatterns = [
    # 定义与json视图的路由
    path('json/', blog.Json.as_view()),
]

现在进入windows命令行,切换到D盘所在的django-project目录,执行python manage.py runserver 8080启动django服务器。服务器启动成功以后,在浏览器地址栏输入http://127.0.0.1:8080/json/,并按下回车键:

image.png 

 

从浏览器中可以看到从django中响应的数据,此时再按下键盘的F12键,进入浏览器的调试模式(薯条老师使用的为谷歌浏览器):

 image.png 

再按下键盘的CTRL+R组合键刷新页面:

image.png 

 

点击右侧调试窗口中的json/,在Headers菜单中,可以查看数据的MIME类型:

image.png

 

从Content-Type字段中可以看出,数据的MIME类型为application/json。

3.4.2 使用JsonResponse响应Json数据

在上节内容中,我们做了以下两步操作,以响应json格式的数据:

(1) 先利用json模块,将字典对象序列化为json格式的数据

(2) 通过HttpResponse构造函数的content_type参数,将数据的MIME类型指定为application/json。

在实际开发中,我们可以将这两步操作封装起来,以减少冗余的代码。通常的做法是,从HttpResponse中派生一个子类,然后在子类中通过json模块对Python中的可序列化对象进行序列化,同时设置content_type参数为application/json以上正是JsonResponse的实现原理,JsonResponse是Django的内置类型,其继承于HttpResponse,会自动将Python中的可序列化对象进行序列化,同时设置数据的MIME类型为application/json。

代码实例-使用JsonResponse响应json格式的数据

# 使用JsonResponse,需要从django.http模块中导出
from django.http import JsonResponse 
 
# 新增的视图类Json
class Json(View):
    def get(self, request):
        data = {"author": "薯条老师"}
        # 直接通过JsonResponse来响应Json格式的数据
        # 响应的数据中包含非ASCII字符,需要将ensure_ascii设置为False
        return JsonResponse(data,json_dumps_params={'ensure_ascii':False})

重复3.4.1节中的操作,在浏览器调试窗口中,我们可以发现数据的MIME类型为application/json

3.4.3 使用FileResponse下载文件

FileResponse是HttpResponse的间接子类,用来提供文件下载。我们现在进入Python交互模式执行from django.http import FileResponse导入FileResponse, 然后执行help(FileResponse)查看FileResponse的类定义:

>>> from django.http import FileResponse

>>> help(FileResponse)

Help on class FileResponse in module django.http.response:

 

class FileResponse(StreamingHttpResponse)

 |  FileResponse(*args, as_attachment=False, filename='', **kwargs)

 |

 |  A streaming HTTP response class optimized for files.

 |

 |  Method resolution order:

 |      FileResponse

 |      StreamingHttpResponse

 |      HttpResponseBase

 |      builtins.object

 |

 |  Methods defined here:

 |

 |  __init__(self, *args, as_attachment=False, filename='', **kwargs)

 |      Initialize self.  See help(type(self)) for accurate signature.

从输出可知FileResponse继承于StreamingHttpResponse,其构造函数主要有两个参数,分别是as_attachment以及filename。参数as_attachment表示以附件的形式下载,filename表示文件名。使用FileResponse进行文件下载,需要将MIME类型设置为application/octet-stream,同时设置文件的下载方式。代码实例-使用FileResponse提供文件下载:

import os
# 使用FileResponse,需要从django.http模块中导出
from django.http import FileResponse 
 
# 新增的视图函数file_download
def file_download(request, file_path):
    ext = os.path.basename(file_path).split('.')[-1].lower()
    # 只支持下载txt,word,excel格式的文件
    if ext in ['txt', 'dox', 'doxs','dox', 'xlsx']:
        response = FileResponse(open(file_path, 'rb'))
        # 设置MIME类型为application/octet-stream
        response['content_type'] = "application/octet-stream"
        # HTTP协议的Content-Disposition字段用来配置文件的下载方式,文件的基本信息
        # attachment表示以附件的形式下载文件
        response['Content-Disposition']='attachment;filename={}'.format(os.path.basename(file_path))
        return response

编写好视图函数以后,需要在urls.py中定义路由。

3.4.4 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:



欢迎 发表评论: