Django + Boto + Python 3

5
我如何使用Python 3在Amazon Linux的EC2上将Django上传的文件存储在S3上? 如果我不能这样做,如果我使用ELB,我该如何在两个EC2实例之间共享上传的文件? 我尝试使用django-storages-py3 + boto#py3kport,但它无法正常工作,当我尝试上传文件时,会出现异常:string expected bytes given 更新: 以下是我如何使用django-storages-py3 + boto#py3kport:
from django.core.files.storage import default_storage

fd = default_storage.open('%s/%s' % ('uploadstg', str(filename)), 'wb')
for chunk in file.chunks():
    fd.write(chunk)
fd.close()

fd - S3BotoStorageFile:uploadstg / a6d2532d-34c9-4793-9d43-e9a3e475fc6f.png

文件 - InMemoryUploadedFile:1.png(image / png)

回溯

Environment:


Request Method: POST
Request URL: http://---/items/Tpp/create/

Django Version: 1.6.1
Python Version: 3.3.3
Installed Applications:
('django.contrib.admin',
 'haystack',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sites',
 'modeltranslation',
 'south',
 'core',
 'storages',
 'appl')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'tpp.SiteUrlMiddleWare.SiteUrlMiddleWare')


Traceback:
File "/usr/local/bin/test/lib/python3.3/site-packages/django/core/handlers/base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/var/www/html/tpp/tppcenter/views.py" in get_item_form
  95.             com = form.save(request.user)
File "/var/www/html/tpp/tppcenter/forms.py" in save
  212.                 self._save_file(self.fields[title].initial, title, path_to_images)
File "/var/www/html/tpp/tppcenter/forms.py" in _save_file
  239.             fd.write(chunk)
File "/usr/local/bin/test/lib/python3.3/site-packages/django_storages-1.1.8-py3.3.egg/storages/backends/s3boto.py" in write
  161.         return super(S3BotoStorageFile, self).write(*args, **kwargs)

Exception Type: TypeError at /items/Tpp/create/
Exception Value: string argument expected, got 'bytes'

通过Django管理界面上传:

Environment:


Request Method: POST
Request URL: http://----/admin/core/user/1/

Django Version: 1.6.1
Python Version: 3.3.3
Installed Applications:
('django.contrib.admin',
 'haystack',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sites',
 'modeltranslation',
 'south',
 'core',
 'storages',
 'appl')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'tpp.SiteUrlMiddleWare.SiteUrlMiddleWare')


Traceback:
File "/usr/local/bin/test/lib/python3.3/site-packages/django/core/handlers/base.py" in get_response
  114.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/contrib/admin/options.py" in wrapper
  432.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/utils/decorators.py" in _wrapped_view
  99.                     response = view_func(request, *args, **kwargs)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  52.         response = view_func(request, *args, **kwargs)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/contrib/admin/sites.py" in inner
  198.             return view(request, *args, **kwargs)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/utils/decorators.py" in _wrapper
  29.             return bound_func(*args, **kwargs)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/utils/decorators.py" in _wrapped_view
  99.                     response = view_func(request, *args, **kwargs)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/utils/decorators.py" in bound_func
  25.                 return func(self, *args2, **kwargs2)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/db/transaction.py" in inner
  339.                 return func(*args, **kwargs)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/contrib/admin/options.py" in change_view
  1230.                 self.save_model(request, new_object, form, True)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/contrib/admin/options.py" in save_model
  860.         obj.save()
File "/usr/local/bin/test/lib/python3.3/site-packages/django/db/models/base.py" in save
  545.                        force_update=force_update, update_fields=update_fields)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/db/models/base.py" in save_base
  573.             updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/db/models/base.py" in _save_table
  632.                       for f in non_pks]
File "/usr/local/bin/test/lib/python3.3/site-packages/django/db/models/base.py" in <listcomp>
  632.                       for f in non_pks]
File "/usr/local/bin/test/lib/python3.3/site-packages/django/db/models/fields/files.py" in pre_save
  252.             file.save(file.name, file, save=False)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/db/models/fields/files.py" in save
  86.         self.name = self.storage.save(name, content)
File "/usr/local/bin/test/lib/python3.3/site-packages/django/core/files/storage.py" in save
  49.         name = self._save(name, content)
File "/usr/local/bin/test/lib/python3.3/site-packages/django_storages-1.1.8-py3.3.egg/storages/backends/s3boto.py" in _save
  392.         self._save_content(key, content, headers=headers)
File "/usr/local/bin/test/lib/python3.3/site-packages/django_storages-1.1.8-py3.3.egg/storages/backends/s3boto.py" in _save_content
  403.                                    rewind=True, **kwargs)
File "/usr/local/bin/test/src/boto/build/lib/boto/s3/key.py" in set_contents_from_file
  1241.                            chunked_transfer=chunked_transfer, size=size)
File "/usr/local/bin/test/src/boto/build/lib/boto/s3/key.py" in send_file
  726.                                  chunked_transfer=chunked_transfer, size=size)
File "/usr/local/bin/test/src/boto/build/lib/boto/s3/key.py" in _send_file_internal
  893.         if self.base64md5:
File "/usr/local/bin/test/src/boto/build/lib/boto/s3/key.py" in _get_base64md5
  177.             return binascii.b2a_base64(self.local_hashes['md5']).rstrip('\n')

Exception Type: TypeError at /admin/core/user/1/
Exception Value: Type str doesn't support the buffer API

请提供有关django-storages-py3生成的错误的更多详细信息。发布堆栈跟踪。 - Stephan
发布了,你能帮我吗? - user3164429
2个回答

2

这个真的很棒!我也推荐它。 - user2075886

0
如果有人出现了这个错误 "Exception Value: Type str doesn't support the buffer API",并且使用了 django-storages-py3 + boto#py3kport,请参考以下内容:

https://github.com/boto/boto/pull/1793


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接