发生异常时,do_POST会执行多次

时间:2018-10-25 23:33:35

标签: python sqlite http sqlalchemy

作为在线课程的一部分,我正在使用Python构建一个简单的Web应用程序,目前,我正在尝试实现一些CRUD操作。该应用程序是一个简单的餐厅菜单服务器,可连接到SQLite数据库(使用SQLAlchemy)并对其执行一些CRUD操作。

应用程序的一部分提供了一个简单的html表单来修改餐厅名称(使用POST方法),在实施此操作时,错误导致服务器返回空响应,并且在查看日志时,没有发出POST请求,并且do_POST正文被执行了3次。

这是do_POST方法的正文。

def do_POST(self):
    try:
        if self.path.endswith(....):
            (.....)

        if self.path.endswith('/edit'):
            print('inside post ' + self.path) # debugging message
            ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
            if ctype == 'multipart/form-data':
                fields = cgi.parse_multipart(self.rfile, pdict)
                messageContent = fields.get('newRestaurantName')


            r_id = self.path.split('/')[2]                
            # if I remove .one() from the instruction bellow, the error goes away.
            # 'session' is an SQLAlchemy DBSession defined above.
            restaurant = session.query(Restaurant).get(r_id).one()             

            restaurant.name = messageContent[0]
            session.add(restaurant)
            session.commit()

            self.send_response(301)
            self.send_header('Content-type', 'text/html')
            self.send_header('Location', '/restaurants')
            self.end_headers()
            return
    except:
        (....)

这是尝试执行POST方法时的服务器输出。

Server running at port 8080
10.0.2.2 - - [25/Oct/2018 23:17:27] "GET /restaurants HTTP/1.1" 200 -
10.0.2.2 - - [25/Oct/2018 23:17:30] "GET /restaurants/1/edit HTTP/1.1" 200 -
inside post /restaurants/1/edit
inside post /restaurants/1/edit
inside post /restaurants/1/edit

从查询表达式中删除.one()后,该操作将毫无问题地执行。

我想了解的是为什么我要打印三遍调试消息!而我只执行了一个(不成功的)POST请求?即使有异常,do_POST函数也不应该只执行一次吗?

(服务器正在Vagrant VM内部运行)

谢谢!

0 个答案:

没有答案