You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,执行命令:
    pip uninstall -y pycrypto
    pip install pycryptodome
    
    该库完全兼容pycrypto的原有API,绝大多数场景下不需要修改业务代码即可直接修复问题。
  • 升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 09:24:34