python - Azure 环境变量从键中删除最后一个字符 ('=' ),在连接到 Redis 的 Azure 缓存时给出 'invalid password'

标签 python azure redis

我正在尝试连接到 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/

相关文章:

javascript - 如何在 svg 上粘贴 svg

python - 计算数据框不同列中值的频率

python - 在 python nltk.word_tokenize 中保留尾随标点符号

python - 如何在不下载的情况下读取谷歌云存储中的视频?使用视频网址

azure - 自动关闭Azure功能

python - Python-RQ 在 redis 服务器上使用什么键?

azure - 如何保护 Azure 中的目标目录免遭部署

azure - 每次管道运行时,Pip 验证任务都会为 PIP_INDEX_URL/PIP_EXTRA_INDEX_URL 创建新值,从而防止 docker 重用缓存层

redis - 如何将扫描限制为特定的一组键

azure - 使用 ServiceStack 加密 Azure 上的 Redis 消息