#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
в контексте шаблона. Что пытается показать ваш шаблон? Список загрузок?