在Django中运行脚本遇Struct参数错误,Python中正常运行求助
解决Django中Struct()参数类型错误:AD SID转换时的问题
我之前处理AD SID转换时也碰到过一模一样的问题——纯Python脚本跑的好好的,放到Django里就报Struct() argument 1 must be string, not unicode。结合你的代码和报错信息,我来帮你捋捋原因和解决办法:
问题根源
在Python 2环境中(大概率你的Django项目用的是Python 2),struct.unpack()只接受**字节串(str类型)**作为参数,但在Django环境下,ldap库返回的objectSid切片可能被自动转换成了unicode类型——这和纯Python环境的字符串处理逻辑不一样,所以就触发了报错。你觉得切片后的值不是unicode,但实际在Django的上下文里,框架的字符串自动处理或者ldap连接的配置可能悄悄改变了数据类型。
解决方案
核心思路就是在Python 2环境下,把传给struct.unpack()的sid切片强制转换成字节串(str类型)。修改你的代码如下:
import sys import struct import ldap # 你的原有连接和搜索逻辑 result = con.search_s(ldap_base, ldap.SCOPE_SUBTREE, criteria, attributes) sid = result[0][1]["objectSid"][0] if sys.version_info.major < 3: revision = ord(sid[0]) number_of_sub_ids = ord(sid[1]) # 关键:将切片强制转为str(字节串) iav_slice = str(sid[2:8]) iav = struct.unpack('>Q', b'\x00\x00' + iav_slice)[0] # 处理子ID时同样做类型转换 sub_ids = [] for i in range(number_of_sub_ids): sub_slice = str(sid[8 + 4 * i:12 + 4 * i]) sub_ids.append(struct.unpack('<I', sub_slice)[0]) else: revision = sid[0] number_of_sub_ids = sid[1] iav = struct.unpack('>Q', b'\x00\x00' + sid[2:8])[0] sub_ids = [struct.unpack('<I', sid[8 + 4 * i:12 + 4 * i])[0] for i in range(number_of_sub_ids)] sid_str = 'S-{0}-{1}-{2}'.format(revision, iav, '-'.join([str(sub_id) for sub_id in sub_ids]))
额外排查点
如果修改后还是报错,可以检查这两个地方:
- 查看ldap连接的配置,是否有开启自动字符串编码的选项,导致二进制的
objectSid被转成了unicode; - 检查Django项目的
settings.py里的字符串相关设置,比如DEFAULT_CHARSET是否影响了数据的类型转换。
内容的提问来源于stack exchange,提问作者Ezekiel145
相关产品推荐
相关产品推荐

