【Django】使用requests并通过ORM修改数据操作的一次脱坑记录

简介: 【Django】使用requests并通过ORM修改数据操作的一次脱坑记录

最近在写接口自动化的测试平台,在请求接口回填响应头数据的这一步遇到了一个小问题,想要通过requests库自带的获取响应头的方法(r.headers),然后拿到值后传给前端进行展示,展示效果如下:

4916e175b05d4be48e2e383edd9d731e.png开始调试时一切都好好的,但为了将该数据做保存记录的时候出了一些问题,报了一个不常见的错误:

f6bb797c4d9b48268a9d1fc8ce952853.png


第一反应是django序列化相关的的问题,按报错日志追溯到是代码中通过ORM批量创建数据入库的这一步报错,分析了一下还是没有啥头绪:

d01b1358380d40339f13fd0714c6b682.png


打了断点、加注释调试也没发现什么结果,也没有怀疑是因为增加了获取响应header这个操作导致的问题,后面实在无头绪将这部分代码注释后就不报错,能够正常运行了!


然后经过一些调试发现requests返回的响应header是:<class 'requests.structures.CaseInsensitiveDict'>这个类型,这是一个requests自定义的数据结构,是一个不区分大小写的纯字符串键的数据结构,它也会包含一些byte数据所以在序列其为json字符串时会报错:

class CaseInsensitiveDict(MutableMapping):
    """A case-insensitive ``dict``-like object.
    Implements all methods and operations of
    ``MutableMapping`` as well as dict's ``copy``. Also
    provides ``lower_items``.
    All keys are expected to be strings. The structure remembers the
    case of the last key to be set, and ``iter(instance)``,
    ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()``
    will contain case-sensitive keys. However, querying and contains
    testing is case insensitive::
        cid = CaseInsensitiveDict()
        cid['Accept'] = 'application/json'
        cid['aCCEPT'] == 'application/json'  # True
        list(cid) == ['Accept']  # True
    For example, ``headers['content-encoding']`` will return the
    value of a ``'Content-Encoding'`` response header, regardless
    of how the header name was originally stored.
    If the constructor, ``.update``, or equality comparison
    operations are given keys that have equal ``.lower()``s, the
    behavior is undefined.
    """
    def __init__(self, data=None, **kwargs):
        self._store = OrderedDict()
        if data is None:
            data = {}
        self.update(data, **kwargs)
    def __setitem__(self, key, value):
        # Use the lowercased key for lookups, but store the actual
        # key alongside the value.
        self._store[key.lower()] = (key, value)
    def __getitem__(self, key):
        return self._store[key.lower()][1]
    def __delitem__(self, key):
        del self._store[key.lower()]
    def __iter__(self):
        return (casedkey for casedkey, mappedvalue in self._store.values())
    def __len__(self):
        return len(self._store)
    def lower_items(self):
        """Like iteritems(), but with all lowercase keys."""
        return (
            (lowerkey, keyval[1])
            for (lowerkey, keyval)
            in self._store.items()
        )
    def __eq__(self, other):
        if isinstance(other, Mapping):
            other = CaseInsensitiveDict(other)
        else:
            return NotImplemented
        # Compare insensitively
        return dict(self.lower_items()) == dict(other.lower_items())
    # Copy is required
    def copy(self):
        return CaseInsensitiveDict(self._store.values())
    def __repr__(self):
        return str(dict(self.items()))

所以这里我直接将其转换为dict类型就可以解决这个问题:


原:req_log['res_headers'] = r.headers
改:req_log['res_headers'] = dict(r.headers)


我也并未花更多时间去研究该数据结构的功能,这里主要是做个笔记提醒自己。


目录
相关文章
|
5天前
|
前端开发 JavaScript BI
Django教程第5章 | Web开发实战-数据统计图表(echarts、highchart)
使用echarts和highcharts图表库实现折线图、柱状图、饼图和数据集图
71 2
|
5天前
|
设计模式 JSON 前端开发
前后端配置动态的数据字段标签(django_vue)
前后端配置动态的数据字段标签(django_vue)
22 0
|
5天前
|
Oracle 关系型数据库 MySQL
Django框架ORM操作(二)
Django框架ORM操作(二)
|
5天前
|
SQL 存储 前端开发
Django框架ORM操作(一)
Django框架ORM操作(一)
Django框架ORM操作(一)
|
5天前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
20 0
|
5天前
|
SQL 缓存 数据库
Django ORM的性能优化:高效处理大量数据
【4月更文挑战第15天】本文介绍了优化Django ORM性能的六大技巧:1) 使用批量操作如bulk_create和bulk_update;2) 利用prefetch_related和select_related减少查询次数;3) 为常用字段添加索引;4) 优化数据库查询,避免循环查询;5) 使用缓存提升频繁查询性能;6) 在必要时使用原生SQL。这些策略能帮助处理大量数据时提升Django ORM的效率。
|
5天前
|
SQL 自然语言处理 数据库连接
Django ORM的魔力:简化数据库操作与迁移
【4月更文挑战第15天】Django ORM是Django框架的关键部分,提供了一种高级的面向对象方式与数据库交互,简化了手动SQL操作。通过定义Python数据模型,开发者能轻松创建数据库表结构,使用ORM执行查询、添加、修改和删除数据。Django ORM还自动化处理数据库连接、事务和数据类型转换。当模型变化时,Django的迁移工具帮助管理数据库结构的更新。通过这种方式,Django ORM促进了高效、专注于业务逻辑的Web开发。
|
5天前
|
SQL API 数据库
python的Django ORM框架深度解析
【4月更文挑战第14天】在Python的Web开发领域,Django无疑是一个备受推崇的框架。它提供了许多强大的工具和功能,使得开发者能够高效、快速地构建出高质量的Web应用。而在Django的众多特性中,ORM(对象关系映射)框架更是其不可或缺的一部分。本文将详细解析Django ORM框架,帮助读者更好地理解和使用它。
|
5天前
|
前端开发 API 数据库
Django(五):如何在Django中通过API提供数据库数据给前端
Django(五):如何在Django中通过API提供数据库数据给前端
|
5天前
|
SQL API 数据库
一篇文章带你了解Django ORM操作
一篇文章带你了解Django ORM操作
26 0