伺服器-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`只接受单个字符串值,不处理列表。
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
```
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
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
````
添加"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'
``
```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/');
},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`只接受单个字符串值,不处理列表。