支持Django的nginx http-push-stream模块
项目描述
django-nginx-push-stream
Django支持库,用于Nginx Push Stream Module。
快速介绍
Nginx Push Stream Module 是一个可扩展的Nginx模块,提供发布/订阅功能。
您可以通过以下方式安装包含它的Nginx二进制文件
在Ubuntu上通过非官方PPA,
$ sudo add-apt-repository ppa:dotz/nginx-with-push-stream-module $ sudo apt-get update $ sudo apt-get install nginx
在macOS上通过Homebrew 和 homebrew-nginx tap,
$ brew tap denji/nginx $ brew install nginx-full --with-push-stream-module --with-auth-req
可能还有更多(请帮助我改进此文档,谢谢)。
对于与 Docker 的开发,克隆此存储库并输入 docker-compose up。此命令将构建包含Nginx和 Nginx Push Stream Module 的Docker镜像并启动它。默认情况下,Docker容器的80端口映射到本地机器的9080端口(有关详细信息,请参阅 docker-compose.yml)
此包,django-nginx-push-stream,旨在释放Nginx Push Stream Module在Django应用中的潜力。
有各种方法可以实现Web浏览器中的实时推送通知的目标。这种方法是众多方法之一。它的优点包括无需运行单独的web服务器来处理websockets,并且可以使用与网页其他部分相同的地址/端口进行实时连接。
此模块是Django的一个非常薄的代码和配置层。它的创建更多是为了澄清、记录和整理一般性事物,而不是因为通过Nginx Push Stream Module发送推送消息很困难。实际上并不难。
设计
django-nginx-push-stream由以下部分组成
conf/settings.py中的配置设置
core.py模块中的调用
在auth.py中定义的一个小的auth视图,它可以决定用户是否有权订阅频道
还有一个示例nginx容器(docker/default 和 docker/Dockerfile-nginx)
还有一个可以运行的示例项目(test_project)
django-nginx-push-stream描述了如何订阅以及如何向Django的匿名用户、已登录会话以及所有授权(已登录)会话发送推送通知
匿名用户
已登录会话
所有授权(已登录)会话
提供了一个非常简单的示例项目。您可以扩展其功能以适应特定的目的。将提供一个项目,该项目扩展了基本功能,以作为单独的模块提供图形通知、进度对话框等。
启动示例基础设施
在根目录中输入docker-compose up -d 运行docker服务器。
$ docker-compose up Starting django-nginx-push-stream_appserver_1 ... done Starting django-nginx-push-stream_webserver_1 ... done Attaching to django-nginx-push-stream_appserver_1, django-nginx-push-stream_webserver_1 appserver_1 | [uwsgi-static] added mapping for /static => /app/test_project/staticroot [... lots of text...]
转到http://127.0.0.1:9080/查看应用程序的实际运行情况。它是一个简单的聊天应用程序。输入任何消息,按ENTER。它将向所有订阅者广播消息。您可以使用除了网络浏览器以外的其他方法进行订阅(见下文)。
详细信息
如何向nginx pubsub队列发送消息
$ cd test_project
$ python manage.py publish_message -q __all__ -d '{"message": ["Foobar"]}'
这将向名为__all__的队列发送一条简短的消息,该队列应包括网站的所有用户,无论是否已登录。
监听消息
您可以在上述步骤中监听消息。假设您已使用docker-compose
通过浏览器:在您的网络浏览器中打开http://127.0.0.1:9080以查看示例应用程序的实际运行情况。
通过curl
$ curl -s -v --no-buffer 'http://localhost:9080/sub/my-app__all__'
-
$ pip install websocket-client
然后
from websocket import create_connection ws = create_connection("ws://localhost:9080/ws/my-app__all__") print("Listening...") result = ws.recv() print("Received '%s'" % result) ws.close()
如您所知,URL中的__all__字符串部分是队列的名称。
my-app是一个前缀,可以通过更改NGINX_PUSH_STREAM_PUB_PREFIX进行配置。
curl(1)? 那么,我为什么需要Django应用呢?
此包使得向基于Django的网站中的特定会话或所有用户发送信息变得更加容易
向所有用户发送消息。
向特定的Django会话发送消息:浏览器通过基于会话id的名称(如test_project中所示)订阅频道
向所有已登录用户发送消息:让已登录用户订阅已登录用户的队列
为您的服务器渲染的每个网页提供一个UUID,并通过django-template-uuid发送消息仅到该页面(尚未在示例中显示,接受补丁!)
安全性
任何人都可以使用默认配置订阅队列。因此,恶意攻击者可以订阅并读取用户的私人信息。如何避免这种情况?Nginx文档中有一个关于基于子请求结果的认证的部分。
默认示例配置还包括在nginx中设置auth_request,使其内部询问Django应用程序,给定用户是否有足够的凭证订阅队列。
WebSocket与SSE
Nginx Push Stream Module支持通过WebSocket和EventSource (SSE)发送消息。您可以在StackOverflow上阅读有关这两种不同方法的精彩评论。
0.0.1
首次公开发布
项目详情
django_nginx_push_stream-0.0.1-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7d69128eb07520e5ac6e11f3ab2ca074e9d88c82ba31a8cc77e336293438866b |
|
MD5 | b2acd26c0ac88edb0ea6182d7238d5cb |
|
BLAKE2b-256 | 69d910a9c212af4d6466806caba452c42251400962de19bf4c818a6e3a6ca093 |