2008-09-18 24 views
94

Tôi muốn sử dụng công cụ mẫu Django trong mã (Python) của tôi, nhưng tôi không xây dựng một trang web dựa trên Django. Làm thế nào để sử dụng nó mà không có một tập tin settings.py (và những người khác) và phải thiết lập biến môi trường DJANGO_SETTINGS_MODULE?Làm cách nào để sử dụng các mẫu Django mà không có phần còn lại của Django?

Nếu tôi chạy đoạn mã sau:

>>> import django.template 
>>> from django.template import Template, Context 
>>> t = Template('My name is {{ my_name }}.') 

tôi nhận được:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined. 

Trả lời

127

Giải pháp là đơn giản. Nó thực sự là well documented, nhưng không quá dễ tìm. (Tôi đã phải đào bới xung quanh - nó không đưa ra khi tôi đã thử một số tìm kiếm khác của Google.)

Các mã sau hoạt động:

>>> from django.template import Template, Context 
>>> from django.conf import settings 
>>> settings.configure() 
>>> t = Template('My name is {{ my_name }}.') 
>>> c = Context({'my_name': 'Daryl Spitzer'}) 
>>> t.render(c) 
u'My name is Daryl Spitzer.' 

Xem tài liệu Django (liên kết ở trên) cho một mô tả một số cài đặt bạn có thể muốn xác định (làm đối số từ khóa để định cấu hình).

+12

Và để có được nó từ một tập tin: settings.configure ("" TEMPLATE_DIRS = (,) ) t = get_template ('test.html') – Bryce

+0

Tài liệu cho settings.configure() là ở đây - https://docs.djangoproject.com/en/1.7/topics/settings/ – Scott

+0

Từ liên kết "được ghi lại" ở trên, điều này đúng với phiên bản 1.7. Bắt đầu từ 1.8, có vẻ như bạn không cần 'settings.configure()' nữa. –

9

Bất kỳ lý do đặc biệt mà bạn muốn sử dụng mẫu của Django? Cả hai JinjaGenshi, theo ý kiến ​​của tôi, cấp trên.


Nếu bạn thực sự muốn, sau đó xem Django documentation on settings.py. Đặc biệt là phần "Sử dụng cài đặt mà không cần cài đặt DJANGO_SETTINGS_MODULE". Sử dụng một cái gì đó như thế này:

from django.conf import settings 
settings.configure (FOO='bar') # Your settings go here 
0

Google AppEngine sử dụng cỗ máy template Django, có bạn lấy một cái nhìn như thế nào họ làm điều đó? Bạn có thể có thể chỉ cần sử dụng đó.

40

Jinja2syntax là khá giống với Django với rất ít sự khác biệt, và bạn có được một công cụ mẫu mạnh mẽ hơn nhiều, cũng biên dịch mẫu của bạn thành bytecode (FAST!).

Tôi sử dụng nó cho khuôn mẫu, bao gồm cả trong Django chính nó, và nó là rất tốt. Bạn cũng có thể dễ dàng viết các phần mở rộng nếu thiếu một số tính năng bạn muốn.

Dưới đây là một số cuộc biểu tình của các thế hệ mã:

>>> import jinja2 
>>> print jinja2.Environment().compile('{% for row in data %}{{ row.name | upper }}{% endfor %}', raw=True) 
from __future__ import division 
from jinja2.runtime import LoopContext, Context, TemplateReference, Macro, Markup, TemplateRuntimeError, missing, concat, escape, markup_join, unicode_join 
name = None 

def root(context, environment=environment): 
    l_data = context.resolve('data') 
    t_1 = environment.filters['upper'] 
    if 0: yield None 
    for l_row in l_data: 
     if 0: yield None 
     yield unicode(t_1(environment.getattr(l_row, 'name'))) 

blocks = {} 
debug_info = '1=9' 
+4

Tôi đang sử dụng Jinja trong một dự án của tôi, bởi vì tôi muốn một cái gì đó mà tôi đã khá quen thuộc, nhưng không muốn người dùng của tôi (vì nó là một ứng dụng phân phối) phải cài đặt Django. Điểm cộng là Jinja có thể được cài đặt với easy_install. –

+4

Django cũng có thể được cài đặt với easy_install. – hegemon

+0

Jinga chưa chính thức hỗ trợ Python3. Theo trang web, nó vẫn còn thử nghiệm. – Pramod

0

Tôi xin nhắc lại những điều khoản trên. Jinja 2 là một superset khá tốt của Django mẫu để sử dụng chung. Tôi nghĩ rằng họ đang làm việc trên làm cho các mẫu Django một chút ít kết hợp với settings.py, nhưng Jinja nên làm tốt cho bạn.

7

Tôi cũng khuyên bạn nên dùng jinja2. Có một số nice article trên djangojinja2 cung cấp một số thông tin chi tiết về lý do bạn nên chọn trước sau.

+0

