python - Unicode 警告 : Unicode equal comparison failed to convert both arguments to Unicode

标签 python mysql django

这是我转到相关 View 时遇到的完整错误。

/Library/Python/2.7/site-packages/django/core/files/base.py:106: UnicodeWarning: Unicode 相等比较未能将两个参数转换为 Unicode - 将它们解释为不相等 如果 ('\n', '\r') 中的第 [-1] 行:

代码非常简单。这是在我的 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/')

完整的衣服模型如下所示:

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 以防出现问题。

这里有什么问题?

最佳答案

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

HttpResponse 只需要一些可以将其视为字符串的东西 - 如果您给它一个迭代器,它会立即读取所有内容并创建一个字符串,因此不会节省内存:

HttpResponse will consume the iterator immediately, store its content as a string, and discard it.

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

因此,您需要一些东西来提取图像文件包装器对象的内容,而无需通过迭代接口(interface)。 read方法就是这样做的,如果你不给它一个字节数参数,就会提取文件的全部内容。因此,我首先要尝试的是:

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

这是未经测试的,所以我可能忽略了一些东西。

您也可以尝试分析更简单的情况,即让您的托管 Web 服务器处理图像,并只提供重定向到 URL 的服务。从 FileField 返回。这将涉及一个额外的 HTTP 往返行程来告诉浏览器去哪里看,所以我不认为对于哪种方法会更快有一个通用的规则。

关于python - Unicode 警告 : Unicode equal comparison failed to convert both arguments to Unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18756205/

相关文章:

python - 使用 Django 级联更新和删除

python - 在 vba 和 python 中自动进行工作簿计算

mysql - 为什么我在 NodeJS 中使用 MySQL 时需要连接互联网?

python - 使用 Python 程序写入和读取 cmd 提示符

php - 如何用 while 循环绘制并填充表格?

mysql - 关于 mysql 的混淆,例如 search 和 = search

django - phonenumber@vtext.com 与 Twilio、Clickatell 等比较?

Python游标动态选择列

python - Selenium:用户关闭弹出窗口后切换到主窗口

python - "How to fix: ' 只有整数、切片( `:` )、省略号( `...` )、numpy.newaxis ( `None` ) 和整数或 bool 数组是有效索引'?