2016-07-27 88 views
0

(更新:我做了一個更好的答案here我要刪除這個問題的一個更好的問題,但一些問題的答案可能有好處,未來的搜索。)需要打包的Jinja2模板蟒蛇

我的問題與this大致相同,但答案很難看(需要一個包括sharedtemplates/templates/templates/的目錄結構),發佈時不完整(用戶「回答」他自己的問題),並假設我沒有的知識。

我正在處理我的第一個python支持的web應用程序。 javascript組件正在開發中使用靜態HTML頁面。現在我想要一個服務器端的python組件來處理AJAX調用並使用jinja2呈現HTML模板。

我以前用python成功了,用tkinter/requests創建GUI應用程序。愛語言,但python環境(環境?)令人困惑。我不是在virtualenv工作。

根據jinja2 docs,HTML模板必須被稱爲包。然後創建一個PackageLoader,知道包的名稱和模板目錄的Environment

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

所以,這裏是我的index.py(它只是一個短線甚至不嘗試呈現什麼,但是你至少可以知道它是否崩潰)。

#!/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>") 

這裏的目錄結構:

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

從錯誤日誌相關線路:

ImportError: No module named mypkg 

也許我需要以不同的結構這一點,我敢肯定,我需要創建並調用setup.py來安裝該模塊。這是其他答案遺漏的一部分:setup.py中的內容以及它在這種情況下如何工作?我查看了setup.py上的幾十個資源,它們都沒有涉及到安裝HTML模板的問題。

在此先感謝您的幫助!

更新:fragilewindows指向一個資源,講述「開發人員模式」,這可能是答案的一部分。這裏的困難在於,我正在考慮將此模板打包爲本地部署,而不是分發。但99%的在線文檔是關於PyPi的打包項目。我不需要打包一個「項目」,只是一個簡單的HTML模板。事實上,我需要打包模板的唯一原因是因爲這是jinja2訪問模板的默認方式(並且我確實想在Python中本地化)。

我只需要說服安裝了「mypkg」的環境,並且「template」是安裝目錄中的一個目錄。你可以看到我迄今的努力是天真的;我期望正確的答案將相應地輕量級。

回答

1

我不知道與包裝有關的過程,但是我認爲Jinja2是用Python編寫的,這個過程與在Python中打包任何其他應用程序的過程相同。

這裏有幾個鏈接,可能對你有用:

我希望這有助於。

+0

由於添加的PPUG確實有一個有益的啓示(開發模式)。但那些其他資源與我的問題無關。我正在開發此應用程序進行內部部署,而不是分發。 python包裝上的搜索結果前七頁主要涉及代碼的分發,這不是我的問題。我會相應地更新我的問題。 –

4

我發現了一個解決方法,here。在這種用法中,模板不是模塊或包的一部分;它直接從文件系統加載。文件系統:

./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

也許一個問題是PYTHONPATH。

您可以添加一些代碼到你的應用程序 - 打印sys.path的變量,以確保您的applcation的路徑也有。

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 

如果它不是你可以通過

sys.path.append(path_to_your_application)