Tôi thích Jinja2 hơn vì cú pháp '{% set%}' và công bằng đối với Twig template engine (PHP). Tốt hơn là viết mã nền tảng luôn, nhưng sự khác biệt hiệu suất không quan trọng - ví dụ, ** python sẽ luôn hoạt động chậm hơn so với PHP ** vì vậy nếu bạn cần hiệu năng, bạn nên tạo trang web với PHP, Twig và Symfony2 hoặc người khác. Buồn nhưng đó là sự thật. – Croll

+0

@Croll, Nếu trang web của bạn thực hiện các tính toán phức tạp thì thư viện python nhanh hơn một cách nhanh chóng, nếu không nút cổ chai là cơ sở dữ liệu hoặc bạn có thể làm điều gì đó thực sự sai cách yêu cầu in đậm – Bob

1

Không. Sử dụng StringTemplate thay thế - không có lý do gì để xem xét bất kỳ công cụ mẫu nào khác khi bạn biết về nó.

+0

! liên kết? –

+0

Cổng Python trông quá giống Java. Nó không phải là pythonic. –

2

Tôi cũng sẽ nói Jinja.Nó chắc chắn là mạnh mẽ hơn so với Django Templating Engine và nó là đứng một mình.

Nếu đây là một plug bên ngoài cho một ứng dụng Django hiện có, bạn có thể tạo a custom command và sử dụng công cụ tạo khuôn mẫu trong môi trường dự án của bạn. Như thế này;

manage.py generatereports --format=html 

Nhưng tôi không nghĩ nó đáng giá chỉ bằng cách sử dụng Công cụ sửa đổi Django thay vì Jinja.

0

Trong khi chạy vỏ manage.py:

>>> from django import template 
>>> t = template.Template('My name is {{ me }}.') 
>>> c = template.Context({'me': 'ShuJi'}) 
>>> t.render(c) 
2

Cám ơn các folks giúp đỡ. Đây là một bổ sung nữa. Trường hợp bạn cần sử dụng thẻ mẫu tùy chỉnh.

Hãy nói rằng bạn có điều này mẫu thẻ quan trọng trong mô-đun read.py

from django import template 

register = template.Library() 

@register.filter(name='bracewrap') 
def bracewrap(value): 
    return "{" + value + "}" 

Đây là html template file "temp.htm":

{{var|bracewrap}} 

Cuối cùng, đây là một Python tập lệnh sẽ liên kết với nhau

import django 
from django.conf import settings 
from django.template import Template, Context 
import os 

#load your tags 
from django.template.loader import get_template 
django.template.base.add_to_builtins("read") 

# You need to configure Django a bit 
settings.configure(
    TEMPLATE_DIRS=(os.path.dirname(os.path.realpath(__file__)),), 
) 

#or it could be in python 
#t = Template('My name is {{ my_name }}.') 
c = Context({'var': 'stackoverflow.com rox'}) 

template = get_template("temp.html") 
# Prepare context .... 
print template.render(c) 

Đầu ra sẽ là

{stackoverflow.com rox} 
+0

'django.template.base.add_to_builtins (" read ")' đặt ra 'ValueError' cho tôi. – oarfish

+0

cho lỗi 'TemplateDoesNotExist' Tôi đang sử dụng django 1.10.1 –

3

Theo tài liệu Jinja, Python 3 support is still experimental. Vì vậy, nếu bạn đang ở trên Python 3 và hiệu suất không phải là một vấn đề, bạn có thể sử dụng công cụ xây dựng mẫu của django.

Django 1.8 đã giới thiệu hỗ trợ cho multiple template engines yêu cầu thay đổi cách tạo mẫu. Bạn phải định cấu hình rõ ràng settings.DEBUG được sử dụng bởi công cụ mẫu mặc định do django cung cấp. Đây là mã để sử dụng các mẫu mà không sử dụng phần còn lại của django.

from django.template import Template, Context 
from django.template.engine import Engine 

from django.conf import settings 
settings.configure(DEBUG=False) 

template_string = "Hello {{ name }}" 
template = Template(template_string, engine=Engine()) 
context = Context({"name": "world"}) 
output = template.render(context) #"hello world" 
0

Một sự thêm vào những gì khác đã viết, nếu bạn muốn sử dụng Django Template trên Django> 1,7, bạn phải cung cấp cho settings.configure của bạn (...) gọi biến MẪU và gọi django.setup() như này:

from django.conf import settings 

settings.configure(TEMPLATES=[ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': ['.'], # if you want the templates from a file 
     'APP_DIRS': False, # we have no apps 
    }, 
]) 

import django 
django.setup() 

Sau đó, bạn có thể tải mẫu của bạn như bình thường, từ một chuỗi:

from django import template 
t = template.Template('My name is {{ name }}.') 
c = template.Context({'name': 'Rob'}) 
t.render(c) 

Và nếu bạn đã viết các biến dirs trong .configure, từ đĩa:

from django.template.loader import get_template 
t = get_template('a.html') 
t.render({'name': 5}) 

Django Error: No DjangoTemplates backend is configured

http://django.readthedocs.io/en/latest/releases/1.7.html#standalone-scripts