python - 嵌套字典作为 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 函数。有任何想法吗?我真的不想将这个当前系统实施到生产中。
解决方案
推荐阅读
- vue.js - 刷新时在有效子域页面上获取 404
- dataframe - Pyspark Dataframe - 如何过滤掉另一个数据框中匹配的记录?
- snowflake-cloud-data-platform - 我如何回退并扣除我的试用帐户的角色等级?
- spring - Spring Boot——不同bean实现的自动装配接口
- r - R中多个变量的高值和低值并排显示geom_boxplot?
- javascript - reactjs自定义组件输入值不会随着状态变化而更新
- python - 填充来自 Pandas 中其他列的相邻值的值
- c - 分离通用代码并放置通用标头
- javascript - 单击时移动文本插入点(插入符号)
- hadoop - 如何在 Cloudera 分发中获取总集群空间配额