没有名为索引的模板
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
目录,即,从您尝试执行程序的位置开始。
几种不同的修复方法:
从 blogpy
目录执行:
python bin/blog.py
这将在 blogpy/templates
中正确找到模板目录。
从 bin
目录执行,但 render
在 ../templates
中查找。这将需要对指定模板子目录位置的代码进行小的更改。 (这就是我为您的示例所建议的)。
从bin
目录执行,但将templates
目录移动到bin目录下。这可能看起来很奇怪,但如果您正在寻找一个简单的解决方案,那没有错。
使用完全指定的路径名。最终,这是你应该做的,尽管这对你的例子来说有点过分了。您将来可以节省时间,例如:
=== repositories.py ===
import os
_dir_name = os.path.dirname(__file__) or os.getcwd()
templates = os.path.normpath(os.path.join(_dir_name, "../templates"))
无论代码如何调用,您都可以可靠地找到所有子目录(用于静态内容,可能是加密密钥等)。
我正在尝试在 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
目录,即,从您尝试执行程序的位置开始。
几种不同的修复方法:
从
blogpy
目录执行:python bin/blog.py
这将在
blogpy/templates
中正确找到模板目录。从
bin
目录执行,但render
在../templates
中查找。这将需要对指定模板子目录位置的代码进行小的更改。 (这就是我为您的示例所建议的)。从
bin
目录执行,但将templates
目录移动到bin目录下。这可能看起来很奇怪,但如果您正在寻找一个简单的解决方案,那没有错。使用完全指定的路径名。最终,这是你应该做的,尽管这对你的例子来说有点过分了。您将来可以节省时间,例如:
=== repositories.py === import os _dir_name = os.path.dirname(__file__) or os.getcwd() templates = os.path.normpath(os.path.join(_dir_name, "../templates"))
无论代码如何调用,您都可以可靠地找到所有子目录(用于静态内容,可能是加密密钥等)。