Python 如何使用Appengine SDK将Django内置过滤器与Jinja2一起使用?

Python 如何使用Appengine SDK将Django内置过滤器与Jinja2一起使用?,python,django,google-app-engine,jinja2,Python,Django,Google App Engine,Jinja2,不久前我尝试了几种不同的方法,每种方法都给出了不同的异常,所以我放弃了,决定在需要时手动编写过滤器。但是我缺少原生的escapejs和其他有用但简单的过滤器 有几个相关的问题和答案,但据我所知,没有一个能无缝地实现这一点。我想主要的问题是django过滤器例程与django环境的联系太多了 请仅在Appengine SDK环境中使用内置django过滤器的情况下回答,根据我的经验,这比普通环境更难,因为Appengine环境有限我在评论中提到了这一点,但我在这里会更具体,因为我有更多的空间。Dj

不久前我尝试了几种不同的方法,每种方法都给出了不同的异常,所以我放弃了,决定在需要时手动编写过滤器。但是我缺少原生的escapejs和其他有用但简单的过滤器

有几个相关的问题和答案,但据我所知,没有一个能无缝地实现这一点。我想主要的问题是django过滤器例程与django环境的联系太多了


请仅在Appengine SDK环境中使用内置django过滤器的情况下回答,根据我的经验,这比普通环境更难,因为Appengine环境有限

我在评论中提到了这一点,但我在这里会更具体,因为我有更多的空间。Django是一个端到端的web应用程序框架,它恰好包含了自己的模板语言,由于缺少更好的术语,因此被称为“Django模板语言”。文档中的所有模板标记和过滤器都特定于该语言

如果您选择使用Jinja2,则选择使用该模板语言的结构,而不使用Django的结构。(显然,模型和视图是一个独立的层,但原则上,它们也可以交换——它们都是松散耦合的。)因此,用于模板化的Django文档在这种情况下对您没有好处。如果您想在Jinja2中格式化一个float,那么根据


如果没有更多的信息,我真的说不出是什么导致了导入错误,但是在Jinja2模板中,
floatformat
不起作用,所以这可能与此有关。

Django模板引擎中的模板标记是接受值和参数的简单函数。它们都可以在源代码中直接访问

这是IPython的输出:

In [173]: from django.template.defaultfilters import  date 

In [174]: date??
Type:       function
String Form:<function date at 0xa2935f0>
File:       /usr/local/python/thor/lib/python2.7/site-packages/django/template/defaultfilters.py
Definition: date(value, arg=None)
Source:
@register.filter(expects_localtime=True, is_safe=False)
def date(value, arg=None):
    """Formats a date according to the given format."""
    if not value:
        return u''
    if arg is None:
        arg = settings.DATE_FORMAT
    try:
        return formats.date_format(value, arg)
    except AttributeError:
        try:
            return format(value, arg)
        except AttributeError:
            return ''

你试过什么?正如您所知,您将无法在Jinja2模板中使用任何内置的Django模板标记和过滤器。Jinja2模板看起来像Django模板,但有一个完全独立的标记和扩展框架。我尝试过这样直接添加它们:例如,escapejs使用此方法非常有效,但是floatformat抛出:raise ImportError(“无法导入设置,因为环境变量%s未定义。”%environment_variable)ImportError:无法导入设置,因为环境变量DJANGO_Settings_MODULE未定义。您可以尝试使用DJANGO config添加Settings.py,并通过在app.yaml中添加env_变量(带换行符和缩进)将您的应用指向它:env_变量:DJANGO_Settings_MODULE:'Settings'for escapejs,没有人提到这一点,但我想xmlattr过滤器的工作做得很好,您只需将字符串放入dict中:
_base_js_escapes = (
    ('\\', r'\u005C'),
    ('\'', r'\u0027'),
    ('"', r'\u0022'),
    ('>', r'\u003E'),
    ('<', r'\u003C'),
    ('&', r'\u0026'),
    ('=', r'\u003D'),
    ('-', r'\u002D'),
    (';', r'\u003B'),
    (u'\u2028', r'\u2028'),
    (u'\u2029', r'\u2029')
)

# Escape every ASCII character with a value less than 32.
_js_escapes = (_base_js_escapes +
               tuple([('%c' % z, '\\u%04X' % z) for z in range(32)]))

def escapejs(value):
    """Hex encodes characters for use in JavaScript strings."""
    for bad, good in _js_escapes:
        value = mark_safe(force_unicode(value).replace(bad, good))
    return value