django - 如何从 Jinja2 扩展访问上下文

标签 django request jinja2

我有一个用于 Django 模板的节点:

class MetadataNode(template.Node):
    def render(self, context):
    ...

其中注册一个标签:
def get_metadata(parser, token):
    ...
register = template.Library()
register.tag(get_metadata)

但是我使用的是 Jinja2 模板,因此我需要一个 Jinja2 扩展:
class get_metadata(Extension):
    tags = {'get_metadata'}

    def parse(self, parser):
        while not parser.stream.current.type == 'block_end':
            parser.stream.next()
        return nodes.Output([self.call_method('_get_metadata')])

    def _get_metadata(self):
        return Markup(MetadataNode().render(<Django context???>))

register = CoffinLibrary()
register.tag(get_metadata)

如何在解析方法中访问 Django 上下文(特殊性 request.META.PATH_INFO)?
或者如何使用上下文运行渲染元数据节点?

最佳答案

您可以使用 contextfunction wrapper 。

from jinja2 import contextfunction

class get_metadata(Extension):
    tags = {'get_metadata'}

    def parse(self, parser):
        while not parser.stream.current.type == 'block_end':
            parser.stream.next()
        return nodes.Output([self.call_method('_get_metadata')])

    @contextfunction
    def _get_metadata(self, context):
        req = context.get("request")
        if not req:
            return None
        return req["META"]["PATH_INFO"]

register = CoffinLibrary()
register.tag(get_metadata)

关于django - 如何从 Jinja2 扩展访问上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19116311/

相关文章:

python - jinja2如何在日期时间中删除微秒

django - 将数据生产者作为工作人员集成到 Django Channels 2.x

django - 迁移日期时间 w。 PostgreSQL 中的时区到 UTC 时区以使用 Django 1.4

node.js - Nodejs 同步请求不返回 HTML 响应

c# - Image.FromStream 错误 - 无法发送动词类型的内容正文

javascript - 我如何将这些功能与 promise 联系在一起?

python - 确定将什么添加到 PYTHONPATH 以解决导入问题的一般过程/概念是什么?

python - Ajax post请求返回空querydict

python - Jinja2 模板未正确呈现 if-elif-else 语句

python - Jinja2 - 给定 2 个模板(作为字符串)如何渲染一个扩展另一个的模板?