Error al importar la biblioteca externa dentro de la biblioteca de códigos de plantillas de Django
-
19-09-2019 - |
Pregunta
Así que estoy tratando de escribir una aplicación Django reutilizable que proporciona un método para mostrar su feed de Twitter en su página. Sé muy bien que ya existe 20 veces. Es un ejercicio académico. :)
estructura de directorios es bastante simple:
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
Cuando se ejecuta la cáscara Django, las funciones definidas en el trabajo twitterfeed.py perfectamente. También creo que tengo las etiquetas de plantilla nominados correctamente y registrados.
Como se puede ver, yo uso el excelente rel="nofollow universal Alimentación Analizador . Mi problema no es en sí misma UFP, sino en la incapacidad de UFP a ser llamado al importar la biblioteca de etiquetas de plantilla. Cuando {% load twitterfeed %}
en base.py, me sale el siguiente error:
'twitterfeed' no es una etiqueta válida biblioteca: No se pudo cargar la plantilla biblioteca de django.templatetags.twitterfeed, n módulo denominado feedparser
importo feedparser mediante la siguiente instrucción:
import re, datetime, time, myapp.feedparser
Lo mejor que puedo decir, este mensaje de error es ligeramente engañoso. Creo que hay una ImportError pasando cuando se carga la biblioteca de plantillas, y esta es la interpretación de Django de la misma.
¿Hay alguna manera de importar feedparser.py dentro de mi aplicación reutilizable sin que los usuarios de la aplicación para colocar en algún lugar de su feedparser PYTHONPATH?
Gracias!
Solución
Esto se parece a una de esas cuestiones de ruta relativos molestos - resuelto en Python 2.6 y superior (donde se puede hacer la importación ..feedparser etc) pero a menudo un poco complicado en versiones anteriores. Una forma barata y alegre de solucionar este problema podría ser simplemente para mover feedparser.py en su directorio templatetags, como un hermano a twitterfeed.py
Otros consejos
puedo solucionar este tipo de problema (bibliotecas envío que son dependencias para mi proyecto en general) de la siguiente manera. En primer lugar, se crea un directorio "ext" en la raíz de mi proyecto (en su caso que se myproject/ext
). Entonces pongo dependencias tales como feedparser en ese directorio ext - myproject/ext/feedparser
Por último, yo cambio mi guión manage.py para insertar el directorio ext / en la parte delantera de sys.path. Esto significa tanto ./manage.py runserver
y ./manage.py shell
recogerá el camino correcto:
# manage.py
import os, sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'ext'))
# ... rest of manage.py
Me parece que esto funciona muy bien si no quiere perder el tiempo con cosas como virtualenvs. Al implementar su proyecto tiene que asegurarse de que la ruta es correcta, así -. Por lo general solucionar esto mediante la adición de la misma línea sys.path.insert
al inicio de mi archivo mod_wsgi app.wsgi