【问题标题】:CherryPy - 400 error, Multiple values for parameters from HTML formCherryPy - 400 错误,来自 HTML 表单的参数的多个值
【发布时间】:2015-07-21 01:06:41
【问题描述】:

我正在使用 CherryPy 在 Python 中开发一个 Web 应用程序。我在页面上有一个用于编辑用户配置文件的表单,因此在加载页面时会填写默认值。这使用 Jinja2 进行模板化,因此无论您是在编辑还是创建配置文件,都会向页面传递一个变量来告诉它。

<form method="post">
    <span class="left">
        <span id="prof-art" class="prof-art" style="background-image: url( {{ '/assets/profile-art/'+(prof.prof_id|string)+'.jpg' if prof.prof_id else '/static/img/new-user.jpg' }} );"></span>
        <span class="prof-name"><input type="text" name="name" placeholder="Name" autocomplete="off" {{ 'value="'+prof.name+'"' if prof.name }}></span>
        <span class="prof-loc"><input type="text" name="loc" placeholder="Location" autocomplete="off" {{ 'value="'+prof.location+'"' if prof.location }}></span>
        <span class="prof-url">example.com/u/<input type="text" name="url" autocomplete="off" {{ 'value="'+prof.url+'"' if prof.url }}></span>
        <span class="prof-bio"><textarea name="bio" placeholder="Add a description of yourself here. Markdown is supported." autocomplete="off">{{ prof.bio or '' }}</textarea></span>
        <span class="prof-img"><input type="file" name="img" id="imgInp"></span>
    </span>
    <button type="submit" class="blue-btn a prof-save">
        {% if editing %}<i class="fa fa-wrench"></i> Update
        {% else %}<i class="fa fa-plus-square"></i> Create
    {% endif %}</button>
</form>

提交后,代码将处理您提供的数据并保存或创建数据,具体取决于您是在编辑还是创建个人资料。

然而,这些都不重要,因为 HTTPError 发生在我的代码被处理之前。

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/cherrypy/_cprequest.py", line 670, in respond
    response.body = self.handler()
  File "/Library/Python/2.7/site-packages/cherrypy/lib/encoding.py", line 217, in __call__
    self.body = self.oldhandler(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/cherrypy/_cpdispatch.py", line 67, in __call__
    raise sys.exc_info()[1]
HTTPError: (400, 'Multiple values for parameters: url')

这是怎么回事?为什么只是 URL 字段这样做?即使我从模板中删除值标签,它也会这样做。我找不到任何可能导致此问题的原因 - 表单中有一个 url 字段,那么为什么它认为有 2 个?似乎它必须在提交时发生,因为我的 CherryPy 服务器中甚至在错误弹出之前都没有运行。

更新:我编写了一个快速的 Python Web 服务器,可以打印出我发送的请求中的所有数据。通过将 action 属性更改为该服务器的地址,我能够检查表单传递的 POST 变量。事实证明,这甚至可能不是 HTML 表单的错,而是 CherryPy 的错。

POST Variables: {'url': 'dfghdfgdf', 'loc': 'fghjdfg', 'name': 'dfghdfgdf', 'btc': '', 'bio': 'srffghmn+dfghdfgh'}

【问题讨论】:

  • 处理该请求的方法签名是什么?
  • 你这是什么意思?如果它是
    上的 enc-type 属性,那就是“multipart/form-data”。但是有没有没有关系。
  • 我的意思是def METHOD(self, a, b, *c, **d)
  • def u(self, url='', mode='', *args, **post)

标签: python jinja2 cherrypy forms http-post


【解决方案1】:

问题是您在方法上设置位置参数并在表单上发送另一个值。

我可以看到表单没有指定操作 url,所以它将使用当前的。我猜你正在做这样的事情:

class Root:

    @cherrypy.expose
    def u(self, url='', mode='', *args, **post):
         pass

并在 URL 上提交表单:/u/SOMETHINGSOMETHING 复制了 url 参数的含义,因为它在签名上是位置的,并且也作为表单提交的参数传递。

【讨论】:

  • 哦,我明白了,我不认为这会导致冲突。感谢您的帮助!
猜你喜欢
  • 2013-08-13
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 2012-09-09
  • 1970-01-01
相关资源
最近更新 更多