2016-11-27 14 views
0

私はweb.pyで実行されている簡単なブログを作成しようとしていますが、それはうまく起動しますが(python bin/blog.py)、ウェブサイトに入るとテンプレートが見つかりません。私はパスが正しいことをかなり確信しています、私はそれの前に簡単なtodoリストをして、それは正常に動作します。どうしましたか?ここでテンプレートはありません

-blogpy/ 
    -bin/ 
    -blogwebpy/ 
    -docs/ 
    -templates/ 
    -tests/ 

(テンプレートがテンプレートに配置されている)のビンに配置されているblog.pyためのコードです:

はここに私のプロジェクトフォルダの外観です

import web 
import model 

### Url mappings 

urls = (
    '/', 'Index', 
    '/view/(\d+)', 'View', 
    '/new', 'New', 
    '/delete/(\d+)', 'Delete', 
    '/edit/(\d+)', 'Edit', 
) 


### Templates 
t_globals = { 
    'datestr': web.datestr 
} 
render = web.template.render('templates/', base='base', globals=t_globals) 


class Index: 

    def GET(self): 
     """ Show page """ 
     posts = model.get_posts() 
     return render.index(posts) 


class View: 

    def GET(self, id): 
     """ View single post """ 
     post = model.get_post(int(id)) 
     return render.view(post) 


class New: 

    form = web.form.Form(
     web.form.Textbox('title', web.form.notnull, 
      size=30, 
      description="Post title:"), 
     web.form.Textarea('content', web.form.notnull, 
      rows=30, cols=80, 
      description="Post content:"), 
     web.form.Button('Post entry'), 
    ) 

    def GET(self): 
     form = self.form() 
     return render.new(form) 

    def POST(self): 
     form = self.form() 
     if not form.validates(): 
      return render.new(form) 
     model.new_post(form.d.title, form.d.content) 
     raise web.seeother('/') 


class Delete: 

    def POST(self, id): 
     model.del_post(int(id)) 
     raise web.seeother('/') 


class Edit: 

    def GET(self, id): 
     post = model.get_post(int(id)) 
     form = New.form() 
     form.fill(post) 
     return render.edit(post, form) 


    def POST(self, id): 
     form = New.form() 
     post = model.get_post(int(id)) 
     if not form.validates(): 
      return render.edit(post, form) 
     model.update_post(int(id), form.d.title, form.d.content) 
     raise web.seeother('/') 


app = web.application(urls, globals()) 

if __name__ == '__main__': 
    app.run() 

答えて

1

指定されているように、renderを探していますtemplatesのディレクトリに対して、現在の作業ディレクトリ、すなわちプログラムを実行しようとしているディレクトリからの相対パスです。それを修正するために

いくつかの異なる方法:

  1. blogpyディレクトリから実行します。

    python bin/blog.py 
    

    これは正しくblogpy/templatesにテンプレートディレクトリを見つけます。

  2. binディレクトリから実行しますが、render../templatesにあります。これを行うには、テンプレートのサブディレクトリの場所を指定するコードを少し変更する必要があります。 (これはあなたの例として私が提案するものです)。

  3. binディレクトリから実行しますが、binディレクトリの下にするtemplatesディレクトリを移動します。これは奇妙に見えるかもしれませんが、単純な解決策を探しているなら、それには何も問題はありません。

  4. 完全に指定されたパス名を使用してください。最終的に、これはあなたがしなければならないことですが、あなたの例にとっては残酷です。あなたは確実にかかわらず、コードが呼び出されるか(などの静的コンテンツのため、多分、暗号化キー、)すべてのサブディレクトリを見つけることができるでしょう

    === repositories.py === 
    import os 
    _dir_name = os.path.dirname(__file__) or os.getcwd() 
    templates = os.path.normpath(os.path.join(_dir_name, "../templates")) 
    

    :あなたは次のようにブロックを持つ将来の時間を節約できます。

関連する問題