UnicodeWarning:Unicode相等比较无法将两个参数都转换为Unicode

时间:2013-09-12 05:42:54

标签: python mysql django

这是我进入相关视图时收到的完整错误。

/Library/Python/2.7/site-packages/django/core/files/base.py:106: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal if line[-1] in ('\n', '\r'):

代码非常简单。这是在我的views.py

def my_image(request):
    clothes = Clothes.objects.get(clothesid = '2')
    get_image = clothes.image
    return HttpResponse(get_image, mimetype="image/png")

这是我的models.py

image = models.FileField(upload_to='images/')

完整的Clothes模型如下所示:

class Clothes(models.Model):
    clothesid = models.IntegerField(primary_key=True)
    clothessize = models.CharField(max_length=255L, blank=True)
    clothescolour = models.CharField(max_length=255L, blank=True)
    clothestype = models.CharField(max_length=255L, blank=True)
    image = models.FileField(upload_to='images/')
    url = models.CharField(max_length=255L, blank=True)
    gender = models.CharField(max_length=1L, blank=True)
    clothescategory = models.CharField(max_length=255L, blank=True)
    clothesage = models.CharField(max_length=255L, blank=True)

    class Meta:
        db_table = 'Clothes'

    def __unicode__(self):
        return self.image.name

在MySQL中,如果出现问题,图像字段将整理为latin1_swedish_ci

这是什么问题?

1 个答案:

答案 0 :(得分:3)

您将FileField image返回的值直接传递给响应,就好像它是字符串或可迭代的一样。检查source code给出的异常路径,我们看到该字段返回的对象在其__iter__方法中有违规行 - 包装类正在寻找行终止符。原始图像文件可能包含无法转换为可与行终止符字符进行比较的字节,这当然是合理的。

HttpResponse只需要它可以视为字符串的东西 - 如果你给它一个迭代器,它会立即读取它并创建一个字符串,所以没有可用的内存节省:

  

HttpResponse将立即使用迭代器,将其内容存储为字符串,然后将其丢弃。

https://docs.djangoproject.com/en/dev/ref/request-response/#passing-iterators

因此,您需要能够在不通过迭代接口的情况下提取图像文件包装器对象内容的内容。 read方法执行此操作,如果您没有为其提供多个字节参数,请拉入文件的整个内容。因此,我要尝试的第一件事是:

return HttpResponse(get_image.read(), mimetype="image/png")

这是未经测试的,所以我可能忽视了一些事情。

您可能还尝试分析让托管网络服务器处理图片的简单情况,并仅提供从FileField返回的URL的重定向。这将涉及额外的HTTP往返告诉浏览器在哪里查看,所以我认为没有一个通用的规则,哪种方法会更快。