2017-08-11 29 views
0

さて、私は少し勉強してweb.pyで私のサイトを複製することができましたが、私はどのように私が特定の場所でそれをやっているのが好きではありません。テンプレート内の関数を正しく呼び出す方法は?

1)毎回Mainを呼び出さずにテンプレートを呼び出せるようにしたい。

2)レイアウトから関数を呼び出せるようにしたい。

上記の助言があれば、事前にお気軽にお問い合わせください。

以下は、何が起こっているのかを知るためのコードの短縮版です。私が何か重要なものを掲示しなかったかどうか教えてください。

code.py:

import web 
import Universal 
import Navigation 
import Content 
import Versions 


urls = (
    '/favicon.ico', 'icon', 
    '/', 'index', 
    '/Section1/index', 'Section1', 
    '/Section2/index', 'Section2', 
    '/Section3/index', 'Section3' 
) 

app = web.application(urls, globals(), autoreload=True) 
render = web.template.render('templates/')#, base='Layout') 

static = web.template.render('static/') 

Main = web.template.render('templates/') 
Section1 = web.template.render('templates/Section1/') 
Section2 = web.template.render('templates/Section2/') 
Section3 = web.template.render('templates/Section3/') 

class static: 
    def GET(self): 
     return static() 

#class icon: 
# def GET(self): 
#  return static.favicon() 

class index: 
    def GET(self): 
     vPage = '0' 
     vLevel = '0' 
     vSection = '0' 
     vHead = Universal.getHead(vSection) 
     vHeader = Universal.getHeader() 
     vNavBar = Universal.getNavBar() 
     vNavigation = Navigation.getNavigation(vLevel) 
     vContent = Content.getContent(vLevel) 
     vVersions = Versions.getVersions(vLevel) 
     vFooter = Universal.getFooter() 
     return Main.Layout(vHead, vHeader, vNavBar, vNavigation, vContent, vVersions, vFooter) 

class Section1: 
    def GET(self): 
     vPage = '0' 
     vLevel = '1' 
     vSection = '1' 
     vHead = Universal.getHead(vSection) 
     vHeader = Universal.getHeader() 
     vNavBar = Universal.getNavBar() 
     vNavigation = Navigation.getNavigation(vLevel) 
     vContent = Content.getContent(vLevel) 
     vVersions = Versions.getVersions(vLevel) 
     vFooter = Universal.getFooter() 
     return Main.Section1.Layout(vHead, vHeader, vNavBar, vNavigation, vContent, vVersions, vFooter) 

class Section2: 
    def GET(self): 
     vPage = '0' 
     vLevel = '2' 
     vSection = '2' 
     vHead = Universal.getHead(vSection) 
     vHeader = Universal.getHeader() 
     vNavBar = Universal.getNavBar() 
     vNavigation = Navigation.getNavigation(vLevel) 
     vContent = Content.getContent(vLevel) 
     vVersions = Versions.getVersions(vLevel) 
     vFooter = Universal.getFooter() 
     return Main.Section2.Layout(vHead, vHeader, vNavBar, vNavigation, vContent, vVersions, vFooter) 

class Section3: 
    def GET(self): 
     vPage = '0' 
     vLevel = '3' 
     vSection = '3' 
     vHead = Universal.getHead(vSection) 
     vHeader = Universal.getHeader() 
     vNavBar = Universal.getNavBar() 
     vNavigation = Navigation.getNavigation(vLevel) 
     vContent = Content.getContent(vLevel) 
     vVersions = Versions.getVersions(vLevel) 
     vFooter = Universal.getFooter() 
     #return render.Layout(vHead, vHeader, vNavBar, vNavigation, vContent, vVersions, vFooter) 
     return Main.Section3.Layout(vHead, vHeader, vNavBar, vNavigation, vContent, vVersions, vFooter) 

テンプレート/ Layout.html:

$def with (vHead, vHeader, vNavBar, vNavigation, vContent, vVersions, vFooter) 

<html> 
<head> 
    $:vHead 
</head> 
<body id="idBody"> 
    <table id="idTableMain"> 
     <tr id="idHeaderRow"> 
      <td id="idHeaderRowCenter" colspan="3"> 
       $:vHeader 
      </td> 
     </tr> 
     <tr id="idNavigationRow"> 
      <td id="idNavigationBar" colspan="3"> 
       $:vNavBar 
      </td> 
     </tr>    
     <tr id="idCenterRow"> 
      <td id="idCenterRowLeft"> 
       <h4> 
        Navigation 
       </h4> 
       $:vNavigation 
      </td> 
      <td id="idCenterRowMain"> 
       $:vContent 
      </td> 
      <td id="idCenterRowRight"> 
       <h4> 
        Information 
       </h4> 
       This was written with Python 2.7 and web.py.<br><br> 
       Other versions of this page are here:<br> 
       $:vVersions 
      </td> 
     </tr> 
     <tr id="idFooterRow"> 
      <td id="idFooterMain" colspan="3"> 
       $:vFooter 
      </td> 
     </tr> 
    </table> 
</body> 
</html> 

Universal.py

def getHead(vSection): 
    vResult = '<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">' 
    vResult += '<link href=' + getCSS(vSection) + ' rel=\"stylesheet\" type="text/css">' 
    return vResult 

