当Flask项目运行路径包含中文时,请求静态文件时,后台报错:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xbd in position 1: ordinal not in range(128)
原因:
os.path.join拼接str和unicode时需要对str先解码,解码时使用默认的编码(sys.getdefaultencoding(),一般为ascii),而路径获取到的多是系统的文件编码(sys.getfilesystemencoding(),windows一般为gbk),所以解码失败。
请求静态文件时,Flask将文件名和静态文件夹拼接,文件名为unicode(Flask处理传入的参数默认为unicode),而静态文件夹static_folder由root_path和static_path拼接而成,其中root_path如果未指定的话会通过os.path.dirname(os.path.abspath(__file__))来获取,如此在windows下获取的就是gbk编码,最终导致上述错误。
解决办法:
1、修改路径为不含中文可解决该问题。
2、如果路径不可修改,必须包含中文路径时,可在初始化时,设置root_path来解决(Flask 0.10及之前不可用,因为Flask 0.10及之前版本构造函数没有root_path这个参数)。