django_elasticsearch_dsl测试触发indices:admin/create报错及索引权限设置问题
错误核心原因
这个400非法参数错误在你的测试场景下通常有三类触发原因:
- ES删除索引是异步操作,你在代码中删除索引后立刻发起创建请求,此时索引还未被完全清理,导致创建冲突
- 你Django配置的ES连接端口错误,报错中显示的
9300是ES节点间内部通信的TCP端口,客户端SDK默认走HTTP REST协议需使用9200端口 - 连接ES使用的账号缺少索引创建、删除的管理员权限
报错解决方法
1. 修复测试类索引操作逻辑
增加删除后的等待逻辑,避免异步操作冲突,修改后的代码如下:
import time class SearchTestMixin(object): def setup_method(self): for index in registry.get_indices(): if index.exists(): index.delete() # 最多等待1秒确认索引完全删除 retry_count = 0 while index.exists() and retry_count < 5: time.sleep(0.2) retry_count += 1 index.create() def teardown_method(self): for index in registry.get_indices(): if index.exists(): index.delete()
2. 修正ES连接端口配置
检查Django配置文件中的ELASTICSEARCH_DSL配置项,确保端口为9200,参考配置:
ELASTICSEARCH_DSL = { 'default': { 'hosts': 'x.x.x.x:9200', 'http_auth': ('ES账号', 'ES密码') } }
索引权限配置修改方法
如果确认是权限不足导致的报错,可按以下步骤配置ES权限(使用ES内置安全模块):
- 登录拥有管理员权限的ES账号,创建测试专用角色,赋予索引管理权限:
PUT /_security/role/django_es_test_role { "indices": [ { "names": ["*"], "privileges": ["indices:admin/create", "indices:admin/delete", "indices:data/write/*", "indices:data/read/*"] } ] }
生产环境建议将names字段替换为实际使用的索引名,避免权限过大。
2. 将创建好的角色绑定到Django使用的ES账号上:
POST /_security/user/你的ES账号名/_update { "roles": ["django_es_test_role"] }
内容的提问来源于stack exchange,提问作者Marcel Kamiński
相关产品推荐
相关产品推荐

