2016-11-27 45 views
0

我試圖讓web.py上運行一個簡單的博客,它啓動罰款(python bin/blog.py),但是當我輸入網站它說它無法找到模板。我很確定這條道路是正確的,我在此之前做了一個簡單的待辦事項清單,它工作正常。怎麼了?沒有模板命名索引

,這裏是我的項目文件夾的樣子:

-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目錄執行,但移動templates目錄是bin目錄下。這看起來很奇怪,但如果你正在尋找一個簡單的解決方案,那沒有什麼問題。

  4. 使用完全指定的路徑名​​稱。最終,這就是你應該做的,儘管這對你的例子來說是過度的。你可以節省時間,有像塊的未來:

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

    你就可以找到所有的子目錄(靜態內容,也許加密密鑰等)的代碼被可靠地不管如何被調用。