Django REST View调用Web3合约方法报hex字符串格式错误问题咨询
问题原因及解决方案
核心根因
报错提示中的异常值"'0x6e...32'"外层额外包裹了一层单引号,不符合web3要求的0x开头纯十六进制字符串格式,该问题和你使用Infura还是Etherscan节点没有关联,完全是参数传递过程中的格式异常导致。
触发差异说明
你直接在web3s.py内部调用firstMethod时,传入的是没有多余包裹的纯十六进制字符串,所以校验通过可以正常运行;从Django REST框架视图传入参数时,参数被额外加了一层引号,所以触发报错。常见的参数污染场景包括:
- 前端传参时误对地址字段做了二次字符串转义,导致多了一层引号
- 从
request.data中取参数时没有做格式清洗,直接将带引号的字符串传入方法 - 测试接口时在请求参数中手动写了两层引号,比如JSON参数误写为
"address": "'0x6e...32'"而非正确的"address": "0x6e...32" - DRF序列化器对地址字段的反序列化逻辑异常,自动追加了多余引号
排查与修复方案
- 先在方法入口增加参数打印,确认异常参数来源:
def firstMethod(Address1,publicKey,privateKey,GasPrice = default_GasPrice ) : # 新增参数校验打印,确认入参格式 print(f"Address1值:{Address1},类型:{type(Address1)}") print(f"publicKey值:{publicKey},类型:{type(publicKey)}") print(f"privateKey值:{privateKey},类型:{type(privateKey)}") Address1 = web3.toChecksumAddress(Address1) publicKey = web3.toChecksumAddress(publicKey) # 原有逻辑
- 确认参数存在多余引号后,增加通用的十六进制字符串清洗逻辑:
def clean_hex_param(raw_str: str) -> str: # 去除首尾空白字符、多余的单/双引号 return raw_str.strip().strip("'").strip('"') def firstMethod(Address1,publicKey,privateKey,GasPrice = default_GasPrice ) : # 先清洗参数再做后续处理 Address1 = clean_hex_param(Address1) publicKey = clean_hex_param(publicKey) privateKey = clean_hex_param(privateKey) Address1 = web3.toChecksumAddress(Address1) publicKey = web3.toChecksumAddress(publicKey) # 原有逻辑
- 同步排查DRF侧的参数传递链路:如果使用了序列化器,检查地址字段的反序列化规则;如果是直接从请求对象取参,确认取参逻辑没有额外转义。
内容的提问来源于stack exchange,提问作者vahidodin moghimi
相关产品推荐
相关产品推荐

