Python 在自定义模板标记中解析Django自定义模板标记

Python 在自定义模板标记中解析Django自定义模板标记,python,django,django-templates,Python,Django,Django Templates,我有一个工作自定义模板标签。我想允许我的Django管理界面用户将模板标记放在flatpage中,并使其正确呈现。但是,当尝试访问呈现的flatpage时,我得到一个500服务器错误。调试控制台打印模板语法错误:无效的块标记:“requesturl”。是否存在某种我不知道的自定义模板标记加载优先级 这是我的自定义模板标记: 来自django导入模板的 导入请求 register=template.Library() def getrequest(url): """ 简单请求对象 获取另一个文件

我有一个工作自定义模板标签。我想允许我的Django管理界面用户将模板标记放在flatpage中,并使其正确呈现。但是,当尝试访问呈现的flatpage时,我得到一个500服务器错误。调试控制台打印
模板语法错误:无效的块标记:“requesturl”
。是否存在某种我不知道的自定义模板标记加载优先级

这是我的自定义模板标记:

来自django导入模板的

导入请求
register=template.Library()
def getrequest(url):
"""
简单请求对象
获取另一个文件
"""
尝试:
r=请求。获取(url)
除了requests.exceptions.RequestException作为e:
升起IOError(e)
除了requests.exceptions.HTTPError作为e:
升起IOError(e)
如果r.status_代码!=200:
raise IOError('返回非200响应')
其他:
返回r.content
@register.tag(name=“requesturl”)
def do_请求URL(解析器、令牌):
"""
标记用法{%requesturl object.textfield%}
"""
尝试:
tag_name,uri=token.split_contents();
除值错误外:
raise template.TEMPLATESYNTEXERROR,“%r标记需要单个URI字符串参数”%token.contents.split()[0]
如果不是(uri[0]==uri[-1]和uri[0]位于(“,”)):
提升模板.TemplateSyntaxError(“%r标记的URI应在引号中”%tag\u name)
返回RequestUrlNode(uri[1:-1])
类RequestUrlNode(template.Node):
定义初始化(self,uri):
self.uri=uri
def呈现(自身、上下文):
尝试:
pagecontent=getrequest(self.uri)
返回页面内容
除template.VariableDoesNotExist、template.TemplateSyntaxError外:
返回“错误呈现”,self.uri
我可以将其放入任何Django模板中,定义一个URL(在模板本身中),它使用
requests
模块获取指定网页的内容并在模板中呈现:

{%extends“site_layout.html”%}
{%load requesturl%}
{%requesturl“http://textfiles.com/100/914bbs.txt" %}
很好。现在,下一步是,我希望我的用户能够在默认的Django flapages应用程序中通过在
flatpages.content
字段中添加模板标记来实现这一点,如下面的屏幕截图所示:

请注意,我已确保使用的是特定的flatpages模板,而不是默认模板

为了评估标记,我按照中的步骤进行了操作。在尝试评估自己的自定义模板标记之前,我使用内置的Django模板标记和过滤器进行了测试,效果非常好。下面是Django内置模板过滤器(
lower
)和标记(
now
)的示例:

以及如何呈现:

但是,当我尝试在中输入自己的自定义模板标记时,我得到了可怕的
模板语法错误:无效块标记:“requesturl”
。下面是我的flatpage解析模板标记:

来自django导入模板的

register=template.Library()
@register.tag(name=“evaluate”)
def do_evaluate(解析器、令牌):
"""
标记用法{%evaluate object.textfield%}
"""
尝试:
tag_name,variable=token.split_contents()
除值错误外:
raise template.TemplateSyntaxError,“%r标记需要一个参数”%token.contents.split()[0]
返回EvaluateNode(变量)
类EvaluateNode(template.Node):
def uuu init uuu(自,变量):
self.variable=template.variable(变量)
def呈现(自身、上下文):
尝试:
content=self.variable.resolve(上下文)
t=模板。模板(内容)
返回t.render(上下文)
除template.VariableDoesNotExist、template.TemplateSyntaxError外:
返回“错误呈现”,self.variable
我不知道为什么我可以分别做这两部分,但当我尝试将它们结合起来时,我得到了错误:

File "/path/to/virtualenv/lib/python2.7/site-packages/django/template/base.py", line 332, in invalid_block_tag
raise self.error(token, "Invalid block tag: '%s'" % command)
TemplateSyntaxError: Invalid block tag: 'requesturl'
我能想到的唯一一件事是,我的自定义模板标记没有在Django中注册,但是如果它直接嵌入flatpages模板中,为什么它会工作呢?是否存在某种底层模板标记注册表,或者我的
EvaluateNode
类没有做我认为它正在做的事情


提前感谢!

在我看来,这不是一个合适的解决方案,但这是我现在部署的一个解决方案。我最终使用了预先存在的Django模板标记
{%ssi%}
并包括来自文件系统的文件。我希望我的用户能够包括系统外的文件,但对于我的用例,我可以只包括Django安装的本地文件

有人可能会说,不管怎样,我试图做的事情本质上是不安全的,强迫我的用户只包含Django系统本地的文件要安全得多。这仍然没有回答我最初的问题,这更多是关于自定义模板标记注册和使用,而不是关于实际用例