我正在使用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网络服务器,打印出我发送的请求中的所有数据。通过将action属性更改为该服务器的地址,我能够检查表单传递的POST变量。事实证明它甚至可能不是HTML形式的错,而是CherryPy的。
POST Variables: {'url': 'dfghdfgdf', 'loc': 'fghjdfg', 'name': 'dfghdfgdf', 'btc': '', 'bio': 'srffghmn+dfghdfgh'}
答案 0 :(得分:0)
问题是您正在为方法设置位置参数并在表单上发送另一个值。
我可以看到表单没有指定动作网址,因此它将使用当前的动作网址。我想你正在做这样的事情:
class Root:
@cherrypy.expose
def u(self, url='', mode='', *args, **post):
pass
在网址/u/SOMETHING
上提交表单时,SOMETHING
正在复制url
参数的含义,因为这是签名上的位置,也是作为关于表格提交的论点。