伺服器-sent events for Django

django-eventstream的Python项目详细描述


#django eventstream

eventstream为django应用程序提供api端点,该应用程序可以将数据推送到连接的客户端。使用服务器发送事件协议(SSE)发送数据,在该协议中,数据通过一个永不终止的HTTP响应流传输。

例如,可以创建一个端点`/events/`,客户端可以使用GET请求连接到该端点:

``http
GET/events/http/1.1
host:api.example。com
接受:文本/事件流
```

/>数据:{"foo":"bar"}

事件:消息
数据:{"bar":"baz"}


````


功能:

*易于从浏览器或本机应用程序中使用。
*高度可靠。事件可以持久化到您的数据库中,以便客户端在断开连接时可以恢复。
*设置每个用户通道的权限。
*如果需要,可以向第三方公开的干净API协定。

channels 2](https://channels.readthedocs.io/en/latest/)(对于异步连接处理,需要python 3.5+)。
*与grip兼容的代理,如[pushpin](https://pushpin.org)或[fanout cloud](https://fanout.io)(可与任何python版本(包括2.x)配合使用)。

如果您使用的是Python3.5或更高版本,我们建议您使用通道设置项目,因为这将给您最大的灵活性,包括能够独立运行或使用"runserver"。为了获得高可用性或可伸缩性,您可以随时[添加图钉/扇形分叉](多个实例和可伸缩性)。


对于3.5之前的python版本,请参阅[无通道设置](无通道设置)。



pip install django eventstream
``

将"channels"和"django eventstream"应用程序添加到"设置"中。py`:

``py
已安装的"应用程序"=[

"channels",
"django eventstream",
]
``````

添加"gripmiddleware":

``py
``pyare=[
"django_grip.gripmiddleware",

]
````

