2013-10-23 32 views
5

Sto utilizzando Django 1.5 su Google App Engine e sto cercando di caricare file su Google Cloud Storage. Sto utilizzando la libreria gcs e ho scritto un gestore di caricamento file personalizzato che ho registrato in settings.py come mio unico file uploader. Posso vedere il mio file essere caricato correttamente nel visualizzatore blobstore nel mio ambiente di sviluppo ma una volta che form.save() viene chiamato in views.py ottengo un'eccezione generata dicendo che si tratta di un file system di sola lettura? So che Google App Engine non consente l'accesso al file system, motivo per cui sto utilizzando GCS in primo luogo!Caricamento su Google Cloud Storage da Django su App Engine

C'è qualcosa che devo fare per impedire a Django di cercare di salvare il file sul disco?

Il codice pertinente è allegato in questo gist.

Grazie :)

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

potresti pubblicare anche la traccia dello stack che stai ottenendo? – jterrace

+0

@jterrace L'ho appena aggiunto. –

+0

Correlati ma anche senza risposta: http://stackoverflow.com/questions/17338683/file-upload-in-django-modelform –

risposta

2

Alla fine ho risolto questo spostando il FileField dal mio modello nel mio ModelForm in questo modo:

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

sono sicuro che l'ho già provato, ma sembra che abbia risolto il problema, spero che questo possa aiutare qualcun altro che si imbatte nello stesso problema.

Problemi correlati