2012-10-25 9 views
7

Sono abbastanza bloccato su questo! Sto scrivendo una vista Django che legge i dati da un database esterno. Per fare questo, sto usando la libreria standard MySQLdb. Ora, per caricare i dati, devo eseguire una query molto lunga e complessa. Riesco a codificare a fondo quella query nella mia vista e funziona perfettamente. Ma penso che non sia pratico; Voglio poter cambiare la query in futuro, quindi cerco di caricare la dichiarazione da un file di testo. Il mio problema è che non so dove archiviare e come aprire quel file. Ovunque io faccia, ottengo un errore "No such file or directory". Anche salvandolo nella stessa directory rispetto al codice della vista fallisce.Leggere un file locale in django

Si noti che questo non è un file caricato; è solo un file esterno che completa il mio codice. Qualche idea? Grazie in anticipo!

+0

Beh, in realtà io aveva provato a metterlo nella stessa direcotry del codice della vista e della normale funzione open(). Poiché non era riuscito, ho cercato di trovare alcune informazioni, ma tutto ciò che ho provato è fallito (IE: inserendolo in una sottodirectory "statica" della mia app). Un percorso assoluto funzionerebbe, ma volevo ancora più flessibilità – fenomenoxp

risposta

18

Conservare il file nella root del progetto django e aggiungere quanto segue nel file settings.py.

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) 

Quindi nella vista, fare questo.

import os 
from django.conf.settings import PROJECT_ROOT 

file_ = open(os.path.join(PROJECT_ROOT, 'filename')) 
+0

Questo ha fatto il trucco! Grazie mille – fenomenoxp

3

Per questo uso, lo inserisco nel modulo delle impostazioni. In settings.py, aggiungere ad es. MY_LONG_QUERY = 'from FOO select BAR...'. Quindi, secondo lei basta caricarlo dalle impostazioni in questo modo:

from django.conf import settings 
settings.MY_LONG_QUERY 

Ma, questo in realtà non rispondere alla tua domanda. Supponendo che le autorizzazioni e tutti sono corretti, mantenere un riferimento al root del progetto nelle impostazioni in questo modo:

ROOT_PATH = os.path.split(os.path.abspath(__file__))[0] 

E poi di nuovo a suo parere, aprire il file in questo modo:

from django.conf import settings 

def read_from_database(request): 
    f = open(os.path.join(settings.ROOT_PATH, 'myfile.db')) 
    # Do something with f 
+0

Dopo la risposta precedente, è proprio quello che ho fatto io. Ma mi piace anche l'idea di salvare la query in settings.py! – fenomenoxp