2015-12-13 31 views
10

I am non utilizzando Appengine.Configura Django e Google Cloud Storage?

Ho un'applicazione di Django semplice in esecuzione su una VM. Voglio utilizzare Google Cloud Storage per servire i miei file statici e anche per caricare/pubblicare i miei file multimediali.

Ho un secchio.

Come si collega l'applicazione Django al secchio? Ho provato django-storages. Potrebbe funzionare, ma cosa devo fare per preparare il mio secchio alla mia applicazione django? E quale configurazione di base ho bisogno nelle mie impostazioni di Django?

Impostazioni correnti:

# Google Cloud Storage 
# http://django-storages.readthedocs.org/en/latest/backends/apache_libcloud.html 
LIBCLOUD_PROVIDERS = { 
    'google': { 
     'type' : 'libcloud.storage.types.Provider.GOOGLE_STORAGE', 
     'user' : <I have no idea>, 
     'key' : <ditto above>, 
     'bucket': <my bucket name>, 
    } 
} 

DEFAULT_LIBCLOUD_PROVIDER = 'google' 
DEFAULT_FILE_STORAGE = 'storages.backends.apache_libcloud.LibCloudStorage' 
STATICFILES_STORAGE = 'storages.backends.apache_libcloud.LibCloudStorage' 

risposta

5

Quindi, questo in sostanza sarà lavoro. (Con questa libreria e impostazioni).

Il trucco per farlo funzionare, è sapere dove ottenere i parametri 'user' e 'key' per libcloud.

Su Google Cloud Console > Storage, fare clic su Settings. Quindi fare clic sulla scheda di destra denominata Interoperability. Su quel pannello, c'è un pulsante solitario, che dice qualcosa come Enable Interoperability. Cliccalo.

Voilà! Ora hai un nome utente e una chiave.


Nota: fare non uso django-storages da PyPI. Non è stato aggiornato e non funziona con le versioni recenti di Django.

utilizzare questa versione:

pip install -e 'git+https://github.com/jschneier/django-storages.git#egg=django-storages'


Edit: Se si desidera utilizzare un proxy inverso, allora si può prendere in considerazione la mia versione leggermente modificata. https://github.com/jschneier/django-storages/compare/master...halfnibble:master

Descrizione: In determinate circostanze, può essere necessario per caricare i file utilizzando un proxy inverso. Questo potrebbe essere usato per alleviare gli errori di richiesta incrociata.

Questo piccolo PR consente allo sviluppatore di impostare un LIBCLOUD_PROXY_URL opzionale in settings.py.

esempio di utilizzo

# Apache VirtualHost conf 
ProxyPass /foo http://storage.googleapis.com 
ProxyPassReverse /foo http://storage.googleapis.com 


# settings.py 
LIBCLOUD_PROXY_URL = '/foo/' 
+0

Ulteriori note. Se hai bisogno di spazio di archiviazione sicuro, ti consiglio vivamente AWS S3 con 'django_s3_storage'. Purtroppo, non sembrano esserci librerie di Google Cloud Storage che supportano il controllo degli accessi per la lettura dei file. –

+0

Quindi, se ho capito bene, 'django-storages' mi permetterà di usare' ImageField' con Google Cloud Storage come backend. Quando voglio rendere l'immagine nel browser (o in un'app), avrò accesso a un URL di immagine? –

+0

@EvanZamir Sei corretto. ImageField dovrebbe funzionare come FileField quando si tratta di salvare in memoria. –

11

Django-magazzini ha un backend per Google Cloud Storage, ma non è documentato, ho capito guardando nella repo.Ottenuto che funziona con questa configurazione:

DEFAULT_FILE_STORAGE = 'storages.backends.gs.GSBotoStorage' 
GS_ACCESS_KEY_ID = 'YourID' 
GS_SECRET_ACCESS_KEY = 'YourKEY' 
GS_BUCKET_NAME = 'YourBucket' 
STATICFILES_STORAGE = 'storages.backends.gs.GSBotoStorage' 

Per ottenere YourKey e TuoID si dovrebbe creare Interoperability chiavi, nella scheda Impostazioni.

speriamo vi sia utile e non si deve imparare il senso duro :)

Ah nel caso in cui non è stato ancora, le dipendenze sono:

+0

Questo funziona. :-) – slumtrimpet

+0

Ricevo GSResponseError: 401 Qualche idea non autorizzata? – User707

+0

Perché è necessario 'STATICFILES_STORAGE = 'storages.backends.gs.GSBotoStorage''? Fa sì che l'API sfogliabile non riesca a caricare i file css. – Kakaji

0

Dal momento che non posso commentare La risposta di Alan Wagner, ecco un'aggiunta.

Se si utilizza python3, è possibile ottenere questo errore,

... 
ImportError: No module named 'google_compute_engine' 

Se è così, è necessario installare Google-calcolo-motore. Il file /etc/boto.cfg indica a python di utilizzare la versione 2.7 della libreria. Dovrai eseguire questa riga successiva per rigenerare /etc/boto.cfg.

python3 -c "from google_compute_engine.boto.boto_config import BotoConfig; BotoConfig()" 

Un altro errore si può colpire,

... 
File "/app/venv/lib/python3.4/site-packages/boto/gs/connection.py", line 95, in create_bucket 
    data=get_utf8_value(data)) 
File "/app/venv/lib/python3.4/site-packages/boto/s3/connection.py", line 656, in make_request 
    auth_path = self.calling_format.build_auth_path(bucket, key) 
File "/app/venv/lib/python3.4/site-packages/boto/s3/connection.py", line 94, in build_auth_path 
    path = '/' + bucket 
TypeError: Can't convert 'bytes' object to str implicitly 

Ho fatto una pull request per risolvere questo problema. È possibile utilizzare my repo come dipendenza da pip, se lo si desidera fino a quando non viene unito.

Cercherò di mantenere aggiornato questo repository. Ho impostato il ramo predefinito develop come protetto. Sono l'unico che può commettere/approvare richieste di fusione. Ho anche fatto solo un commit.

Dovrai installare google-compute-engine ed eseguire quella riga sopra prima di poter instalkl/compilare il mio repo di boto.

Problemi correlati