def getCSS(vSection): 
    if vSection == '1': 
     vResult = '/static/Section1/Section1.css' 
    elif vSection == '2': 
     vResult = '/static/Section2/Section2.css' 
    elif vSection == '3': 
     vResult = '/static/Section3/Section3.css' 
    else: 
     vResult = '/static/Main.css' 
    return vResult 

def getHeader(): 
    vResult = '<img id=\"idLogo\" src=' + getLogo() + '>' 
    return vResult 
def getNavBar(): 
    vResult = '<a class=\'navBar\' href=\'/index\'>Home</a>' 
    vResult += '<a class=\'navBar\' href=\'/Section1/index\'>Web Programming</a>' 
    vResult += '<a class=\'navBar\' href=\'/Section2/index\'>Private Projects</a>' 
    vResult += '<a class=\'navBar\' href=\'/Section3/index\'>Downloadable Projects</a>' 
    return vResult 

答えて

0

web.pyテンプレートは、機能を識別するためにホワイトリストを使用しますこれはテンプレート内で実行できます。 dictを作成してレンダラーに渡すことでこれを追加できます。たとえば、次のようにあなたが行うことができますLayout.htmlあなたの中その後

common_globals = {'getHeader': Universal.getHeader, 
        'getCSS': Universal.getCSS, 
        'getHead': Universal.getHead, 
        'getNavBar': Universal.getNavBar} 
Main = web.template.render('templates/') 
Section1 = web.template.render('templates/Section1/', globals=common_globals) 
Section2 = web.template.render('templates/Section2/', globals=common_globals) 
Section3 = web.template.render('templates/Section3/', globals=common_globals) 

、:

$def with(page, level, section) 
<html> 
<head> 
    $:getHead(section) 
</head> 
etc.... 

...そしてクラス2節のためのcode.pyであなたの呼び出しは次のようになります。実際に

class Section2(object): 
    def GET(self): 
     return Main.Section2.Layout(page=0, level=2, section=2) 

( 、私はあなたがメインに電話する必要はないと思うだけでレンダリングするとreturn Section2.Layout(0, 2, 2)

他のセクションについても同様の操作を繰り返し、レイアウトを更新して関数を直接呼び出すと機能します。

+0

ありがとうございます@pbuck!私はdictのためのものの断片を見つけ出しましたが、それが私が必要としていたものであることをまとめてまとめることはできませんでした。私ができる時にそれを試すのを楽しみにしています。 – Kamurai

+0

Main vs Section2の問題については、どうやってそれをやろうとしていたのかを示唆していましたが、「ここにはレイアウトは存在しません」というようなものがあり続けていました。異なるテンプレート。 私はあなたの最初の提案の後に再試行します。 :) – Kamurai

+0

'Main'と' Section1'などで何をしようとしているのか分かりません。もしそれらが異なるページだけなら、たぶん単一のレンダラー( 'Main')を使うべきでしょう。そのレンダラーはテンプレートページ( 'Layout')を呼び出し、毎回異なるパラメータ値を提供します。それらが異なるページスタイル( 'ホームページ'、 'ヘルプページ'など)を表す場合、異なるテンプレートページ( 'home.html'、 'help.html'など)で同じレンダラー( 'Main')を使用できます。各ページインスタンス(つまり、Main.help(title = "ログインヘルプ"、description = ...)、Main.help( 'Privacy'、 '...')に異なるパラメータ値を提供する。 – pbuck

0

クレジット・リアルはこの上で@pbuckに行きます。問題の最初の部分は、辞書を使用して、それを一致させるために、すべてを更新することで解決される。code.pyで

辞書:code.py

class index: 
    def GET(self): 
     vPage = '0' 
     vLevel = '0' 
     vSection = '0' 
     return Main.Layout(vPage, vLevel, vSection) 

内のページへ

参照をテンプレート/ Layout.html $デフ(v15ページ、vLevel、vSection)と

<html> 
<head> 
    $:getHead(vSection) 
</head> 
<body id="idBody"> 
    <table id="idTableMain"> 
     <tr id="idHeaderRow"> 
      <td id="idHeaderRowCenter" colspan="3"> 
       $:getHeader() 
      </td> 
     </tr> 
     <tr id="idNavigationRow"> 
      <td id="idNavigationBar" colspan="3"> 
       $:getNavBar() 
      </td> 
     </tr>    
     <tr id="idCenterRow"> 
      <td id="idCenterRowLeft"> 
       <h4> 
        Navigation 
       </h4> 
       $:getNavigation(vLevel) 
      </td> 
      <td id="idCenterRowMain"> 
       $:getContent(vLevel+'_'+vPage+'P') 
      </td> 
      <td id="idCenterRowRight"> 
       <h4> 
        Information 
       </h4> 
       This was written with Python 2.7 and web.py.<br><br> 
       Other versions of this page are here:<br> 
       $:getVersions(vLevel+'_'+vPage+'P') 
      </td> 
     </tr> 
     <tr id="idFooterRow"> 
      <td id="idFooterMain" colspan="3"> 
       $:getFooter() 
      </td> 
     </tr> 
    </table> 
</body> 
</html> 

Iそれは空想的ではないことを理解していますが、これは素晴らしい学習課題でした。レンダラーの問題だけが残っています。これは、Code.pyでの作業がどこで行われるかの詳細です。

おそらく別の質問として投稿します。

+0

それはあなたのために働いてうれしい!私の答えを「受け入れる」ように自由に感じてください。 – pbuck

関連する問題