如果您的请求中没有传递任何参数(如果您访问该页面时未发布任何参数或将查询字符串添加到参数字符串 - http://mypage/my_view?command=something),那么request.params MultiDict将不会有一个名为'命令'的键,它就是你的错误来自的地方。你可以明确地检查“命令”是在你的request.params:
myvar = None
if 'command' in request.params:
myvar = request.params['command']
或者你也可以(更常见)使用字典的get方法提供一个默认值:
myvar = request.params.get('command', None)
此外,由于您为视图定义了模板,通常,您的返回值将为该模板提供上下文。但是,您的代码实际上并未使用该模板,而是直接返回响应。你通常不会那样做。你会做更多的事情是这样的:
@view_config(route_name="home",renderer='templates/ui.pt')
def my_view(request):
myvar=request.params.get('command',None)
return {'myvar': myvar }
,然后在模板你引用它得到了传递的对象:
<!doctype html>
<html>
<body>
<form method="POST"><input type="text" name="command"/>
<input type="submit" name="go" value="submit"/></form>
<div tal:condition="myvar">
You entered <tal:block tal:content="myvar"></tal:block>
</div>
</body>
</html>
这里是一个从无到有的演练,以得到上面的工作:
安装金字塔:
pip install pyramid
创建金字塔项目:
pcreate -t starter myproject
设置环境,为您的项目:
from pyramid.view import view_config
@view_config(route_name="home",renderer='templates/ui.pt')
def my_view(request):
myvar=request.params.get('command',None)
return {'myvar': myvar }
添加的myproject /模板/ ui.pt文件:
cd myproject
python setup.py develop
与更换的myproject/views.py
<!doctype html>
<html>
<body>
<form method="POST"><input type="text" name="command"/>
<input type="submit" name="go" value="submit"/></form>
<div tal:condition="myvar">
You entered <tal:block tal:content="myvar"></tal:block>
</div>
</body>
</html>
启动您的应用程序:
pserve --reload development.ini
访问您的网站的金字塔:
http://localhost:6543
我得到你解释的第一部分。当我尝试将param添加到我的查询字符串时,它工作正常。但是当我在我的文本框中输入内容并点击提交时,404表示找不到/ my_view。此外,它没有工作,当我尝试没有追加到我的查询参数。你能告诉我如何通过文本框提交的东西,并打印下来,而不追加我的参数在查询字符串? – Tania 2015-01-21 06:48:49
我没有注意到你的表单动作。该操作告诉浏览器将表单数据发布到哪个网址。你希望它发布到自己,所以完全摆脱这个动作。
我尝试删除操作属性,但仍然没有得到我在提交时在文本框中键入的内容。它只是清除自己。此外,我没有得到这个页面,除非我明确地在查询字符串中的命令参数。 – Tania 2015-01-21 07:22:32