2015-10-05 64 views
4

现状:Django的分析模板提取变量

我使用Django模板编写自定义平面文件,但是我希望能够使用相同的Django的模板来提取由Django的产生的任何数据模板。

这里是模板文件的示例test.conf

object User "{{ user }}" { 

    display_name = "{{first_name}} {{last_name}}" 
    groups = [ "{{ group_name }}" ] 
    email = "{{ email }}" } 

这里是生成的输出。

object User "test1" { 
    display_name = "test2" 
    groups = [ "test3" ] 
    email = "test4" } 

我希望能够从使用 “test.conf” Django的模板平面文件中提取数据 “TEST1,TEST2,TEST3,TEST4”。这是可能的,还是我需要解析这些数据?

编辑:此代码段工作。如果打开模板文件(“文件”,“r”),它会将转义码添加到字符串中。您只需要添加正则表达式转义标志,如\\ [for [。感谢您的帮助。

回答

4

据我所知,没有反向解析API,所以我认为你的想法是不可能的。

但是,你仍然可以使用模板来生成一个正则表达式通过做这样的事情来提取关键字:

from django.template import Template, Context 
import re 

template_source = """ 
object User "{{ user }}" { 

display_name = "{{first_name}} {{last_name}}" 
groups = [ "{{ group_name }}" ] 
email = "{{ email }}" } 
""" 

# re.escape will add backslashes to all non-alphanumeric characters 
template_source = re.escape(template_source) 
# but we need to fix all escaped {{ and }} characters 
template_source = template_source.replace('\{\{', '{{') 
template_source = template_source.replace('\}\}', '{{') 

# (you will also need to do this for the tag delimiters {% %} and for 
# any symbols inside your template tags) 

t = Template(template_source) 
c = Context({ 
    "user": "(?P<user>.*?)", 
    "first_name" :"(?P<first_name>.*?)", 
    # (there's probably an easier way to do this for all the parameters) 
    ... 
}) 

regex_string = t.render(c) 

# regex_string will look like this: 
# (actually way uglier since re.escape will also escape whitespace!) 
""" 
object User \"(?P<user>.*?)\" \{ 

display_name \= \"(?P<first_name.*?) (?P<last_name.*?)\" 
groups \= ... 
""" 

regex = re.compile(regex_string, re.MULTILINE) 
+0

真的聪明的解决方案! – Tiago

+1

你是不是指'template_source'而不是'template.source'来修复'{{'和'}}'? – developius

+0

@developius修好了,谢谢! – gbs