2013-07-01 11 views
7

La mia app di django deve leggere alcuni file di testo dal file system. Quindi creo una directory nella directory dell'app e utilizzo il percorso relativo per aprire e leggere dal file.Come posso utilizzare il percorso relativo per leggere i file locali nell'app Django?

areas = parseXmlFile('xml_files/area.xml') 

Quando eseguo il server per eseguire il debug utilizzando manage.py runserver, è ok. Ma eseguo il server utilizzando manage.py runfcgi host=127.0.0.1 port=8081, Django non trova il file: No such file or directory: 'xml_files/area.xml'

Non voglio utilizzare il percorso assoluto, ciò significa che ho bisogno di modificare molto codice.

Come posso risolvere il problema per utilizzare il percorso relativo per aprire il file locale?

risposta

15

Ti suggerisco di utilizzare absolute path ma in modo più intelligente. Dichiarare nella vostra settings.py qualcosa come XMLFILES_FOLDER e avere il vostro settings.py in questo modo:

import os 
settings_dir = os.path.dirname(__file__) 
PROJECT_ROOT = os.path.abspath(os.path.dirname(settings_dir)) 
XMLFILES_FOLDER = os.path.join(PROJECT_ROOT, 'xml_files/') 

Ciò presuppone che la cartella xml_files vive sotto la cartella radice del progetto, se non, basta dichiarare il percorso relativo dalla cartella principale del progetto al xml_files

XMLFILES_FOLDER = os.path.join(PROJECT_ROOT, 'f1/f2/xml_files/') 

in questo modo, ovunque nel codice che si desidera accedere a un file all'interno di questa directory basta fare:

from settings import XMLFILES_FOLDER 
path = XMLFILES_FOLDER+'area.xml' 

Questo approccio funzionerà in qualsiasi sistema operativo e, indipendentemente dalla modifica della cartella del progetto, funzionerà comunque.

Spero che questo aiuti!

+0

Questo mi aiuta molto. Grazie. – bitcold

+0

@bitcold sei il benvenuto. Puoi accettare la risposta se fosse utile? –

7

@Paulo La risposta di Bu è corretta, ma obsoleta. I file settings.py di oggi hanno una variabile BASE_DIR che puoi usare per questo sforzo.

import os 
from yourproject.settings import BASE_DIR 
file_path = os.path.join(BASE_DIR, 'relative_path') 

Tenere presente che il percorso relativo proviene dalla cartella radice del progetto Django.

+0

Fantastico! Buono a sapersi :) –

+0

È meglio usare 'dalle impostazioni di importazione di django.conf', è più indipendente dalla struttura. –

Problemi correlati