2016-07-01 12 views
0

Wir haben eine App das ist eine Fusion von Kolben und Django und es verwendet Mako als Vorlage-Engine, wir wollen alternative Vorlagen in einigen Ansichten für wenn der Benutzer eingeschaltet ist Handy, die derzeit die, was ich getan habe, ist zwei Unterordner in meinem Vorlagenordner zu machen und die render-Methode overide die entsprechende makoAlternative mobile Vorlagen für eine Mako + Flask-Django App

templates 
    mobile 
    base.mako 
    index.mako 
    desktop 
    base.mako 
    index.mako 
    results.mako 

So zum Beispiel greifen, wenn ich mache nennen („index.mako“) und Die Anfrage hat request.mobile==True dann wird die Datei URL auf mobile/index.mako übersetzen, wenn die 'mobile/{einige Vorlage} .mako' nicht existiert wird es automatisch greifen 'desktop/{einige Vorlage} .mako', da alle Vorlagen existieren für der Desktop. Das Problem ist jetzt mit inheritence kommt, sage ich die folgende Vorlage

results.mako

<%inherit file="base.mako" /> 
<select> 
------ 
</select> 

und ich rufe die render ("results.mako") mit request.mobile == wahr haben, den Weg wird in desktop/results.mako übersetzen (da die results.mako existiert nicht für mobile) und die results.mako wird erben von der 'desktop/base.mako' (da es den relativen pfad verwendet) und nicht die richtige 'mobile/base.mako 'sollte verwendet werden, da es ein mobiles und das mobile/base.mako gibt.

Irgendwelche Ideen, wie man dies in einem eleganten (vermeiden Sie wenns innerhalb des mako) Weges löst? Vielleicht, indem Sie irgendwie das Verzeichnis ändern, denkt, dass die Vorlage sich befindet?

Antwort

0

Ich löste das Problem durch Überschreiben der Methode get_template des TemplateLookup-Objekts des Mako.

#override the template loading function in order to load the mobile ones when needed 
    def get_template(self, uri): 
     is_mobile_version=False 
     has_mobile_view=False; 

     u = re.sub(r'^\/+', '', uri).replace("mobile/","").replace("desktop/","") 
     for dir in self.directories: 
      dir = dir.replace(os.path.sep, posixpath.sep) 

      mobile_file = posixpath.normpath(posixpath.join(dir, "mobile/" + u)) 

      if os.path.isfile(mobile_file): 
       has_mobile_view = True 

      if (local.request.cookies.get("mobile") == "true"): 
       is_mobile_version = True 

       local.response_headers['has_mobile_view'] = has_mobile_view 
       local.response_headers["mobile"] = True 

       if (has_mobile_view): 
        local.response_headers['is_mobile_version'] = is_mobile_version 
        return self._load(mobile_file, "mobile/" + u) 

      desktop_file = posixpath.normpath(posixpath.join(dir, "desktop/" + u)) 
      if (os.path.isfile(desktop_file)): 
       return self._load(desktop_file, uri) 
      else: 
       raise exceptions.TopLevelLookupException(
        "Cant locate(desktop or mobile) template for uri %r" % uri) 
    func_type=type(TemplateLookup.get_template) 
    self.template_env.get_template = func_type(get_template, self.template_env, TemplateLookup)