2016-07-27 31 views
0

zu verpacken (UPDATE: Ich habe eine bessere Frage mit einer besseren Antwort gemacht here Ich wollte diese Frage löschen, aber einige der Antworten könnten auf künftige Forscher nützlich erweisen..)brauchen jinja2 Vorlage für Python

Meine Frage ist fast identisch mit this, aber diese Antwort ist hässlich (erfordert eine Verzeichnisstruktur einschließlich sharedtemplates/templates/templates/), unvollständig wie gepostet (Benutzer "beantwortet" seine eigene Frage), und übernimmt einige Kenntnisse, die ich nicht habe.

Ich arbeite an meiner ersten Python-Backed-Web-Anwendung. Die JavaScript-Komponente wird gerade mit einer statischen HTML-Seite entwickelt. Jetzt möchte ich eine serverseitige Python-Komponente, die AJAX-Aufrufe verarbeitet und eine HTML-Vorlage mit jinja2 rendert.

Ich hatte Erfolg mit Python zuvor, Erstellen von GUI-Anwendungen mit tkinter/Anfragen. Liebe die Sprache, aber die Python-Umgebung (Umgebungen?) Ist verwirrend. Ich arbeite nicht in einem virtualenv.

Nach jinja2 docs müssen HTML-Templates in etwas sein, das als Paket bezeichnet wird. Dann sind Sie ein Environment mit einem PackageLoader erstellen, die den Namen des Pakets kennt und die Vorlage dir:

from jinja2 import Environment, PackageLoader 
env = Environment(loader=PackageLoader('yourapplication', 'templates')) 

So, hier ist mein index.py (es ist nur ein Stummel und versucht nicht einmal etwas zu machen, aber Sie können zumindest sagen, ob es abstürzt).

#!/usr/bin/python 
from jinja2 import Environment, PackageLoader # no prob, jinja2 correctly installed using pip 

env = Environment(loader=PackageLoader('mypkg', 'template')) # causes server error 

# if it doesn't crash, just put up a basic html page for now 
print ("Content-type: text/html\r\n\r\n") 
print("<html><head><title>hello</title></head><body>hello wuld</body></html>") 

Hier ist die Verzeichnisstruktur:

index.py 
mypkg/ 
mypkg/template/index.html 
mypkg/__init__.py # empty 

Relevante Linie von Fehlerprotokoll:

ImportError: No module named mypkg 

dies vielleicht anders Ich brauche zu strukturieren, und ich bin mir ziemlich sicher, dass ich brauche um ein setup.py zu erstellen und aufzurufen, um das Modul zu installieren. Das ist ein Teil dessen, was die andere Antwort ausgelassen hat: Was ist in setup.py und wie funktioniert es in diesem Fall? Ich habe Dutzende von Ressourcen auf setup.py angeschaut und keiner von ihnen scheint sich auf die Frage der Installation von HTML-Templates zu beziehen.

Vielen Dank im Voraus für Ihre Hilfe!

UPDATE: fragilewindows zeigte auf eine Ressource, die über "Entwicklermodus" berichtet, was wahrscheinlich ein Teil der Antwort ist. Die Schwierigkeit hier besteht darin, diese Vorlage für die lokale Bereitstellung und nicht für die Verteilung zu paketieren. In 99% der Online-Dokumentation geht es jedoch um Verpackungsprojekte für PyPi. Ich muss kein "Projekt" packen, nur ein einfaches HTML-Template. In der Tat, der einzige Grund, warum ich die Vorlage packen muss, ist, weil das die Standardmethode für jinja2 ist, um auf Vorlagen zuzugreifen (und ich möchte in Python nativ werden).

Ich muss nur die Umgebung davon überzeugen, dass "mypkg" installiert ist, und dass "Vorlage" ein Verzeichnis innerhalb der Installation ist. Sie können sehen, dass meine bisherigen Bemühungen naiv sind; Ich erwarte, dass die richtige Antwort entsprechend leicht ist.

Antwort

1

Ich kenne nicht den Prozess mit Verpackung beteiligt, aber ich denke, da Jinja2 in Python geschrieben wird, wäre der Prozess der gleiche wie das Verpacken einer anderen Anwendung in Python.

Hier sind ein paar Links, die Ihnen nützlich sein können:

Ich hoffe, das hilft.

+0

Dank, hat die PPUG haben einen nützlichen Einblick (Development Mode). Aber diese anderen Ressourcen sind für mein Problem ziemlich irrelevant. Ich entwickle diese Anwendung für die interne Bereitstellung und nicht für die Verteilung. Die ersten sieben Seiten der Suchergebnisse auf Python-Verpackungen sind stark auf die Codeverteilung ausgerichtet, was nicht mein Problem ist. Ich werde meine Frage entsprechend aktualisieren. –

4

Ich habe ein Problem entdeckt, here. In dieser Verwendung ist die Vorlage nicht Teil eines Moduls oder Pakets. Es wird direkt aus dem Dateisystem geladen. Dateisystem:

./index.py 
./template.html 

index.py:

#!/usr/bin/python 
import jinja2 

templateLoader = jinja2.FileSystemLoader(searchpath=".") 
templateEnv = jinja2.Environment(loader=templateLoader) 
TEMPLATE_FILE = "template.html" 
template = templateEnv.get_template(TEMPLATE_FILE) 
outputText = template.render() # this is where to put args to the template renderer 

print ("Content-type: text/html\r\n\r\n") 
print(outputText) 
0

Vielleicht ist ein Thema in PYTHONPATH. Nach Python documantation https://docs.python.org/2.7/tutorial/modules.html#the-module-search-path es sucht nach Modulen in:

  • das Verzeichnis mit der Eingabeskript (oder das aktuelle Verzeichnis) enthält.
  • PYTHONPATH (eine Liste von Verzeichnisnamen mit derselben Syntax wie die Shellvariable PATH).
  • der installationsabhängige Standardwert.

Sie können einen Code zu Ihrer Anwendung hinzufügen - sys.path variable Druck, um sicherzustellen, Pfad Ihres applcation ist auch da.

import sys 
from jinja2 import Environment, PackageLoader # no prob, jinja2 correctly installed using pip 
print sys.path # printing your sys.path 
env = Environment(loader=PackageLoader('mypkg', 'template')) # causes server error 

Wenn es nicht Sie durch hinzufügen

sys.path.append(path_to_your_application)