2013-10-23 30 views
5

Tôi đang sử dụng Django 1.5 trên Google App Engine và tôi đang cố gắng tải tệp lên Google Cloud Storage. Tôi đang sử dụng gcs thư viện và đã viết một trình xử lý tệp tải lên tùy chỉnh mà tôi đã đăng ký trong settings.py làm trình tải lên tệp duy nhất của tôi. Tôi có thể thấy tệp của mình được tải lên chính xác trong trình xem blobstore trong môi trường phát triển của tôi nhưng một khi form.save() được gọi trong views.py, tôi nhận được một ngoại lệ được ném ra rằng đó là hệ thống tệp chỉ đọc? Tôi biết Google App Engine không cho phép truy cập vào hệ thống tệp, đó là lý do tại sao tôi sử dụng GCS ngay từ đầu!Tải lên Google Cloud Storage từ Django trên App Engine

Có điều gì tôi cần làm để ngăn Django không lưu tệp vào đĩa không?

Mã có liên quan được đính kèm trong số gist này.

Cảm ơn :)

Stack Trace:

Environment: 


Request Method: POST 
Request URL: http://localhost:8080/cms/media/add 

Django Version: 1.5 
Python Version: 2.7.5 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.staticfiles', 
'django.contrib.messages', 
'api', 
'cms', 
'frontend') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


Traceback: 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/core/handlers/base.py" in get_response 
    115.       response = callback(request, *callback_args, **callback_kwargs) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/contrib/auth/decorators.py" in _wrapped_view 
    25.     return view_func(request, *args, **kwargs) 
File "/Users/james/Dropbox/University/Year 4/Advanced Development/assignment/cms/views.py" in media_add_or_edit 
    44.    form.save() 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/forms/models.py" in save 
    370.        fail_message, commit, construct=False) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/forms/models.py" in save_instance 
    87.   instance.save() 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/db/models/base.py" in save 
    546.      force_update=force_update, update_fields=update_fields) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/db/models/base.py" in save_base 
    650.     result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/db/models/manager.py" in _insert 
    215.   return insert_query(self.model, objs, fields, **kwargs) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/db/models/query.py" in insert_query 
    1673.  return query.get_compiler(using=using).execute_sql(return_id) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/db/models/sql/compiler.py" in execute_sql 
    936.   for sql, params in self.as_sql(): 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/db/models/sql/compiler.py" in as_sql 
    894.     for obj in self.query.objs 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/db/models/fields/files.py" in pre_save 
    250.    file.save(file.name, file, save=False) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/db/models/fields/files.py" in save 
    86.   self.name = self.storage.save(name, content) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/core/files/storage.py" in save 
    48.   name = self._save(name, content) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/django-1.5/django/core/files/storage.py" in _save 
    198.      fd = os.open(full_path, flags, 0o666) 
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/devappserver2/python/stubs.py" in fake_open 
    71.  raise OSError(errno.EROFS, 'Read-only file system', filename) 

Exception Type: OSError at /cms/media/add 
Exception Value: [Errno 30] Read-only file system: u'/Users/james/Dropbox/University/Year 4/Advanced Development/assignment/IMG_0746.jpg' 
+0

bạn cũng có thể đăng theo dõi ngăn xếp bạn đang nhận được không? – jterrace

+0

@jterrace Tôi vừa thêm nó. –

+0

Có liên quan nhưng cũng không được trả lời: http://stackoverflow.com/questions/17338683/file-upload-in-django-modelform –

Trả lời

2

tôi cuối cùng đã giải quyết điều này bằng cách di chuyển FileField từ mẫu của tôi vào ModelForm tôi như vậy:

# Used for uploading media that forms part of a story 
class Media(models.Model): 
    title = models.CharField(max_length=100) 
    type = models.CharField(max_length=5, choices=MEDIA_TYPES) 
    content = models.TextField() 
    date_created = models.DateTimeField(auto_now_add=True) 

# Used to convert the media model to a form in the cms 
class MediaForm(forms.ModelForm): 
    file = forms.FileField() 

    class Meta: 
     model = Media 
     # Don't show the date created field because we want that to be set automatically 
     exclude = ('date_created', 'content',) 

Tôi chắc rằng tôi đã thử rằng trước đây nhưng nó dường như đã cố định vấn đề của tôi, hy vọng điều này có thể giúp một người khác chạy vào cùng một vấn đề.

Các vấn đề liên quan