Python3.10下bottle cork搭配MongoDB认证登录报500错误
问题描述
在Python 2.7环境中使用bottle cork作为认证组件、搭配MongoDB时认证功能可正常运行,切换至Python 3.10环境后认证功能失效。
登录接口实现代码如下:
@bottle.post('/login') def login(): """Authenticate users""" username = post_get('username') password = post_get('password') aaa.login(username, password, success_redirect='/management/stats/today', fail_redirect='/login?failure')
使用正确账号密码执行登录操作时,服务返回500内部服务器错误。
错误信息
对应错误日志关键栈如下:
[2022-06-09 09:45:29 +0500] [224454] [DEBUG] POST /login <h1>Critical error while processing request: /login</h1>[2022-06-09 09:45:29 +0500] [224454] [ERROR] Error handling request /login Traceback (most recent call last): File "/opt/app/bin/bottle.py", line 966, in wsgi start_response(response._status_line, response.headerlist) File "/opt/app/lib/python3.10/site-packages/beaker/middleware.py", line 150, in session_start_response session.persist() File "/opt/app/lib/python3.10/site-packages/beaker/session.py", line 875, in persist self._session().save() File "/opt/app/lib/python3.10/site-packages/beaker/session.py", line 723, in save self._create_cookie() File "/opt/app/lib/python3.10/site-packages/beaker/session.py", line 737, in _create_cookie val = self._encrypt_data() File "/opt/app/lib/python3.10/site-packages/beaker/session.py", line 379, in _encrypt_data return nonce + b64encode(self.crypto_module.aesEncrypt(data, encrypt_key)) File "/opt/app/lib/python3.10/site-packages/beaker/crypto/pycrypto.py", line 22, in aesEncrypt counter=Counter.new(128, initial_value=0)) File "/opt/app/lib/python3.10/site-packages/Crypto/Util/Counter.py", line 109, in new initval = _encode(initial_value, nbytes, little_endian) File "/opt/app/lib/python3.10/site-packages/Crypto/Util/Counter.py", line 118, in _encode n = long(n) NameError: name 'long' is not defined
最终抛出异常为NameError: name 'long' is not defined。
根因定位
这是典型的Python 2/3版本不兼容问题:
- Python 2中存在独立的
long长整型类型,支持通过long()方法做类型转换; - Python 3中彻底移除了
long类型,所有整数统一为int类型,直接调用long()会触发名称不存在的错误。
当前环境安装的pycrypto库版本过旧,是仅适配Python 2的版本,会话组件beaker依赖pycrypto做cookie加密,在执行AES加密初始化计数器的环节触发了上述不兼容错误,直接中断登录流程,和bottle、cork、MongoDB本身的逻辑无关。
修复方案
按优先级从高到低可选择以下方案:
- 优先替换老旧加密依赖:卸载已经停止维护的pycrypto,安装其兼容Python 3的活跃维护分支pycryptodome,执行命令:
该库完全兼容pycrypto的原有API,绝大多数场景下不需要修改业务代码即可直接修复问题。pip uninstall -y pycrypto pip install pycryptodome - 升级beaker到最新稳定版:旧版本beaker的加密模块默认绑定pycrypto,未做Python 3适配,执行
pip install --upgrade beaker可同步更新兼容逻辑,适配Python 3环境的依赖调用。 - 临时应急修复(仅用于测试环境,不推荐生产使用):如果暂时无法升级依赖,可直接修改报错的第三方库文件,打开
/opt/app/lib/python3.10/site-packages/Crypto/Util/Counter.py,定位到第118行,将n = long(n)修改为n = int(n)即可临时恢复功能。注意该修改会在后续依赖升级时被覆盖,存在维护风险。
内容的提问来源于stack exchange,提问作者Shabbir
相关产品推荐
相关产品推荐

