2012-10-25 17 views
7

Utknąłem na tym! Piszę widok Django, który odczytuje dane z zewnętrznej bazy danych. Aby to zrobić, używam standardowej biblioteki MySQLdb. Teraz, aby załadować dane, muszę wykonać bardzo długie i złożone zapytanie. Mogę zakodować to zapytanie w moim widoku i to działa dobrze. Ale myślę, że to nie jest praktyczne; Chcę móc zmienić zapytanie w przyszłości, więc próbuję wczytać instrukcję z pliku tekstowego. Moim problemem jest to, że nie wiem, gdzie przechowywać i jak otworzyć ten plik. Gdziekolwiek się znajduję, pojawia się błąd "Brak takiego pliku lub katalogu". Nawet zapisanie go w tym samym katalogu, co kod widoku, kończy się niepowodzeniem.Przeczytaj lokalny plik w django

Należy zauważyć, że nie jest to przesłany plik; to tylko zewnętrzny plik, który uzupełnia mój kod. Jakieś pomysły? Z góry dziękuję!

+0

dobrze, faktycznie ja próbowałem umieścić go w tym samym direcotry, jak kod widoku i normalna funkcja open(). Ponieważ to się nie udało, próbowałem znaleźć jakieś informacje, ale wszystkie próby, których próbowałem, zawiodły (IE: umieszczenie ich w "statycznym" podkatalogu mojej aplikacji). Absolutna ścieżka zadziałałaby, ale wciąż chciałem większej elastyczności. – fenomenoxp

Odpowiedz

18

Zachowaj plik w katalogu głównym projektu django i dodaj poniższe w pliku settings.py.

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

Następnie w widoku zrób to.

import os 
from django.conf.settings import PROJECT_ROOT 

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

To wystarczy! Wielkie dzięki – fenomenoxp

3

Do tego użytku umieściłbym go w module ustawień. W settings.py dodaj np. MY_LONG_QUERY = 'from FOO select BAR...'. Następnie, w widoku wystarczy załadować go z ustawień takich jak:

from django.conf import settings 
settings.MY_LONG_QUERY 

Ale to tak naprawdę nie odpowie na twoje pytanie. Zakładając, że uprawnienia i wszystkie są prawidłowe, zachować odniesienie do katalogu głównym projektu w ustawieniach tak:

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

a następnie ponownie w widoku, należy otworzyć plik tak:

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

Po poprzedniej odpowiedzi, właśnie to zrobiłem hehe. Ale podoba mi się również pomysł zapisania zapytania w settings.py! – fenomenoxp

Powiązane problemy