1

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

/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'):

代码非常简单。这是我的观点.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

这里有什么问题?

4

1 回答 1

3

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

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

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

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

因此,您需要一些能够在不通过迭代接口的情况下提取图像文件包装对象内容的东西。read方法会这样做,如果你不给它一些字节参数,则拉入文件的全部内容。因此,我要尝试的第一件事是:

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

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

您还可以尝试分析更简单的情况,让您的托管 Web 服务器处理图像,并仅提供FileField. 这将涉及额外的 HTTP 往返来告诉浏览器在哪里查看,所以我不认为有一个通用规则来说明哪种方法会更快。

于 2013-09-12T08:43:41.390 回答