2013-01-11 44 views
7

Tôi đang cố gắng tạo mẫu html trong python bằng Jinja2. Tôi có một thư mục mẫu với 'template.html' của tôi nhưng tôi không biết làm thế nào để đối phó với môi trường hoặc trình tải gói.Tạo biểu mẫu HTML bằng Jinja2 - Mất

Tôi đã cài đặt Jinja2 bằng easy_python và chạy tập lệnh sau.

from jinja2 import Environment, PackageLoader 
env = Environment(loader=PackageLoader('yourapplication', 'templates')) 
template = env.get_template('mytemplate.html') 
print template.render() 

Tôi nhận được lỗi sau vì tôi không biết cách xác định gói/mô-đun. Xin hãy giúp tôi Tôi chỉ muốn tạo một mẫu đơn giản.

File "log_manipulationLL.py", line 291, in <module> 
env = Environment(loader=PackageLoader('yourapplication', 'templates')) 
File "/usr/local/lib/python2.7/dist-packages/Jinja2-2.6-py2.7.egg/jinja2/loaders.py", line 216, in __init__ 
provider = get_provider(package_name) 
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 213, in get_provider 
__import__(moduleOrReq) 
ImportError: No module named yourapplication 

Trả lời

8

PackageLoader mong đợi mô-đun Python thực tế sử dụng cú pháp chấm thông thường. Ví dụ: nếu cấu trúc của bạn trông giống như sau:

myapp/ 
    __init__.py 
    … 
    templates/ 
    mytemplate.html 

Bạn nên sử dụng myapp làm tên mô-đun.

+0

Bạn có thể để trống. Xem http://docs.python.org/2/tutorial/modules.html#packages – patrys

+0

Oh cảm ơn rất nhiều! – pombo

8

tôi giải quyết vấn đề này bằng cách sử dụng đoạn mã sau:

env = Environment(loader=PackageLoader('scriptname', 
             templatesPath)) 

nơi mã này là vào file scriptname.py.

Tôi không chắc liệu câu trả lời của tôi có liên quan hay không nhưng tôi đã tự hỏi rằng có lẽ ai đó có thể tìm thấy câu trả lời này hữu ích. Nếu tôi sai, xin vui lòng cho tôi biết.

+1

Trình tải gói gọi 'scriptname.py'. Nếu bạn khởi tạo trình nạp gói trong đó, mã sẽ được gọi là lần thứ hai. – Henrik

8

Nếu bạn không muốn hoặc cần một gói Python, có lẽ bạn nên sử dụng một FileSystemLoader thay vào đó, như thế này:

from jinja2 import Environment, FileSystemLoader, select_autoescape 
env = Environment(
    loader=FileSystemLoader('file/path/'), 
    autoescape=select_autoescape(['html', 'xml']), 
) 
1

PackageLoader được định nghĩa như thế này:

class PackageLoader(BaseLoader): 
    """Load templates from python eggs or packages. It is constructed with 
    the name of the python package and the path to the templates in that 
    package:: 

     loader = PackageLoader('mypackage', 'views') 

    If the package path is not given, ``'templates'`` is assumed. 

    Per default the template encoding is ``'utf-8'`` which can be changed 
    by setting the `encoding` parameter to something else. Due to the nature 
    of eggs it's only possible to reload templates if the package was loaded 
    from the file system and not a zip file. 
    """ 

Và sau đó __init__() phương pháp như sau:

def __init__(self, package_name, package_path='templates', 
      encoding='utf-8'): 

Điều này làm cho chúng tôi nhận thấy rằng một st ructure như thế này:

myapp/ 
    __init__.py 
    ... 
    templates/ 
    mytemplate.html 

sẽ có cùng PackageLoader dụ với cả hai tuyên bố:

PackageLoader('myapp') 
PackageLoader('myapp', 'templates') 

Và vì vậy nếu bạn đang chạy từ đường myapp/, sau đó bạn chỉ cần nói:

PackageLoader('templates', '') 

Vì vậy, nó sẽ chỉ mất templates/ làm đường dẫn. Nếu bạn để trống đối số thứ 2, nó sẽ cố gắng tìm các mẫu trong templates/templates.

Cuối cùng, bạn có thể kiểm tra những gì đã được nạp bằng cách sử dụng phương pháp list_templates():

PackageLoader('templates', '').list_templates() 
Các vấn đề liên quan