2009-07-26 8 views
3

Also versuche ich eine wiederverwendbare Django-App zu schreiben, die eine Methode zur Anzeige Ihres Twitter-Feeds auf Ihrer Seite bietet. Ich weiß gut, dass es bereits 20 mal existiert. Es ist eine akademische Übung. :)Fehler beim Importieren einer externen Bibliothek in die Django Template-Tag-Bibliothek

Directory-Struktur ist ziemlich einfach:

myproject 
|__ __init__.py 
|__ manage.py 
|__ settings.py 
|__ myapp 
    |__ __init__.py 
    |__ admin.py 
    |__ conf 
      |__ __init__.py 
      |__ appsettings.py 
    |__ feedparser.py 
    |__ models.py 
    |__ templates 
      |__ __init__.py 
    |__ templatetags 
      |__ __init__.py 
      |__ twitterfeed.py 
    |__ views.py 
|__ templates 
      |__ base.html 
|__ urls.py 

Wenn die Django-Shell ausgeführt wird, definiert die Funktionen in twitterfeed.py perfekt funktionieren. Ich glaube auch, dass ich die Template-Tags richtig benannt und registriert habe.

Wie Sie sehen können, verwende ich die ausgezeichnete Universal Feed Parser. Mein Problem liegt nicht in UFP selbst, aber in UFPs Unfähigkeit, beim Importieren der Vorlagen-Tag-Bibliothek aufgerufen zu werden. Als ich {% load twitterfeed %} in base.py, ich die folgende Fehlermeldung erhalten:

'twitterfeed' is not a valid tag library: Could not load template library from django.templatetags.twitterfeed, No module named feedparser

ich importieren feedparser die folgende Anweisung:

import re, datetime, time, myapp.feedparser 

Das Beste, was ich sagen kann, wird diese Fehlermeldung leicht täuschen. Ich denke, es gibt einen ImportError, wenn die Template-Bibliothek geladen wird, und das ist Djangos Interpretation davon.

Gibt es eine Möglichkeit, feedparser.py innerhalb meiner wiederverwendbaren App zu importieren, ohne dass die Benutzer der Anwendung feedparser irgendwo in ihrem PythonPath platzieren müssen?

Danke!

Antwort

2

Das sieht wie einer dieser lästigen relativen Pfadprobleme aus - gelöst in Python 2.6 und höher (wo man ..feedparser usw. importieren kann), aber oft ein bisschen schwierig in älteren Versionen. Eine billige und fröhliche Möglichkeit, dies zu beheben, könnte einfach feedparser.py in Ihr TemplateTags-Verzeichnis zu verschieben, als ein Geschwister zu twitterfeed.py

5

Ich löse diese Art von Problem (Versand Bibliotheken, die Abhängigkeiten für mein Gesamtprojekt sind) auf folgende Weise. Zuerst erstelle ich ein "ext" -Verzeichnis im Stamm meines Projekts (in Ihrem Fall wäre das myproject/ext). Dann setze ich Abhängigkeiten wie feedparser in diesem ext-Verzeichnis - myproject/ext/feedparser

Schließlich ändere ich mein manage.py-Skript, um das ext/-Verzeichnis an der Vorderseite von sys.path einzufügen. Dies bedeutet sowohl ./manage.py runserver und ./manage.py shell den richtigen Pfad holen:

# manage.py 
import os, sys 
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'ext')) 
# ... rest of manage.py 

Ich finde das wirklich gut funktioniert, wenn Sie zu verwirren wollen nicht um mit Dingen wie virtualenvs. Wenn Sie Ihr Projekt bereitstellen, müssen Sie sicherstellen, dass der Pfad auch korrekt ist. Normalerweise löse ich dies, indem ich die Zeile sys.path.insert zum Anfang meiner Datei mod_wsgi app.wsgi hinzufüge.

+0

Danke Simon! Also ... es ist sicher zu sagen, dass es nicht möglich ist, auf eine Weise zu erreichen, dass die App-Portabilität erhalten bleibt? –

+0

Ich würde nicht sagen, dass ... Sie können Abhängigkeiten innerhalb einer App definitiv einschließen (eher als ein ext/Verzeichnis), aber es kann ein bisschen fiddly sein, wie Sie von Ihrer Frage erfahren haben. Ich bin faul, also neige ich dazu, die ext/Methode zu benutzen, weil ich weiß, dass es funktioniert. –

+0

Wenn Sie Apps direkt in die App einbinden, treten geringfügige Fehler auf: Sowohl das App-Verzeichnis als auch dessen Eltern befinden sich im Pfad. Daher ist es möglich, sie zweimal zu importieren, sowohl "mypackage.app" als auch "app". Es ist sicherer, es in ein Unterverzeichnis im Pfad zu stecken, daher gibt es nur einen möglichen Namen dafür ("app"). –