загруженный django файл изображения не сохраняется во временном файле

#python #django #image

#python #django #изображение

Вопрос:

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

  class Photo(models.Model):
    name = models.CharField(max_length = 100)
    photo = models.ImageField(upload_to = 'downloaded', blank=False,null=True)
    description = models.CharField(max_length = 80 , blank = False , null = True)
    user = models.ForeignKey(User)


    def __unicode__(self):
        return '%s %s %s'  %(self.description,self.name)

    def _get_image_url(self):
        return self.photo
  

и views.py

 def download(request,image_id):
    filename = get_object_or_404(Photo,pk = image_id)
    filepath = filename.photo.url
    contributor = filename.user
    wrapper = FileWrapper(open(filepath,'rb',))
    content_type = mimetypes.guess_type(filepath)[0]
    response = HttpResponse(wrapper, mimetype='content_type')
    response['Content-Disposition'] = "attachment; filename=%s" % filepath
    if response and not filename.user==request.user:
                    purchased_image=PhotoDownload(name=filename.name,dowloaded_photo=filepath,user = request.user)
                    purchased_image.save()


    return response
  

согласно данной модели и представлению, всякий раз, когда я загружаю какое-либо изображение, оно должно создавать папку для загрузки в каталоге media, не так ли? но после загрузки любого изображения программа для загрузки не создает в каталоге мультимедиа, но изображение сохраняется в базе данных с URL-адресом, который является чем-то вроде этого…

 http://med.finder-lbs.com/admin/photo/photodownload/2/media/media/photos/2_4.jpg
  

если вы внимательно посмотрите на URL-адрес, вы обнаружите, что изображение хранит / media / мультимедиа / фотографии там, где оно должно храниться в media / photos , почему это происходит? я что-то упускаю или есть другой способ сохранить загруженный файл во временной папке? Другие мои фотографии, такие как загруженные фотографии, хранятся во временном файле, но загруженные фотографии вызывают проблему.Для большего удобства, вот setting.py

 import os
SETTINGS_DIR = os.path.dirname(__file__)
PROJECT_PATH = os.path.join(SETTINGS_DIR,os.pardir)
PROJECT_PATH = os.path.abspath(PROJECT_PATH)
# Django settings for shutterstock project.



from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS  = (
    'django.core.context_processors.request',
)





DEBUG = True
TEMPLATE_DEBUG = DEBUG

#for Template path

TEMPLATE_PATH = os.path.join(PROJECT_PATH,'templates')

# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/var/www/example.com/media/"
MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media')
MEDIA_URL = '/media/' #GORKY >> This was media/

# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/var/www/example.com/static/"
STATIC_ROOT = ''

STATIC_PATH = os.path.join(PROJECT_PATH,'static')
#STATIC_PATH = os.path.abspath(os.path.join(PROJECT_PATH, 'static'))

# URL prefix for static files.
# Example: "http://example.com/static/", "http://static.example.com/"
STATIC_URL = '/static/'

# Additional locations of static files
STATICFILES_DIRS = (
# Put strings here, like "/home/html/static" or "C:/www/django/static".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
 STATIC_PATH,
)

ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

DATABASES = {
    'default': {
         'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql',  'sqlite3' or 'oracle'.
         'NAME': 'stock',                      # Or path to database file if using sqlite3.
         # The following settings are not used with sqlite3:
         'USER': '',
         'PASSWORD': '',
         'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
         'PORT': '',                      # Set to empty string for default.
     }
 }


 ALLOWED_HOSTS = []


 TIME_ZONE = 'America/Chicago'


 LANGUAGE_CODE = 'en-us'

 SITE_ID = 1



 USE_I18N = True


 USE_L10N = True


 USE_TZ = True

 # Absolute filesystem path to the directory that will hold user-uploaded files.
 # Example: "/var/www/example.com/media/"


 # URL that handles the media served from MEDIA_ROOT. Make sure to use a
 # trailing slash.
 # Examples: "http://example.com/media/", "http://media.example.com/"


 # Absolute path to the directory static files should be collected to.
 # Don't put anything in this directory yourself; store your static files
 # in apps' "static/" subdirectories and in STATICFILES_DIRS.
 # Example: "/var/www/example.com/static/"


 # URL prefix for static files.


 # Additional locations of static files


 # List of finder classes that know how to find static files in
 # various locations.
 STATICFILES_FINDERS = (
     'django.contrib.staticfiles.finders.FileSystemFinder',
     'django.contrib.staticfiles.finders.AppDirectoriesFinder',
     'django.contrib.staticfiles.finders.DefaultStorageFinder',
 )

 # Make this unique, and don't share it with anybody.
 SECRET_KEY = '3zf@!cs!z(dsf3amp;6p93jrc6qz)-22n@uyps!5p*wkr3pxemy9e'

 # List of callables that know how to import templates from various sources.
 TEMPLATE_LOADERS = (
     'django.template.loaders.filesystem.Loader',
     'django.template.loaders.app_directories.Loader',
     'django.template.loaders.eggs.Loader',
 )
 TEMPLATE_DIRS = (TEMPLATE_PATH,)

 MIDDLEWARE_CLASSES = (
     'django.middleware.common.CommonMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     # Uncomment the next line for simple clickjacking protection:
     # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 )

 ROOT_URLCONF = 'shutterstock.urls'

 # Python dotted path to the WSGI application used by Django's runserver.
 WSGI_APPLICATION = 'shutterstock.wsgi.application'



INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # Uncomment the next line to enable the admin:
    'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',

    'photo',
    'userena',
    'guardian',
    'easy_thumbnails',
    'accounts',
    'cloudinary',
    'paypal.standard.ipn',
    'myprofile',
    'watermarker',
    'mail',
    'stored_messages',
    'rest_framework',
    'endless_pagination',
    'home',
    'easy_thumbnails',



  )

 MESSAGE_STORAGE = 'stored_messages.storage.PersistentStorage'

 WATERMARKING_QUALITY = 85
 WATERMARK_OBSCURE_ORIGINAL = False
 WATERMARK_OBSCURE_ORIGINAL = False

 AUTHENTICATION_BACKENDS = (  
    'userena.backends.UserenaAuthenticationBackend',  
    'guardian.backends.ObjectPermissionBackend',  
    'django.contrib.auth.backends.ModelBackend',  
)  

