TypeError 发生在 Nginx 上,但不会发生在 Flask Server 上



我在python的烧瓶后面运行一个api,连接通过nginx和uwsgi处理。

一些 api 路由使用 pycrypto,但在端口 80 上使用 nginx 时,在 pycrypto 源中的这一行上出现错误。

完整的回溯是:

Traceback (most recent call last):
  File "/home/ubuntu/test/testvenv/local/lib/python2.7/site-packages/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/ubuntu/test/testvenv/local/lib/python2.7/site-packages/flask/app.py", line 1477, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/ubuntu/test/testvenv/local/lib/python2.7/site-packages/flask_cors/extension.py", line 188, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/ubuntu/test/testvenv/local/lib/python2.7/site-packages/flask/app.py", line 1381, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/ubuntu/test/testvenv/local/lib/python2.7/site-packages/flask/app.py", line 1475, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/ubuntu/test/testvenv/local/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "./application.py", line 113, in new_user
    decrypted_json = crypt.decrypt_json(encrypted)
  File "./crypto_module/crypt.py", line 201, in decrypt_json
    decrypted_text = cryptor.decrypt(data_to_decrypt, PASSWORD)
  File "./crypto_module/crypt.py", line 112, in decrypt
    encryption_key = self._pbkdf2(password, encryption_salt, iterations=iterations)
  File "./crypto_module/crypt.py", line 184, in _pbkdf2
    return KDF.PBKDF2(password, salt, dkLen=key_length, count=iterations, prf=lambda p, s: hmac.new(p, s, hashlib.sha256).digest())
  File "/home/ubuntu/test/testvenv/local/lib/python2.7/site-packages/Crypto/Protocol/KDF.py", line 110, in PBKDF2
    password = tobytes(password)
  File "/home/ubuntu/test/testvenv/local/lib/python2.7/site-packages/Crypto/Util/py3compat.py", line 85, in tobytes
    return ''.join(s)
TypeError

由于某种原因,从未特别提及类型错误。在默认端口 5000 上使用基本 python application.py 命令运行服务器时,也不会显示此错误。当让nginx和uwsgi处理连接时,我得到上面显示的内部服务器错误。不太确定发生了什么。所有其他非加密路由都很好。

更新:使用以下命令在 uwsgi 中运行一级服务器也可以工作。Nginx仍然没有:

uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi 

更新2:现在得到另一个更具描述性的TypeError,但我仍然认为在请求中发送的数据与使用nginx处理的方式/正确处理方式与uwsgi或烧瓶不同。

...
  File "./crypto_module/crypt.py", line 202, in <lambda>
    return KDF.PBKDF2(password, salt, dkLen=key_length, count=iterations, prf=lambda p, s: hmac.new(p, s, hashlib.sha256).digest())
  File "/usr/lib/python2.7/hmac.py", line 133, in new
    return HMAC(key, msg, digestmod)
  File "/usr/lib/python2.7/hmac.py", line 68, in __init__
    if len(key) > blocksize:
TypeError: object of type 'NoneType' has no len()

我还应该指出,crypt.py是RNCryptor-python

让它工作了。

在/etc/nginx/sites-enabled/test 中

uwsgi_pass unix:/...;

应该是

uwsgi_pass unix:///...;

原始错误也源于加密文件中使用的密码。密码是从系统的环境变量中检索的。我后来发现 Nginx 没有任何本机使用环境变量的功能,但这里解释了解决方法。

相关内容

  • 没有找到相关文章

最新更新