我正在尝试连接到 Azure Redis 服务器以用作 celery 队列。我可以从本地开发人员那里很好地连接到它。当我尝试通过 ssh 启动 celery Worker 时,代理 URL 会删除密码末尾的“=”,从而给出无效密码错误。
但是,从 Flask 应用程序运行的 celery 实例工作正常 - 我只是没有工作人员来完成任务。
我已经多次尝试重新生成 key ,看看是否得到了不以“=”结尾的 key 。
我打印连接字符串,并在本地开发中得到:
rediss://:{mykey[-3]}50=@{mysit}.redis.cache.windows.net:6380/
在 Azure 应用服务上我得到:
rediss://:{mykey[-2]}50@{mysit}.redis.cache.windows.net:6380/
@ 之前缺少“=”。我已经四次检查应用程序设置中的 key 是否正确。
该代码与本地开发代码相同,可以按预期工作。
我将加载字符串的代码更改为
f"rediss://:{os.environ.get('REDIS_KEY')}=@$mysite$.redis.cache.windows.net:6380/0"
这解决了 celery Worker 的问题,但它导致实际的 Web 应用程序因密码错误而失败。无论如何,这似乎是一个阴暗且难以维护的修复。
对连接字符串进行硬编码可以解决这两个问题,但显然不是一个理想的解决方案。
出于某种原因,当我尝试从命令行运行命令时,Azure 应用程序服务会从环境变量中删除尾随的“=”,而不是从 Flask 应用程序看到的变量中删除。从环境变量中读取代码并使用“printenv”从 ssh 打印也会显示“=”在加载虚拟环境和未加载虚拟环境时都丢失。
如何将正确的字符串放入环境中以便启动工作程序?
最佳答案
实际上,可以看到 key 的长度是固定的44个字符。所以我的想法是在环境中设置一个带有附加固定长度字符(如 AAA)尾部的 key ,然后通过截取前 44 个字符来获取它。
例如,设置 REDIS_KEY=QfWOl8KFGuD7Q3PG1rvsD4igwLT5ZxTyIbhvO8TvpX0=AAA
,然后在 Python 中获取它。
import os
key = os.environ.get('REDIS_KEY')[:44]
# 'QfWOl8KFGuD7Q3PG1rvsD4igwLT5ZxTyIbhvO8TvpX0='
希望有帮助。
关于python - Azure 环境变量从键中删除最后一个字符 ('=' ),在连接到 Redis 的 Azure 缓存时给出 'invalid password',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56549725/