2015-07-21 77 views
0

我正在使用CherryPy在Python中處理Web應用程序。我在頁面上有一個表單,用於編輯用戶配置文件,因此當您加載頁面時,默認值會被填充。這使用Jinja2進行模板化,因此無論您是編輯還是創建配置文件,都會將變量傳遞給頁面以告知它。CherryPy - 400錯誤,來自HTML表單的參數的多個值

<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字段這樣做?即使我從模板中刪除了值標籤,它也會執行此操作。我找不到任何可能導致此問題的東西 - 表單中有一個網址字段,爲什麼它認爲有2個?它似乎在提交時發生,因爲在彈出錯誤之前,CherryPy服務器中甚至沒有運行。

更新:我寫了一個快速的Python Web服務器,打印出我發送請求中的所有數據。通過將action屬性更改爲該服務器的地址,我可以檢查表單傳遞的POST變量。原來,它甚至可能不是HTML格式的錯,而是CherryPy的。

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

處理該請求的方法簽名是什麼? – cyraxjoe

+0

你是什麼意思?如果它是

上的enc-type屬性,那就是「multipart/form-data」。但是有沒有不重要。 –

+0

我的意思是'def METHOD(self,a,b,* c,** d)' – cyraxjoe

回答

0

問題是您正在設置方法的位置參數並在窗體上發送另一個值。

對於我可以看到的表單沒有指定動作url,所以它會使用當前的。我猜你正在做的事情是這樣的:

class Root: 

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

而且在URL提交表單同時:/u/SOMETHING,該SOMETHING被複制url參數的含義,因爲是在簽名的位置,也被作爲傳遞關於表單提交的爭論。

+0

Oh I看,我不認爲這會導致衝突。謝謝您的幫助! –