2012-07-09 41 views
4

不知道是否有更好的方法來做到這一點,但我有一個在我的網站註冊頁面,並在用戶註冊後,我添加他們的初始數據(東西在__init__數據模型),然後我開始添加一些其他信息在同一部分,這給我一個broken pipe錯誤。奇怪的代碼似乎工作,因爲我期待的條目是在數據庫中。我嘗試過在.flush()命令中移動,看看它是否有幫助,但看起來似乎沒有。爲什麼在將數據添加到數據庫時發生管道故障錯誤?

Traceback (most recent call last): 
    File "/Users/me/Dropbox/code/eclipseWorkSpace/website/pyramidwiki/lib/python2.7/site-packages/waitress-0.8.1-py2.7.egg/waitress/channel.py", line 134, in handle_write 
    flush() 
    File "/Users/me/Dropbox/code/eclipseWorkSpace/website/pyramidwiki/lib/python2.7/site-packages/waitress-0.8.1-py2.7.egg/waitress/channel.py", line 249, in _flush_some 
    num_sent = self.send(chunk) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/asyncore.py", line 365, in send 
    result = self.socket.send(data) 
error: [Errno 32] Broken pipe 

這裏是我的代碼:

if 'form.submitted' in request.params: 
    firstname = request.params['firstname'] 
    lastname = request.params['lastname'] 
    email = request.params['email'] 
    password = request.params['password'] 
    try: 
     new_user = Users(email, firstname, lastname, password) 
     DBSession.add(new_user) 
     #DBSession.flush() #commit so we get error if any 
     #add some other info 
     user_data = DBSession.query(Users).filter(Users.email==email).first() 
     user_data.join_date = datetime.datetime.now() 
     #create random number for verification url 
     user_data.vertified = id_generator(50) 

     DBSession.flush() #doesn't seem to make a difference where the flush is 
     return HTTPFound(location = request.route_url('new')) 

任何想法?

+2

斷開的管道通常與請求超時或客戶端關閉連接相關聯。 – 2012-07-09 15:41:16

+0

有沒有辦法找出它發生的地點/原因?這是在添加'user_data'變量並開始在初始添加用戶之後開始添加數據之後開始的。或者有更好的方法來實現它?在創建用戶之後,我想添加一些信息。 – Lostsoul 2012-07-09 17:04:06

+0

我有同樣的問題,但無法弄清楚是什麼原因造成的。你最終找到了解決方案嗎? – Bach 2012-12-03 06:02:00

回答

2

這可能不是回答你直接的問題,而是「你這樣做是完全錯誤的」(TM):)

你不需要你添加它來在會議結束後重新查詢用戶對象 - 更重要的是,在沒有執行session.flush()的情況下試圖從數據庫查詢它會首先導致錯誤,因爲數據庫中沒有記錄。我會做這樣的事情:

if 'form.submitted' in request.params: 
    firstname = request.params['firstname'] 
    lastname = request.params['lastname'] 
    email = request.params['email'] 
    password = request.params['password'] 
    try: 
     new_user = Users(email, firstname, lastname, password) 
     new_user.join_date = datetime.datetime.now() 
     new_user.verified = id_generator(50) 

     DBSession.add(new_user) 
     DBSession.flush() # should fail if user email is in the database 
     return HTTPFound(location = request.route_url('new')) 

此外,您還需要檢查執行的所有分支(即除外:子句,否則:的「在request.params如果‘form.submitted’」條款返回一些有意義的東西 - 你可能會得到異常,因爲你的視圖函數在某些情況下返回None。實際上,這可能是發生了什麼 - 「user_data = DBSession.query(Users)」行引發了一個異常,而except:part沒有返回任何東西

2

我也在我的金字塔項目上遇到同樣的問題,與github上的評論相反,它不是waitress

在我的情況下,只有我使用重定向(HTTPFound,HTTPMovedPermanently等)時,纔會出現Error: Broken Pipe的問題。由於你的功能也使用HTTPFound,我認爲問題是一樣的。

Atleast對我來說,這個錯誤是由於pyramid_debugtoolbar的擴展。其原因可能是,每當我們的觀點不一樣soemthing

return HTTPFound(foo)

它發出在頭302和Connection:Closepyramid_debugtoolbar擴展將冗長的主體添加到響應中。客戶端看到標題,關閉連接並且不接受冗長的調試主體。因此,Broken Pipe消息(Atleast是Wireshark顯示的)。

嘗試在應用的.ini中禁用pyramid_debugtoolbar,這可能會有所幫助。

相關問題