2016-07-01 3 views
0

私たちは、フラスコとdjangoを融合したアプリを持っており、makoをテンプレートエンジンとして使用しています。モバイル、現在私が行っていることは私のテンプレートフォルダ内に二つのサブフォルダを作成し、私は(「index.mako」)をレンダリング呼び出した場合、たとえばのでmako + flask-djangoアプリの別のモバイルテンプレート

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

適切なマコをつかむためにrenderメソッドをオーバライドすることであり、要求がrequest.mobile==Trueである場合、ファイルURLをmobile/index.makoに変換します。 'mobile/{some template} .mako'が存在しない場合、自動的に 'desktop/{some template} .mako'を取得します。デスクトップ。 問題は今、継承が付属して、私は次のテンプレート

results.mako

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

を持っていると言うと私は、パス== request.mobileで(「results.mako」)レンダリング真の呼び出しresults.makoはdesktop/results.makoに変換されます(results.makoはモバイル用に存在しないため)。results.makoは 'desktop/base.mako'から継承します(相対パスを使用するため) base.mako 'が存在します。これは、モバイルとモバイル/ベース.makoが存在するために使用する必要があります。

どのようにエレガントでこれを解決するためのアイデア(makoの内側にifsを避ける)?多分dir makeが何とかテンプレートを見つけたと思って変更することによって?

答えて

0

makoのTemplateLookupオブジェクトのget_templateメソッドをオーバーライドすることで問題を解決しました。

#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) 
関連する問題