3

不确定是否有更好的方法可以做到这一点,但我的网站上有一个注册页面,在用户注册后,我添加了他们的初始数据(__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'))

有任何想法吗?

4

2 回答 2

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: 子句、“if 'form.submitted' in request.params”的 else: 子句是否返回有意义的内容 - 您可能会收到异常,因为您的视图函数返回在某些情况下没有。实际上,这可能是正在发生的事情——“user_data = DBSession.query(Users)”行引发了一个异常,而 except: 部分没有返回任何内容

于 2012-07-09T21:40:54.293 回答
2

我在我的 Pyramid 项目中也遇到了同样的问题,与 github 上的评论相反,它不是waitress.

就我而言,问题Error: Broken Pipe仅在我使用重定向(等)时HTTPFound发生HTTPMovedPermanently。由于您的功能也使用HTTPFound,我认为问题是一样的。

至少对我来说,这个错误是由于pyramid_debugtoolbar扩展造成的。原因可能是每当我们的视图做类似的事情时

return HTTPFound(foo)

它在标头中发送一个 302 和一个Connection:Close. 该pyramid_debugtoolbar扩展为响应添加了一个冗长的正文。客户端在看到标头时关闭连接并且不接受冗长的调试正文。因此Broken Pipe消息(至少这是 Wireshark 显示的)。

尝试pyramid_debugtoolbar在您的应用程序中禁用.ini,它可能会有所帮助。

于 2013-06-03T15:00:22.170 回答