跳转到主要内容

支持Django的nginx http-push-stream模块

项目描述

django-nginx-push-stream

Django支持库,用于Nginx Push Stream Module

https://travis-ci.org/mpasternak/django-nginx-push-stream.svg?branch=develop

快速介绍

  1. Nginx Push Stream Module 是一个可扩展的Nginx模块,提供发布/订阅功能。

  2. 您可以通过以下方式安装包含它的Nginx二进制文件

    • 在Ubuntu上通过非官方PPA

      $ sudo add-apt-repository ppa:dotz/nginx-with-push-stream-module
      $ sudo apt-get update
      $ sudo apt-get install nginx
    • 在macOS上通过Homebrewhomebrew-nginx tap

      $ brew tap denji/nginx
      $ brew install nginx-full --with-push-stream-module --with-auth-req
    • 可能还有更多(请帮助我改进此文档,谢谢)。

  3. 对于与 Docker 的开发,克隆此存储库并输入 docker-compose up。此命令将构建包含Nginx和 Nginx Push Stream Module 的Docker镜像并启动它。默认情况下,Docker容器的80端口映射到本地机器的9080端口(有关详细信息,请参阅 docker-compose.yml

  4. 此包,django-nginx-push-stream,旨在释放Nginx Push Stream Module在Django应用中的潜力。

  5. 有各种方法可以实现Web浏览器中的实时推送通知的目标。这种方法是众多方法之一。它的优点包括无需运行单独的web服务器来处理websockets,并且可以使用与网页其他部分相同的地址/端口进行实时连接。

  6. 此模块是Django的一个非常薄的代码和配置层。它的创建更多是为了澄清、记录和整理一般性事物,而不是因为通过Nginx Push Stream Module发送推送消息很困难。实际上并不难。

设计

django-nginx-push-stream由以下部分组成

  • conf/settings.py中的配置设置

  • core.py模块中的调用

  • 在auth.py中定义的一个小的auth视图,它可以决定用户是否有权订阅频道

  • 还有一个示例nginx容器(docker/defaultdocker/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__'
  • 通过websocket-client

    $ 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 (20.1 kB 查看哈希值)

上传时间 Python 3

由以下组织支持