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?


101

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

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

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

Tôi có:

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

Câu trả lời:


133

Giải pháp rất đơn giản. Nó thực sự được ghi lại đầy đủ , nhưng không quá dễ tìm. (Tôi đã phải tìm kiếm xung quanh - nó không xuất hiện khi tôi thử một vài tìm kiếm khác nhau trên Google.)

Đoạn 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 (được liên kết ở trên) để biết mô tả về 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).


13
Và để lấy nó từ một tệp: settings.configure (TEMPLATE_DIRS = (".",)) T = get_template ('test.html')
Bryce

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

Từ liên kết "được tài liệu tốt" ở 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.
Olaf Dietsche

Nếu bạn muốn bao gồm các mẫu khác hoặc sử dụng kế thừa mẫu, giải pháp trên của Bryce là cần thiết.
titusjan,

6
Tôi cũng cần gọi django.setup () trước hàm tạo Mẫu.
Amit,

44

Cú pháp của Jinja2 khá giống với Django với rất ít sự khác biệt và bạn sẽ có được một công cụ mẫu mạnh mẽ hơn nhiều, công cụ này cũng biên dịch mẫu của bạn thành mã bytecode (NHANH CHÓNG!).

Tôi sử dụng nó để tạo khuôn mẫu, bao gồm cả trong chính Django, và nó rất tốt. Bạn cũng có thể dễ dàng viết tiện ích 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ố minh chứng về việc tạo 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 mình, vì tôi muốn thứ gì đó mà tôi đã khá quen thuộc, nhưng không muốn người dùng của mình (vì đó là một ứng dụng có thể phân phối) phải cài đặt Django. Một điểm cộng là Jinja có thể được cài đặt bằng easy_install.
Xiong Chiamiov

4
Django cũng có thể được cài đặt bằng easy_install.
hegemon

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

9

Bất kỳ lý do cụ thể nào bạn muốn sử dụng các mẫu của Django? Theo tôi, cả JinjaGenshi đều là những người vượt trội.


Nếu bạn thực sự muốn, hãy xem tài liệu Django trênsettings.py . Đặc biệt là phần "Sử dụng cài đặt 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

7

Tôi cũng muốn giới thiệu jinja2. Có một bài viết hay về djangovs. jinja2cung cấp một số thông tin chi tiết về lý do tại sao bạn nên yêu thích phần sau.


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

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

4

Theo tài liệu Jinja, hỗ trợ Python 3 vẫn đang trong giai đoạn thử nghiệm . Vì vậy, nếu bạn đang sử dụng Python 3 và hiệu suất không phải là vấn đề, bạn có thể sử dụng công cụ mẫu tích hợp sẵn của django.

Django 1.8 đã giới thiệu hỗ trợ cho nhiều công cụ mẫu yêu cầu thay đổi cách khởi 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"

4

Ngoài những gì người 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 TEMPLATES và gọi django.setup () như sau:

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 mình 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 biến DIRS trong .configure, từ đĩa:

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

Lỗi Django: Không có chương trình phụ trợ DjangoTemplates nào được định cấu hình

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


2

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

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

manage.py generatereports --format=html

Nhưng tôi không nghĩ chỉ cần sử dụng Django Templating Engine thay vì Jinja thì không nên.


2

Cảm ơn sự giúp đỡ của mọi người. Đâ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.

Giả sử bạn có thẻ mẫu quan trọng này trong mô-đun read.py

from django import template

register = template.Library()

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

Đây là tệp mẫu html "temp.html":

{{var|bracewrap}}

Cuối cùng, đây là một tập lệnh Python sẽ liên kết tất cả lại 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}

django.template.base.add_to_builtins("read")tăng một ValueErrorcho tôi.
oarfish

đưa ra TemplateDoesNotExistlỗi Tôi đang sử dụng django 1.10.1
Vikrant Singh


1

Đừ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ó.


Cổng Python trông giống như Java. Nó không phải là pythonic.
Michael Buckley

0

Tôi lặp lại các tuyên bố trên. Jinja 2 là một tập hợp các mẫu Django khá tốt để sử dụng chung. Tôi nghĩ rằng họ đang làm việc để tạo các mẫu Django ít hơn một chút khi kết hợp với settings.py, nhưng Jinja sẽ làm tốt cho bạn.


0

Trong khi chạy manage.pyshell:

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

0

Google AppEnginesử dụng công cụ tạo khuôn mẫu Django, bạn đã xem cách họ thực hiện chưa? Bạn có thể chỉ cần sử dụng nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.