Как заменить существующий объект ImageField в Django, если он совпадает с новым изображением? - PullRequest
0 голосов
/ 03 апреля 2012

Каждый раз, когда мой пользователь входит в систему, мы извлекаем его фотографию из Facebook.Это означает, что когда он входит в систему, мне нужно проверить, совпадает ли существующее изображение с новым.Затем, если это не так, мне нужно перезаписать существующее изображение.Я, наверное, могу взломать это вместе, но какой оптимальный способ сделать это?

Вот моя модель:

class UserProfile(models.Model):
    avatar = models.ImageField(upload_to='img/users')

@receiver(pre_update, sender=FacebookBackend)
def update_user_profile(sender, user, response, details, **kwargs):
    profile, created = UserProfile.objects.get_or_create(user=user)

    if "id" in response:
        from urllib2 import urlopen, HTTPError
        from django.template.defaultfilters import slugify
        from django.core.files.base import ContentFile

        try:
            url = "http://graph.facebook.com/%s/picture" \
                % response["id"]
            avatar = urlopen(url+'?type=large', timeout=15)
            profile.avatar.save(slugify(user.id + 'a') + u'.jpg',
                ContentFile(avatar.read()))

1 Ответ

0 голосов
/ 03 апреля 2012

Вы можете получить изображение из Facebook и текущее сохраненное изображение, хэшировать данные обоих файлов и сравнивать хэши.Это обычный способ проверить, одинаковы ли изображения.Если хеши отличаются, то вы можете заменить текущее сохраненное изображение изображением из Facebook.

Вы можете использовать import hashlib; hashlib.sha1(data) (или hashlib.md5(data), это не вопрос безопасности, а исключительно для целей хеширования),где data содержит содержимое файла изображения.

Вы также можете проверить имена файлов, но это ненадежно.Может быть маловероятно, что пользователь загрузит другое изображение профиля с тем же именем файла, это все еще возможно.Если вы переименовываете файлы изображений в вашей системе, такой подход также невозможен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...