麻烦问一下各位, 下面这段代码中报错如下
代码部分
app.route('/deleteaccount/<int:account_id>', methods=['POST'])
@login_required
def delete_account(account_id) :
authed = session.get('authed')
if not authed :
return redirect(url_for('login'))
form1 = DeleteAccountForm()
account = User.query.get_or_404(account_id)
if form1.submit.data and form1.validate() :
if current_user.id != account.id :
abort(401)
flash('Usurpation')
logout_user()
db.session.delete(account)
db.session.commit()
session.pop('authed')
flash('Disposed')
else :
abort(400)
return redirect(url_for('login'))
@db.event.listens_for(User, 'after_delete', named=True)
def edit_account(**kwargs) :
target = kwargs['target']
for username in [target.username] :
if username is not None :
dis = Photo.query.filter_by(user_name=username).delete()
db.session.begin(subtransactions=True)
db.session.commit()
报错
File "/usr/local/lib/python3.10/dist-packages/flask_socketio/__init__.py", line 43, in __call__
return super(_SocketIOMiddleware, self).__call__(environ,
File "/usr/local/lib/python3.10/dist-packages/engineio/middleware.py", line 74, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 2193, in wsgi_app
response = self.handle_exception(e)
File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "/usr/local/lib/python3.10/dist-packages/flask_login/utils.py", line 290, in decorated_view
return current_app.ensure_sync(func)(*args, **kwargs)
File "/var/www/html/albumy2/app.py", line 626, in delete_account
if current_user.id != account.id :
abort(401)
flash('Usurpation')
logout_user()
db.session.delete(account)
db.session.commit()
session.pop('authed')
flash('Disposed')
else :
abort(400)
return redirect(url_for('login'))
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/scoping.py", line 553, in commit
return self._proxied.commit()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 1906, in commit
trans.commit(_to_root=True)
File "<string>", line 2, in commit
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/state_changes.py", line 137, in _go
ret_value = fn(self, *arg, **kw)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 1221, in commit
self._prepare_impl()
File "<string>", line 2, in _prepare_impl
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/state_changes.py", line 137, in _go
ret_value = fn(self, *arg, **kw)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 1196, in _prepare_impl
self.session.flush()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 4154, in flush
self._flush(objects)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 4290, in _flush
with util.safe_reraise():
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/util/langhelpers.py", line 147, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 4251, in _flush
flush_context.execute()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/unitofwork.py", line 467, in execute
rec.execute(self)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/unitofwork.py", line 681, in execute
util.preloaded.orm_persistence.delete_obj(
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/persistence.py", line 206, in delete_obj
mapper.dispatch.after_delete(mapper, connection, state)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/event/attr.py", line 487, in __call__
fn(*args, **kw)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/events.py", line 887, in wrap
fn(*arg, **kw)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/event/attr.py", line 174, in wrap_kw
return fn(**argdict)
File "/var/www/html/albumy2/app.py", line 870, in edit_account
db.session.begin(subtransactions=True)
TypeError: scoped_session.begin() got an unexpected keyword argument 'subtransactions'
但当我删去db.session.begin(subtransactions=True) 时 报错如下
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 4251, in _flush
flush_context.execute()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/unitofwork.py", line 467, in execute
rec.execute(self)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/unitofwork.py", line 681, in execute
util.preloaded.orm_persistence.delete_obj(
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/persistence.py", line 206, in delete_obj
mapper.dispatch.after_delete(mapper, connection, state)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/event/attr.py", line 487, in __call__
fn(*args, **kw)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/events.py", line 887, in wrap
fn(*arg, **kw)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/event/attr.py", line 174, in wrap_kw
return fn(**argdict)
File "/var/www/html/albumy2/app.py", line 871, in edit_account
db.session.commit()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/scoping.py", line 553, in commit
return self._proxied.commit()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 1906, in commit
trans.commit(_to_root=True)
File "<string>", line 2, in commit
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/state_changes.py", line 137, in _go
ret_value = fn(self, *arg, **kw)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 1239, in commit
self._parent.commit(_to_root=True)
File "<string>", line 2, in commit
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/state_changes.py", line 121, in _go
raise sa_exc.IllegalStateChangeError(
During handling of the above exception, another exception occurred:
File "/usr/local/lib/python3.10/dist-packages/flask_socketio/__init__.py", line 43, in __call__
return super(_SocketIOMiddleware, self).__call__(environ,
File "/usr/local/lib/python3.10/dist-packages/engineio/middleware.py", line 74, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 2193, in wsgi_app
response = self.handle_exception(e)
File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 2190, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1486, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1484, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.10/dist-packages/flask/app.py", line 1469, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "/usr/local/lib/python3.10/dist-packages/flask_login/utils.py", line 290, in decorated_view
return current_app.ensure_sync(func)(*args, **kwargs)
File "/var/www/html/albumy2/app.py", line 626, in delete_account
db.session.commit()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/scoping.py", line 553, in commit
return self._proxied.commit()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 1906, in commit
trans.commit(_to_root=True)
File "<string>", line 2, in commit
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/state_changes.py", line 137, in _go
ret_value = fn(self, *arg, **kw)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 1221, in commit
self._prepare_impl()
File "<string>", line 2, in _prepare_impl
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/state_changes.py", line 137, in _go
ret_value = fn(self, *arg, **kw)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 1196, in _prepare_impl
self.session.flush()
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 4154, in flush
self._flush(objects)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 4290, in _flush
with util.safe_reraise():
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/util/langhelpers.py", line 151, in __exit__
raise value.with_traceback(traceback)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 4291, in _flush
transaction.rollback(_capture_exception=True)
File "<string>", line 2, in rollback
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/state_changes.py", line 103, in _go
self._raise_for_prerequisite_state(fn.__name__, current_state)
File "/usr/local/lib/python3.10/dist-packages/sqlalchemy/orm/session.py", line 921, in _raise_for_prerequisite_state
raise sa_exc.ResourceClosedError("This transaction is closed")
sqlalchemy.exc.ResourceClosedError: This transaction is closed
抱歉,您并没有提供具体的错误信息,我无法确定您所遇到的报错是什么。不过,可以根据代码片段中的问题点来做一些可能需要解决的问题。
首先,在 delete_account 视图函数中,存在如下问题:
1.abort(400) 的使用不当:在表单验证失败时,应该返回错误信息而不是直接 Abort 请求。
2.在删除账户后,使用 logout_user() 和 session.pop('authed') 使得当前用户退出登录,但是这样做会导致一个问题,即在额外发送一个请求登录同一帐户时,会看到旧用户数据闪现一下然后被踢出。因此,建议使用 Flask-Login 提供的 logout_user() 函数来注销当前用户,并删除 authed 会话变量。
3.在删除账户之前,应该判断当前用户是否拥有操作权限,否则应该返回 401 错误。
其次,在 edit_account 监听器函数中,存在如下问题:
1.使用 db.session.begin(subtransactions=True) 开始子事务后,却未使用 db.session.commit() 结束子事务。如果多次调用 begin() 而未结束子事务,则会导致数据库锁定并最终崩溃。因此,建议在每次调用 begin() 之后调用 commit() 来结束子事务。
2.没有使用 with db.session.no_autoflush: 上下文管理器,将会导致出现一些危险的行为,如在写入数据库之前调用 db.session.flush()。因此,建议使用 with db.session.no_autoflush: 来确保代码安全。
希望这些信息能够对您有所帮助。如果您需要进一步的帮助,请您提供更多详细信息。