作为在线课程的一部分,我正在使用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内部运行)
谢谢!