• python测试开发django-16.JsonResponse返回中文编码问题


    前言

    django查询到的结果,用JsonResponse返回在页面上显示类似于u4e2du6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码

    遇到问题

    接着前面的User表,测试数据如下

    user_name psw mail
    yoyo 123456 283340479@qq.com
    yoyo2 111111 1
    yoyo5 111111 0

    接着上一篇【python测试开发django-15.查询结果转json(serializers)】,如果数据库里面有中文的数据,
    返回的json数据中文不能正常显示如下,查询的结果中有{"user_name": "u4e0au6d77-u60a0u60a0", "psw": "u5bc6u7801", "mail": "u4e2du6587"}

    {
    	"data": [{
    		"user_name": "yoyo",
    		"psw": "123456",
    		"mail": "283340479@qq.com"
    	}, {
    		"user_name": "yoyo2",
    		"psw": "111111",
    		"mail": "1"
    	}, {
    		"user_name": "yoyo5",
    		"psw": "111111",
    		"mail": "0"
    	}, {
    		"user_name": "u4e0au6d77-u60a0u60a0",
    		"psw": "u5bc6u7801",
    		"mail": "u4e2du6587"
    	}]
    }
    

    解决办法

    JsonResponse里面有个参数json_dumps_params,设置为json_dumps_params={'ensure_ascii':False}即可

    class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)  
    
      data: 应该传递一个标准的 python 字典给它,它将其转换成 json 格式的数据。
    
      encoder:默认为 django.core.serializers.json.DjangoJSONEncoder,用于序列化data。关于这个序列化的更多信息参见JSON 序列化。
    
      safe : 默认为True。如果设置为False,可以传递任何对象进行序列化(否则,只允许dict 实例)。如果safe 为True,而第一个参数传递的不是dict 对象,将抛出一个TypeError。
    
    另外:它的默认 Content-Type 头部设置为application/json。
    
      json_dumps_params:在1.9版本中新增,可以传递一个python标准的 json 库中,json.dump() 方法处理后的对象给它,用于生成一个响应。
    

    修改后代码(上一篇的三种方法都适用)

    def json_data(request):
        '''values()获取的可迭代dict对象转list'''
        data = {}
        ret = User.objects.all().values()
        data["data"] = list(ret)
        return JsonResponse(data,
                            safe=False,
                            json_dumps_params={'ensure_ascii':False})
    

    在urls.py配置访问地址 url(r'^json_data$', testdb.json_data,访问后得到的结果(返回的数据自己在线解析过)

    {
    	"data": [{
    		"user_name": "yoyo",
    		"psw": "123456",
    		"mail": "283340479@qq.com"
    	}, {
    		"user_name": "yoyo2",
    		"psw": "111111",
    		"mail": "1"
    	}, {
    		"user_name": "yoyo5",
    		"psw": "111111",
    		"mail": "0"
    	}, {
    		"user_name": "上海-悠悠",
    		"psw": "密码",
    		"mail": "中文"
    	}]
    }
    

    django交流QQ群:779429633

  • 相关阅读:
    C语言文本文件实现局部修改
    TTMS框架设计思路及实例介绍
    浅谈函数与操作符的重载
    Java:继承与多态
    Java:类与对象(二)
    Java : 类与对象(一)
    C语言 数的阶乘、高次幂、大数加法及大数乘法
    C语言下的位运算
    enum:枚举类型介绍与简单使用
    C语言实现字符界面下的学生管理成绩系统
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/10339210.html
Copyright © 2020-2023  润新知