通道引入了一个用于处理异步连接的完全独立的路由系统。路由是在"routing.py"文件中声明的,而不是在"url.py"文件中声明的,并且您声明了一个[asgi](https://channels.readthedocs.io/en/latest/asgi.html)应用程序,而不是(或另外)一个wsgi应用程序。

声明:

``py
from django.conf.url从频道导入url
。routing从频道导入urlrouter
。http从频道导入asgihandler
。auth import authmidlewarestack
import django_eventstream

urlpatterns=[
url(r'^events/',authmidlewarestack(
urlRouter(django_eventstream.routing.urlpatterns)
)、{channels':['test']})、
url(r'、asgihandler)、
]
````

然后,确保在项目目录(位于"settings.py"旁边)中有一个主"routing.py"文件,该文件从上一个目录路由到应用程序的"routing"模块美国步骤:

``py
从频道导入protocoltyperouter,urlrouter
导入你的应用程序。routing

'http:urlrouter(你的应用程序.routing.urlpatterns),
```

roject的"routing"模块:

``py
asgi_application='您的项目.routing.application'
```

>最后,在项目目录中创建一个"asgi.py"文件。它类似于您的"wsgi.py":

``py
"
asgi入口点。配置django,然后运行应用程序
defi在asgi_应用程序设置中。
"


import os
import django
from channels.routing import get_default_application

django.setup()
application=get_default_application()
````

有关一般设置频道的详细信息,请参阅[频道文档](http://channels.readthedocs.io/en/latest/tutorial/part_1.html集成频道库)。

如果运行"python manage.py runserver",客户机将能够连接到`/events/`端点并获取流。

要向客户机发送数据,请调用来自django椆event stream import send椆event的"send椆event":

"send椆event('test','message',{'text':'hello world})
```

第一个参数是要发送的通道,第二个参数是事件类型,第三个参数是事件数据。数据将使用"djangojsonencoder"进行json编码。

但是,在部署时不应使用"runserver",而应启动asgi服务器,如daphne,例如:

```sh
daphne your廑u项目。asgi:application
```


有关d的信息,请参阅[频道文档](https://channels.readthedocs.io/en/latest/deploying.html)部署。

作为[图钉](https://pushpin.org)或[扇出云](https://fanout.io))进入您的体系结构。

iss=your realm&;key=base64:your realm key'
```

>然后配置代理将流量转发到项目。例如,使用扇出云,将已部署项目的"主机:端口"设置为域的源服务器,并让客户端连接到域的域。


如果您的python版本不支持频道,这很有用。

首先,安装此模块:

``sh
pip install django eventstream
````

需要对"settings.py"进行一些更改。

添加"django\u eventstream"应用程序:

``py
=[

'django-eventstream'django-eventstream,
]
``````


`` grip middleware`:

`` py
`` py
``中间件=[
‘django-grip.gripmiddleware`,

`
````````
` `` django-gripm.gripmiddleware`,

>

`
``````````````````````;图钉l='http://localhost:5561'
````

```py
``扇出云
grip戋url='http://api.fanout.io/realm/your-realm?iss=your realm&key=base64:your realm key'
``

在"url.py"中添加端点:

```py
>从django.conf.url导入url,include
import django_eventstream

urlpatterns=[

url(r'^events/',include(django_eventstream.url),{channels':['测试']}),
]
```

就这样!客户端现在可以通过代理连接到`/events/`端点并获取流。

t是要发送的通道,第二个是事件类型,第三个是事件数据。数据将使用"djangojsonencoder"进行json编码。

NNEL并希望使用扇出云进行测试,我们建议使用[ngrok](https://ngrok.com/)注册一个路由到本地实例的公共主机。

为方便起见,此模块附带了一个django命令"runserver\u ngrok",其作用类似于"runserver",但它另外配置了yo将检测到的隧道用作源服务器的扇出云域。

这样做:

```
将ngrok tunnel 4f91f84e.ngrok.io设置为grip origin

在http://127.0.0.1:8000启动开发服务器/
使用control-c退出服务器。
````

请注意,更改可能需要一分钟左右的时间才能生效。

向您的域(例如`{realm id}.fanoutcdn.com`)发送的请求将被路由到您的本地实例。

为了获得可靠的传递,您需要启用事件存储。

首先,设置数据库表:

``sh
python manage.py migrate
````


年龄是你需要做的。启用存储后,事件将在发布前写入数据库,并持续24小时。如果客户端断开连接,中间代理关闭,或者您自己的服务器随时关闭或崩溃,甚至在发布过程中,流也会自动修复。

要按通道选择性地启用存储,请实现通道管理器并覆盖"是否可靠的通道"。

##在浏览器中接收包括前端的客户端库:

``html
<;script src={%static'django eventstream/eventsource.min.js'%}">;
<;script src={%static'django eventstream/重新连接eventsource.js'%}">;
```

监听数据:

```js
var es=new reconnectingeventsource('/events/');

console.log(e.data);
},false);

/……客户端落在后面,重新初始化…
},false);
```


def可以读取通道(self、user、channel):
如果通道.startswith(''u')和user为none,则需要验证前缀通道
返回false
返回true
`````

配置"设置.py"以使用它:

```py
eventstreamnelmanager_class='myapp.channelmanager.mychannelmanager'
````


每当权限更改时,调用'channel_permission_changed'。这将导致客户端在失去对通道的权限时断开连接。

``py
from django_eventstream import channel_permission_changed


channel_permission_changed(user,`u mychannel')
````

routes and channel selection

要使用路由上的django view关键字参数指定isten。或者,如果未指定关键字参数,则客户端可以通过在http请求中提供一个或多个"channel"查询参数来自行选择频道。

示例:

``py
m.url),{'channels':['foo']})

频道使用基于视图关键字的格式
url(r'^objects/(?p<;obj id>;\w+)/events/'、include(django_eventstream.url)、
{format-channels':['object-{obj_id}}}})


客户端使用路径组件选择单个通道
url(r'^events/(?p<;channel>;\w+/",include(django_eventstream.url))


ters以选择频道。

如果需要更高级的频道映射,请实现频道管理器并覆盖"为请求获取频道"。

nd"访问控制允许凭据",分别是"eventstream允许原始凭据"和"eventstream允许原始凭据"。

igin`只接受单个字符串值,不处理列表。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JPA标准从数组中选择枚举   javajavafx:操作系统dockbar中程序的标题(例如ubuntu19.10)   java int数组和双数组差分   java如何用字母表填充字符数组?   java Lucene:如何考虑与原始术语的相似性?   eclipse如何获取java文件的路径,包括/src/   Java接口—通过多个层传递变量的替代方案   java动态字段和/或人工方法   带有表单登录的JavaSpringSecurityOAuth2   twitter4j使用Java从URL中提取tweet?   java JSP解析错误   java气泡排序交换每个数字,而不考虑值   java如何在变量中存储时间?   Java程序在Eclipse中运行良好,但不是作为一个整体。jar文件(配置路径是否错误??)   如何在LinuxShell中持续运行特定数量的java进程?   java c#始终允许向上转换   java正则表达式匹配阿拉伯日期或普通日期   类Java HashMap对象,整数