ANONYMOUS_USER_ID = -1

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'

AUTH_PROFILE_MODULE = 'accounts.MyProfile'  

LOGIN_REDIRECT_URL = '/accounts/%(username)s/'  
LOGIN_URL = '/accounts/signin/'  
LOGOUT_URL = '/accounts/signout/'  


LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
        'level': 'ERROR',
        'filters': ['require_debug_false'],
        'class': 'django.utils.log.AdminEmailHandler'
      }
   },
   'loggers': {
        'django.request': {
        'handlers': ['mail_admins'],
        'level': 'ERROR',
        'propagate': True,
        },
   }
}

THUMBNAIL_ALIASES = {
    '': {
       'mini': {'size': (50, 50), 'crop': True},
       'small': {'size': (100, 100), 'crop': True},
       'regular': {'size': (200, 200), 'crop': True},
       'large': {'size': (500, 500), 'crop': True},
       'xl': {'size': (800, 800), 'crop': True},
       'a4': {'size': (800, 600), 'crop': True},
       },
   }
  

Итак, у вас есть какие-либо идеи?

Комментарии:

1. Какой смысл сохранять загруженные изображения во временную папку? Вы отправляете изображение пользователю в ответе. У вас уже есть изображения, сохраненные на сервере, и вы просто теряете место на диске. Требуется ли здесь возможность отслеживать, когда пользователь загружает изображение?

2. Я просто забыл упомянуть основную цель, основная цель — создать историю загруженных изображений и показать пользователю.

Ответ №1:

upload_to Атрибут Image сообщает django, где хранить файлы, когда они загружаются, а не скачиваются. Нет смысла сохранять файлы при их загрузке… вы же не хотите, чтобы ваш диск заполнялся копиями одного и того же файла при каждой загрузке, не так ли?

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

Ответ №2:

Отслеживание загрузок

Чтобы отслеживать загрузки изображений, вам нужно что-то вроде этого:

models.py:

 from django.contrib.auth.models import User

class Photo(models.Model):
    photo = models.ImageField(upload_to = 'downloaded', blank=False,null=True)
    ...

class Download(models.Model):
    photo = models.ForeignKey(Photo)
    user = models.ForeignKey(User, related_name='downloads')
    downloaded = models.DateTimeField(auto_now_add=True)
    # any other fields you want to store
  

views.py:

 def download(request, photo_id):
    photo = get_object_or_404(Photo, pk=photo_id)
    download = Download(photo=photo, user=request.user)
    download.save()
    # serve file
  

Это создает запись в базе данных для каждой загрузки файла, показывающую загруженный файл, пользователя, который его загрузил, и дату / время загрузки. Если у вас нет зарегистрированных пользователей, вы могли бы сохранить другие данные, например, IP-адрес клиента.

Отобразить список загрузок

Чтобы отобразить список загрузок для текущего пользователя, вы могли бы использовать представление и шаблон, подобные этому:

views.py:

 def my_downloads(request):
    downloads = request.user.downloads.all()
    return render(request, "my_downloads.html", {'downloads': downloads})
  

my_downloads.html:

 ...
<p>You've downloaded the following images:</p>
<ul>
    {% for download in downloads %}
        <li>{{ download.photo.photo.name }}</li>
    {% endfor %}
</ul>
...
  

Дополнительная помощь

Что касается того, как вы в данный момент выполняете # serve file бит. Вероятно, вы не знаете, как обслуживать файл непосредственно в представлении. Вы могли бы просто перенаправить запрос на URL файла:

 from django.shortcuts import redirect

def download(request, photo_id):
    ...
    return redirect(photo.photo.url)
  

Это означает, что Django не нужно выполнять работу по фактической отправке файла.

Комментарии:

1. я уже пробовал это, но проблема в том, как я могу показать эти изображения внешнего ключа в шаблоне?

2. Вы указываете photo.photo.url в контексте шаблона. Что пытается показать ваш шаблон? Список загрузок?