2013-10-23 17 views
5

Używam Django 1.5 na Google App Engine i próbuję przesłać pliki do Google Cloud Storage. Używam biblioteki gcs i napisałem niestandardowy program do przesyłania plików, który zarejestrowałem w pliku settings.py jako mój jedyny program do przesyłania plików. Widzę, że mój plik jest poprawnie przesyłany do przeglądarki blobstore w moim środowisku programistycznym, ale po wywołaniu metody form.save() w views.py dostaję wyjątek zgłaszany, że jest to system plików tylko do odczytu? Wiem, że Google App Engine nie pozwala na dostęp do systemu plików, dlatego właśnie używam GCS!Przesyłanie do Google Cloud Storage z Django na App Engine

Czy jest coś, co muszę zrobić, aby powstrzymać Django przed próbą zapisania pliku na dysku?

Ten kod jest dołączony do tego gist.

Dzięki :)

ślad stosu:

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

Czy możesz również opublikować ślad stosu, który otrzymujesz? – jterrace

+0

@jterrace Właśnie dodałem to. –

+0

Powiązane, ale także nieodebrane: http://stackoverflow.com/questions/17338683/file-upload-in-django-modelform –

Odpowiedz

2

ostatecznie rozwiązać ten przesuwając FileField z mojego modelu w moim ModelForm tak:

# 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',) 

Jestem pewien, że próbowałem tego wcześniej, ale wydaje się, że naprawiłem mój problem, mam nadzieję, że może to pomóc komuś, kto popadnie w ten sam problem.

Powiązane problemy