Как следует загружать файлы изображений с помощью Pyramid, SQLAlchemy и деформировать? Предпочтительно, чтобы можно было легко получить метки эскизов изображений в шаблонах. Какая конфигурация необходима (хранить изображения в файловой системе и т. Д.).Загрузка изображений с помощью Pyramid и SQLAlchemy
ответ
Этот вопрос ни в коем случае не спрашивает одно. Здесь, однако, есть представление, которое определяет загрузку формы с деформированием, проверяет вход для действительного файла изображения, сохраняет запись в базе данных и затем даже загружает ее на амазонку S3. Этот пример показан в ссылках на различные документы, на которые я ссылался. Чтобы загрузить файл с деформируются see the documentation.
Если вы хотите узнать, как сохранять файлы изображений на диск, обратитесь к этой статье see the official documentation
Затем, если вы хотите узнать, как сохранить новые элементы с SQLAlchemy see the SQLAlchemy tutorial.
Если вы хотите задать более правильный вопрос, где более конкретный подробный ответ может быть предоставлен для каждого раздела, пожалуйста, сделайте это.
@view_config(route_name='add_portfolio_item',
renderer='templates/user_settings/deform.jinja2',
permission='view')
def add_portfolio_item(request):
user = request.user
# define store for uploaded files
class Store(dict):
def preview_url(self, name):
return ""
store = Store()
# create a form schema
class PortfolioSchema(colander.MappingSchema):
description = colander.SchemaNode(colander.String(),
validator = Length(max=300),
widget = text_area,
title = "Description, tell us a few short words desribing your picture")
upload = colander.SchemaNode(
deform.FileData(),
widget=widget.FileUploadWidget(store))
schema = PortfolioSchema()
myform = Form(schema, buttons=('submit',), action=request.url)
# if form has been submitted
if 'submit' in request.POST:
controls = request.POST.items()
try:
appstruct = myform.validate(controls)
except ValidationFailure, e:
return {'form':e.render(), 'values': False}
# Data is valid as far as colander goes
f = appstruct['upload']
upload_filename = f['filename']
extension = os.path.splitext(upload_filename)[1]
image_file = f['fp']
# Now we test for a valid image upload
image_test = imghdr.what(image_file)
if image_test == None:
error_message = "I'm sorry, the image file seems to be invalid is invalid"
return {'form':myform.render(), 'values': False, 'error_message':error_message,
'user':user}
# generate date and random timestamp
pub_date = datetime.datetime.now()
random_n = str(time.time())
filename = random_n + '-' + user.user_name + extension
upload_dir = tmp_dir
output_file = open(os.path.join(upload_dir, filename), 'wb')
image_file.seek(0)
while 1:
data = image_file.read(2<<16)
if not data:
break
output_file.write(data)
output_file.close()
# we need to create a thumbnail for the users profile pic
basewidth = 530
max_height = 200
# open the image we just saved
root_location = open(os.path.join(upload_dir, filename), 'r')
image = pilImage.open(root_location)
if image.size[0] > basewidth:
# if image width greater than 670px
# we need to recduce its size
wpercent = (basewidth/float(image.size[0]))
hsize = int((float(image.size[1])*float(wpercent)))
portfolio_pic = image.resize((basewidth,hsize), pilImage.ANTIALIAS)
else:
# else the image can stay the same size as it is
# assign portfolio_pic var to the image
portfolio_pic = image
portfolio_pics_dir = os.path.join(upload_dir, 'work')
quality_val = 90
output_file = open(os.path.join(portfolio_pics_dir, filename), 'wb')
portfolio_pic.save(output_file, quality=quality_val)
profile_full_loc = portfolio_pics_dir + '/' + filename
# S3 stuff
new_key = user.user_name + '/portfolio_pics/' + filename
key = bucket.new_key(new_key)
key.set_contents_from_filename(profile_full_loc)
key.set_acl('public-read')
public_url = key.generate_url(0, query_auth=False, force_http=True)
output_dir = os.path.join(upload_dir)
output_file = output_dir + '/' + filename
os.remove(output_file)
os.remove(profile_full_loc)
new_image = Image(s3_key=new_key, public_url=public_url,
pub_date=pub_date, bucket=bucket_name, uid=user.id,
description=appstruct['description'])
DBSession.add(new_image)
# add the new entry to the association table.
user.portfolio.append(new_image)
return HTTPFound(location = route_url('list_portfolio', request))
return dict(user=user, form=myform.render())
Спасибо! Это волнующий ужасный ответ. Он связывает все точки человека без соответствующего опыта интеграции подсистем, о которых идет речь, не может знать. –
К счастью, я комментирую весь мой код, как это, так что это рабочий взгляд, взятый из старого проекта :-) – crooksey
Я подозреваю, что SQLAlchemy не имеет ничего (полу) для полей изображений, таких как ImageField Django? Он может хранить имя файла в поле, имя файла и т. Д. –
Depot агностик рамки для загрузки рамки с поддержкой SQLAlchemy и Amazon S3 depot.readthedocs.org/en/latest –