不确定是否有更好的方法可以做到这一点,但我的网站上有一个注册页面,用户注册后我添加了他们的初始数据(__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'))
有什么想法吗?
答案 0 :(得分:2)
这可能不会直接回答你的问题,但“你做错了”(tm):)
在将User对象添加到会话后,您不需要重新查询它 - 更重要的是,尝试从数据库中查询它而不先执行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'))
此外,您需要检查所有执行分支(即except:子句,request.params中“if'form.submitted'的else:子句”返回有意义的内容 - 您可能会收到异常,因为您的在某些情况下,view函数返回None。实际上,这可能是发生了什么 - “user_data = DBSession.query(Users)”行引发异常,而except:part没有返回任何内容
答案 1 :(得分:2)
我在Pyramid项目中遇到同样的问题,而且与github上的评论相反,它与waitress
没有关系。
就我而言,只有在我使用重定向(Error: Broken Pipe
,HTTPFound
等)时才会出现HTTPMovedPermanently
的问题。由于您的函数也使用HTTPFound
,我认为问题是一样的。
至少对我而言,此错误是由pyramid_debugtoolbar
扩展引起的。原因可能是每当我们的观点像
return HTTPFound(foo)
它在标题中发出302并且Connection:Close
。 pyramid_debugtoolbar
扩展名为响应添加了一个冗长的主体。客户端看到标题,关闭连接并且不接受冗长的调试主体。因此Broken Pipe
消息(这是Wireshark所展示的Atleast)。
尝试停用应用pyramid_debugtoolbar
中的.ini
,这可能会有所帮助。