这是我转到相关 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/