首页 > 解决方案 > 嵌套字典作为 HttpRequest Django

问题描述

我正在尝试为我使用 Elasticsearch 和 Django 开发的一些代码编写一些测试用例。这个概念很简单——我只想测试一个获取请求,这将是一个 Elasticsearch 查询。但是,我将查询构造为嵌套字典。当我将嵌套字典传递给测试脚本中的客户端对象时,它通过 Django 传递,直到它最终到达 urlencode 函数,该函数看起来不像只能处理嵌套字典 MultivalueDicts。有什么建议或解决方案吗?我不想使用任何其他包,因为我不想依赖此应用程序可能不受支持的包。

通用代码:

class MyViewTest(TestCase):
    es_connection = elasticsearch.Elasticsearch("localhost:9200")

    def test_es_query(self):
        client = Client()
        query = {
            "query": {
                "term": {
                    "city": "some city"
                }
            }
        }
        response = client.get("", query)
        print(response)

urlencode 函数链接:urlencode Django

当 urlencode 函数检查字典值是 str 还是 bytes 对象时,问题显然出在条件语句上。如果不是,它会创建一个生成器对象,该对象永远无法访问字典的嵌套部分。

编辑:2018 年 7 月 25 日

所以我能够想出一个临时工作来至少运行测试。但是,它很丑陋,我觉得必须有更好的方法。我尝试的第一件事是指定 content_type 并首先将 dict 转换为 json 字符串。但是,Django 仍然在 urlencode 函数中反击和报错。

    class MyViewTest(TestCase):
    es_connection = elasticsearch.Elasticsearch("localhost:9200")

    def test_es_query(self):
        client = Client()
        query = {
            "query": {
                "term": {
                    "city": "some city"
                }
            }
        }
        response = client.get("", data=json.dumps(query), content_type="application/json")
        print(response)

所以我不得不这样做:

    class MyViewTest(TestCase):
    es_connection = elasticsearch.Elasticsearch("localhost:9200")

    def test_es_query(self):
        client = Client()
        query = {
            "query": {
                "term": {
                    "city": "some city"
                }
            }
        }
        query = json.dumps(query)
        response = client.get("", data={"q": query}, content_type="application/json")
        print(response)

这让我可以将 HttpRequest 发送到我的视图并使用以下方法解析它:

json.loads(request.GET["q"])

然后我能够成功地从 Elasticsearch 获取请求的数据并将其作为 HttpResponse 返回。我觉得在 Django 中,尽管必须有一种方法可以将 json 格式的字符串直接传递给 Client 对象的 get 函数。我认为将 content_type 指定为 application/json 会起作用,但它仍然调用 urlencode 函数。有任何想法吗?我真的不想将这个当前系统实施到生产中。

标签: pythondjangodictionaryelasticsearchurl-encoding

解决方案


推荐阅读