【问题标题】:Pyramid Framework - Help with creating a view functionPyramid Framework - 帮助创建视图函数
【发布时间】:2011-03-12 13:32:11
【问题描述】:

我有以下视图代码:

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()

基本上,它检查表中是否存在页面。如果它做到了 根据路径名渲染模板,或者如果没有这样的 template 它只是呈现一个默认模板。

我要做的下一部分是为我的 'blog' 页面,包含此页面的一些逻辑。

我尝试了以下示例,但它引发了未定义的错误 当我加载页面时:

@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

【问题讨论】:

  • 您的问题是什么?第一个视图函数的代码与第二个视图函数有什么关系?另外,你说它引发了一个未定义的错误,你能提供一个堆栈跟踪吗?什么是未定义的?
  • 嗯,我系统的第一部分是设计一些东西,根据它们的路径以及它们是否在数据库中来呈现页面。第二步是使用其中一个页面,并为该页面(在本例中为博客)创建一些逻辑。当我在第二个视图函数中传递参数然后在模板中调用它们时,我得到一个未定义的错误。我假设这可能与我创建的第一个视图函数有关,我已经在渲染该模板,然后我在第二个视图函数中再次渲染它。我希望这是有道理的。
  • 请添加你得到的错误的回溯。
  • 您好,我已经添加了上面错误的回溯。
  • 在您的 mako 模板的渲染过程中似乎发生了错误。看一下模板,如果你想不出来就发布。我仍然不确定代码的第一部分是否有问题。

标签: python pylons pyramid


【解决方案1】:

您最好继续解决这个问题,而不是开始另一个问题。根据此处和comment you provided in the other question 中的信息,正在发生以下情况:

查看:


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 传递了预期值。

因此,您遇到的错误是因为尝试在模板中呈现一个您从未放入模板上下文字典中的变量。

【讨论】:

  • 谢谢马克。这非常有帮助,并且可以清除问题。所以我的下一个问题是如何解决这个问题?对于提出如此原始的问题,我深表歉意。
  • @user614954 老实说,您实际上有几个问题,并且您正在更改我们的代码,因此很难跟踪代码的当前状态和问题是。
  • 是的,很抱歉我试图简化事情,但我想我让它有点混乱。参考我刚刚放的新代码,如何调用view2视图函数。正在使用 config.add_route... 调用 view1... 然后如何使 view2 中的变量在 view1 中可用?也许在函数之外使用全局变量?我希望我说得通。
  • 你应该把 {'args1/2'=args1/2} 改成 {'args1/2':args1/2} :)
【解决方案2】:

您的路由系统似乎存在配置问题,请尝试 将操作更改为此,如果它有效,可能是权限问题, 可以发布错误引发的堆栈跟踪吗?

def blog_view(request):
    one = 'Hello World'

    return render_to_response('myblog:templates/pages/my-blog.mak',
        {'one':one}, request=request)

【讨论】:

  • 嗨,我也尝试过,但它返回了同样的错误。我已经添加了回溯。
【解决方案3】:

取出第一部分代码,解决错误。

也许是因为 my-blog.mak 的 render_to_response 出现了两次?

在你的代码的第一部分

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) 

问题是我需要先渲染模板(如果它们存在或不存在并且在数据库表中)。

第二部分是为该特定模板创建一些单独的逻辑。

【讨论】:

  • 您应该在原始问题中添加详细信息,而不是作为可能的答案。只需在您添加的内容之前以粗体添加“编辑:”,让人们知道您添加了详细信息。
【解决方案4】:

就像 Mark Hildreth 在原始问题的 cmets 中所说的那样,错误似乎是在渲染模板期间发生的。您可能尝试对视图函数中不存在/未设置的变量执行某些操作。

在您的第一个示例中,您总是设置一个 page 变量,也许这是缺少的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 2019-06-12
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    相关资源
    最近更新 更多