没有名为索引的模板

No template named index

我正在尝试在 web.py 上创建一个简单的博客 运行,它启动正常(python bin/blog.py)但是当我进入网站时它说它找不到模板。我很确定路径是正确的,之前我做了一个简单的待办事项列表并且它工作正常。怎么了?

这是我的项目文件夹:

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

这是位于 bin 中的 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()

按照指定,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"))
    

    无论代码如何调用,您都可以可靠地找到所有子目录(用于静态内容,可能是加密密钥等)。