python
  • shell
  • pyramid
  • 2015-01-21 166 views 1 likes 
    1

    我是Python的初学者,我必须创建一个接受来自from的用户输入的金字塔项目,并执行将结果返回给用户的简单操作。 这是我的views.pyrequest.params中的关键错误

    from pyramid.response import Response 
    from pyramid.view import view_config 
    @view_config(route_name="home",renderer='templates/ui.pt') 
    def my_view(request): 
        myvar=request.params['command'] 
        return Response(myvar) 
    

    这是我的模板/ ui.pt(不包括所有初始的html,head标签)

    <form action="my_view" method="POST"><input type="text" name="command"/> 
    <input type="submit" name="go" value="submit"/></form> 
    </html> 
    

    当我运行它,我得到这个错误 KeyError异常:'命令'

    请帮忙。

    回答

    3

    如果您的请求中没有传递任何参数(如果您访问该页面时未发布任何参数或将查询字符串添加到参数字符串 - 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 
    
    +0

    我得到你解释的第一部分。当我尝试将param添加到我的查询字符串时,它工作正常。但是当我在我的文本框中输入内容并点击提交时,404表示找不到/ my_view。此外,它没有工作,当我尝试没有追加到我的查询参数。你能告诉我如何通过文本框提交的东西,并打印下来,而不追加我的参数在查询字符串? – Tania 2015-01-21 06:48:49

    +0

    我没有注意到你的表单动作。该操作告诉浏览器将表单数据发布到哪个网址。你希望它发布到自己,所以完全摆脱这个动作。

    clockwatcher 2015-01-21 06:56:18

    +0

    我尝试删除操作属性,但仍然没有得到我在提交时在文本框中键入的内容。它只是清除自己。此外,我没有得到这个页面,除非我明确地在查询字符串中的命令参数。 – Tania 2015-01-21 07:22:32

    0

    最好的地方,适合初学者开始学习金字塔是由它的文档,特别是Quick Tutorial

    “快速教程”逐步介绍了通向Web表单的主题。

    +0

    嗨史蒂夫!谢谢我通过这个教程,它非常有用。 – Tania 2015-01-21 09:30:29

    相关问题