- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我面临着在 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))
在 Azure 中:
使用 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()
输出:
azure :
设置 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} ")
关于python - 使用受 SSL 保护的 Redis 配置 Django channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76276353/
我对 Python-Django 和 web 开发还很陌生,我被困在这个使用 POST 创建新资源的特殊问题上。 我正在为 REST API 使用 Django REST 框架,我正在尝试创建一个新资
我已经使用 Django-storages 成功地将 Word 文档存储到 S3。 class Document(TitleSlugDescriptionModel, TimeStampedModel
我有 2 个关于模型代理的问题, 如何从模型对象创建代理对象? 如何从模型查询集创建代理查询集? 例如,假设我们定义了: from django.contrib.auth.models import
我想编写一个直接执行 HTTP 请求的单元测试(而不是使用 django.test.client.Client)。 如果您好奇为什么 - 那是因为我想测试我从 Django 应用程序公开的 Thrif
我为我的个人网站启动了一个 django 项目来学习 django。到目前为止,我已经将我的开发环境设置为我需要的一切,并遵循 this很棒的教程来创建一些基本的数据结构和模板。现在我想开始使用我之前
我已经阅读了很多关于如何在使用 Django 注册时添加额外字段的信息,例如 here 、 here 和 here 。代码片段是: forms.py(来自注册应用程序) class Registrat
我正在编写小型社交应用程序。功能之一是在网站标题中写入用户名。因此,例如,如果我登录并且我的名字是Oleg(用户名),那么我应该看到: Hello, Oleg | Click to edit prof
我有一个使用 Django 和 Django Rest 框架开发的应用程序。我想将 django-reversion 功能添加到我的应用程序中。 我已经尝试过http://django-reversi
我有一个简单的 HTML 表单,我没有使用 Django 表单,但现在我想添加一个选择。 选择最容易创建为 Django ChoiceField (与通过循环等手动创建选择相反),但是,如果没有在 D
我不明白为什么人们以两种方式编写外键,这样做的目的是什么?它们是相同还是不同? 我注意到有些人这样写: author = models.ForeignKey(Author, on_delete=mod
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
这对于 Django 1.2 仍然有效吗? Custom Filter in Django Admin on Django 1.3 or below 我已经尝试过,但管理类中的 list_filter
问题在于,当 django-compressor 编译为 .js 文件的 CoffeeScript 文件中引用 {{ STATIC_URL }} 时,它无法正确加载。 在我的 django 模板中,我
我正在尝试将一些字段从一个 django 模型移动到一个新模型。假设我有一个书籍模型: class Book(models.Model): title = models.CharField(max
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
目前我正在寻找在 Django 中实现访问控制。我已经阅读了有关内置权限的内容,但它并不关心每个对象的基础。例如,我想要“只有创建者可以删除自己的项目”之类的权限。所以我读到了 django-guar
嗨,我正在将我的 Django 模型的一个字段的值设置为其他模型的另一个字段的值。这个值应该是动态变化的。 这是我的第一个模型 class MainModel(AbstractBaseUser, Pe
我正在尝试为我的模型创建一个编辑表单。我没有使用模型表单,因为根据模型类型,用户可以使用不同的表单。 (例如,其中一个表单有 Tinymce 小部件,而另一个没有。) 有没有什么方法可以使用模型设置表
Django 模板中的搜索字段 如何在类似于此图像的 Django 模板中创建搜索字段 http://asciicasts.com/system/photos/1204/original/E354I0
根据 Django documentation ,如果 Django 安装激活了 AuthenticationMiddleware,HttpRequest 对象有一个“user”属性代表当前登录的用户
我是一名优秀的程序员,十分优秀!