Pyramid框架 - 帮助创建视图函数
我有以下的代码用于视图:
def pages_view(request):
path = request.path.split('/')[1]
dbsession = DBSession()
page = dbsession.query(PagesTable).from_statement(
'SELECT * FROM pages WHERE path=:page_path').params(page_path=path).first()
pages_dir = os.getcwd() + '/myblog/templates/pages/'
if page:
if path == '':
return render_to_response('myblog:templates/pages/home.mak',
{'page':page}, request=request)
elif os.path.isfile(pages_dir + path + '.mak'):
return render_to_response('myblog:templates/pages/%s.mak'%path,
{'page':page}, request=request)
else:
return render_to_response('myblog:templates/pages/index.mak',
{'page':page}, request=request)
raise NotFound()
基本上,这段代码是用来检查某个页面在表格中是否存在。如果存在,它会根据路径名称渲染一个模板;如果没有找到这样的模板,它就会渲染一个默认的模板。
接下来我想做的是为我的“博客”页面创建一个单独的视图函数,并为这个页面添加一些逻辑。
我尝试了以下的例子,但在加载页面时出现了未定义的错误:
@view_config(renderer='myblog:templates/pages/my-blog.mak')
def blog_view(request):
one = 'Hello World'
return {'one':one}
我为这样基础的问题感到抱歉。任何提供的见解都将非常感谢。
以下是错误追踪信息:
URL: http://127.0.0.1:6543/my-blog/
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/WebError-0.10.3-py2.6.egg/weberror/evalexception.py', line 431 in respond
app_iter = self.application(environ, detect_start_response)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/repoze.tm2-1.0b1-py2.6.egg/repoze/tm/__init__.py', line 23 in __call__
result = self.application(environ, save_status_and_headers)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/pyramid-1.0-py2.6.egg/pyramid/router.py', line 158 in __call__
response = view_callable(context, request)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/pyramid-1.0-py2.6.egg/pyramid/config.py', line 2916 in _requestonly_view
response = view(request)
File '/Users/Awais/virtualenv/MyBlog/myblog/views.py', line 25 in pages_view
{'page':page}, request=request)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/pyramid-1.0-py2.6.egg/pyramid/renderers.py', line 111 in render_to_response
return helper.render_to_response(value, None, request=request)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/pyramid-1.0-py2.6.egg/pyramid/renderers.py', line 322 in render_to_response
result = self.render(value, system_values, request=request)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/pyramid-1.0-py2.6.egg/pyramid/renderers.py', line 318 in render
result = renderer(value, system_values)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/pyramid-1.0-py2.6.egg/pyramid/mako_templating.py', line 131 in __call__
result = template.render_unicode(**system)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/Mako-0.3.6-py2.6.egg/mako/template.py', line 292 in render_unicode
as_unicode=True)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/Mako-0.3.6-py2.6.egg/mako/runtime.py', line 575 in _render
**_kwargs_for_callable(callable_, data))
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/Mako-0.3.6-py2.6.egg/mako/runtime.py', line 607 in _render_context
_exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/Mako-0.3.6-py2.6.egg/mako/runtime.py', line 633 in _exec_template
callable_(context, *args, **kwargs)
File 'myblog_templates_pages____base_mak', line 27 in render_body
File 'myblog_templates_pages_my_blog_mak', line 34 in render_body
File '/Users/Awais/virtualenv/lib/python2.6/site-packages/Mako-0.3.6-py2.6.egg/mako/runtime.py', line 181 in __str__
raise NameError("Undefined")
NameError: Undefined
4 个回答
把代码的第一部分去掉,就解决了这个错误。
可能是因为我的博客模板(my-blog.mak)被渲染了两次?
在代码的第一部分,你有:
return render_to_response('myblog:templates/pages/%s.mak'%path,
这段代码会渲染my-blog.mak,如果这个文件存在的话。
然后我第二次做的是:
def blog_view(request):
variable = 'hello world'
return render_to_respomse('myblog:templates/pages/my-blog.mak', {'variable':variable}, request=request)
问题是我需要先检查一下这些模板是否存在,并且它们是否在数据库表里。
第二部分是为这个特定的模板创建一些独立的逻辑。
正如Mark Hildreth在你原问题的评论中提到的,错误似乎是在你模板渲染的时候发生的。你可能在尝试使用一个不存在或者没有设置的变量。
在你的第一个例子中,你总是设置了一个page
变量,也许就是这个变量缺失了。
你应该先好好处理这个问题,而不是去问另一个问题。根据这里的信息和你在另一个问题中的评论,发生了以下情况:
视图:
def view1(request)
args1 = 'a string'
return render_to_response('page.mak',{'args1':args1}, request=request)
def view2(request)
args2 = 'a string 2'
return render_to_response('page.mak',{'args2':args2}, request=request)
在你的'page.mak'模板文件中,有以下内容...
${args2}
当调用view1时,render_to_response会尝试渲染page.mak模板。字典{'args1'=args1}
被用作上下文。当mako看到${args2}
时,它会在上下文字典中查找args2
。但是在view1中构建的上下文字典里并没有args2
,所以就会出错。而在view2中渲染同样的页面就没问题,因为view2正确地传递了带有键args2
的期望值。
所以,你遇到的错误是因为你试图在模板中渲染一个你从未放入上下文字典的变量。