下午在Django里连接telnet服务器,总报"ascii codec can't decode byte ... ordinal not in range 128"错误,参考,发现是由于Python2.x telnetlib的连接参数要求是str类型,但Django里所有的字符串都是unicode,二者不兼容导致上述错误,解决方法是用Django提供的smart_str()方法将unicode转换为str:
from neconnector.models import Channel from django.utils.encoding import smart_str import telnetlib def translate_str(input):
return smart_str(input, encoding='utf-8', strings_only=False, errors='strict')
ch = get_object_or_404(Channel, pk=conn_id) #从数据库里取出unicode类型对象
ip = translate_str(ch.ip) # 转换为str
tn = telnetlib.Telnet(ip)
...
同理,写入数据库时需要用smart_unicode方法做逆向转换。