gpt4 book ai didi

python - 使用受 SSL 保护的 Redis 配置 Django channel

转载 作者:行者123 更新时间:2023-12-03 03:23:19 29 4
gpt4 key购买 nike

我面临着在 Azure 中配置 Django 应用程序的困难。我有一个基本场景,使用 WebSocket 跟踪文件上传进度。对于 WebSocket,我使用 Django Channels 和 Redis Channels。在我的架构中,Redis 组件还用于另一个执行,并且使用 SSL/TLS 进行保护;因此监听端口 6380。

在我的应用程序中,我对 Redis (Celery) 和 Django Channel(使用 Redis Channel)进行了以下配置

settings.py


# PORT 6379 for NON-SSL Connection and 6380 for SSL Connection
_broker_url = f'rediss://:{os.getenv("REDIS_PASS", "")}@{os.getenv("REDIS_HOST", "localhost")}:{os.getenv("REDIS_PORT", "6379")}'
CELERY_BROKER_URL = _broker_url
CELERY_RESULT_BACKEND = _broker_url
CELERY_BROKER_USE_SSL = {'ssl_cert_reqs': ssl.CERT_REQUIRED}
CELERY_REDIS_BACKEND_USE_SSL = {'ssl_cert_reqs': ssl.CERT_REQUIRED}

CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [(os.getenv("REDIS_HOST", "127.0.0.1"), int(os.getenv("REDIS_PORT", 6379)))],
},
},
}

在我的前端,我有一个常规文件上传表单,可以打开安全的 websocket:


function createSocket(task_id) {
const socket = new WebSocket(
`wss://${config.backendUrl}/ws/tasks/${task_id}/`
);

socket.onmessage = function (e) {
const data = JSON.parse(e.data);
let status = data["message"]["status"];
console.log(data);
if (status === "SUCCESS") {
api.get(targetUrl).then((value) => {
handleUploadReload(value.data["files"]);
});
this.close();
} else if (status === "FAILURE") {
setError(data["message"]["error"]);
this.close();
}
};

socket.onclose = function (e) {
console.log("Task socket closed");
};

socket.onerror = (err) => {
console.log(err);
};

socket.onopen = (event) => {
console.log(event);
};

return socket;
}

现在,当我尝试上传文档并打开 WebSocket 时,文件已上传,但 channel 通信失败并出现以下错误:

File "/tmp/lib/python3.10/site-packages/redis/asyncio/connection.py", line 852, in read_response
raise ConnectionError(redis.exceptions.ConnectionError: Error while reading from psm-redis.redis.cache.windows.net:6380 : (104, 'Connection reset by peer')

我尝试使用以下配置重新配置settings.py(我在 GitHub 讨论中找到了这些配置,但它们似乎已经过时了):


ssl_context = ssl.SSLContext()
ssl_context.check_hostname = False

redis_ssl_host = {
'address': _broker_url,
'ssl_context': ssl_context
}

CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": (redis_ssl_host,)
},
},
}


有人知道如何使用 rediss 部署 channel (更准确地说,如何为 Django channel 设置 SSL)?

最佳答案

I have referred this MSDOC for azure radis connection, Azure Radis with python and web socket git .Thank you @Vuka951.

result = r.set("Message",  "Hello!, Python is compatible with the cache!")

print("SET Message returned : " + str(result))

enter image description here

在 Azure 中:

enter image description here

使用 WebSocket:


connected = set()

async def server(websocket, path):

connected.add(websocket)
try:
async for message in websocket:
r.set("Message", message)
for conn in connected:
if conn != websocket:
cached_message = r.get("Message").decode("utf-8")
await conn.send(f'Got a new MSG FOR YOU: {cached_message}')
finally:

connected.remove(websocket)

myHostname = "yourhostname.redis.cache.windows.net"
myPassword = "primarykey"


r = redis.StrictRedis(host=myHostname, port=6380, password=myPassword, ssl=True)


result = r.ping()
print("Ping returned: " + str(result))

result = r.set("Message", "Hello!, Python is compatible with the cache!")
print("SET Message returned: " + str(result))

result = r.get("Message")
print("GET Message returned: " + result.decode("utf-8"))


start_server = websockets.serve(server, "localhost", 5000)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

输出:

enter image description here

azure :

enter image description here

设置 key :

import  redis
redis_host = 'yourhostname.redis.cache.windows.net'

redis_port = 6380

redis_password = 'yourprimarykey'
key = 'myKey'

value = '866 13.90.202.154:13000'
redis_client = redis.StrictRedis(host=redis_host, port=redis_port, password=redis_password, ssl=True)
redis_client.set(key, value)

print(f"Successfully set the value of '{key}' in Azure Redis Cache.")

print(f"the vaule is {value} ")

enter image description here

enter image description here

关于python - 使用受 SSL 保护的 Redis 配置 Django channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76276353/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com