' Latin-1的'编解码器不能对位置67-70中的字符进行编码:序数不在范围内(256)

时间:2018-04-04 10:27:25

标签: python django url encode

我有一个url链接,其中包含一些中文字符(http://localhost:8000/media/imges/qiyun_admin_physicalserver_webmanage/operation_system/域名解析.png)以供请求

如果我从浏览器地址栏复制中文包含的URL,它就变为: http://localhost:8000/media/imges/qiyun_admin_physicalserver_webmanage/operation_system/%E5%9F%9F%E5%90%8D%E7%BB%91%E5%AE%9A.png

出现错误:

  

' Latin-1的'编解码器不能对位置67-70中的字符进行编码:序数不在范围内(256)

enter image description here

我在SO中找到了相关帖子: UnicodeEncodeError: 'latin-1' codec can't encode character

我已使用utf-8编码检查了数据库,表格也是utf-8

enter image description here

enter image description here

但为什么我得到编码错误?如何解决这个问题?

我的后端是Django / Django-Rest-Framework。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题 这里的问题是图像“文件”的名称 我认为它在开发服务器上运行良好,在生产服务器上出现错误

这需要一些配置,以使服务器可以提供具有此类名称的文件。 为了安全起见,使用网址和将包含在网址中的文件名 如前所述,她https://stackoverflow.com/a/1547940/6840261 我想出了解决方案,如果文件或图像的格式不正确,则更改其名称,因为此答案提到了https://stackoverflow.com/a/1547940/6840261 我是
不生成名称,我仅将文件命名为“ a.thesameextension_of_thefile”,而Django处理多个具有相同名称的文件 您必须在save()处添加代码以应用于新模型的每次更改或添加

class City(models.Model):
    name = models.CharField(max_length=100, verbose_name=_("City Name"),
                            validators=[RegexValidator(r'^[\u0621-\u064A\u0660-\u0669]+$')])
    city_image = models.ImageField(upload_to='city/images/', blank=False, null=True, verbose_name=_("City Image"))

    def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
        name = self.city_image.name
        extension = name.split('.')[-1]
        for char in name:
            if char not in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.':
                self.city_image.name = 'a' + '.' + extension
                break
        instance = super(City, self).save(force_insert=False, force_update=False, using=None,
                                          update_fields=None)

此解决方案将很好地工作,还有一个解决方案,正如我在自己的问题中提到的那样,但我认为它不是一个好解决方案,因为您将不得不向django请求处理程序和wsgi的核心添加代码 您可以检查它How to fix [ERROR] [2699022] wsgiHandler pApp->start_response() return NULL?