Django/PostgreSQL实现Meteor服务器。
项目描述
Django DDP 是一个基于 Django 和 PostgreSQL 的 Meteor DDP 服务器实现,允许 Meteor 订阅 Django 模型的变化。该软件采用 MIT 许可证发布。
要求
您必须在您的 Django 项目中使用 PostgreSQL 和 psycopg2 以使 django-ddp 正常工作。由于 PostgreSQL 和 psycopg2 提供了异步支持,因此不需要任何异步框架(如 Redis 或 crossbar.io)。
由于测试套件包含一个示例 Meteor 项目,因此运行它需要已安装 Meteor(并且 meteor 在您的 PATH 中)。
安装
从 pypi 安装最新版本(推荐)
pip install django-ddp
从 GitHub 克隆并使用开发版本以测试预发布代码(无需 GitHub 账户)
pip install -e git+https://github.com/commoncode/django-ddp@develop#egg=django-ddp
概述和入门
- Django DDP 在所有模型保存/更新操作上注册了 Django 信号 处理器。
将 'dddp' 添加到项目设置文件中的 INSTALLED_APPS。
- 每个 Django 应用程序(即:您的代码)通过 ddp 子模块注册 Collections 和 Publications,用于所有 INSTALLED_APPS。
在您的应用程序模块中,在一个名为 dddp.py 的文件中注册 collections 和 publications。
- 客户端订阅 publications,条目将写入 dddp.Subscription 和 dddp.SubscriptionCollection 模型表,并调用 publications 的 get_queries 方法以检索将发送给客户端的对象的 Django ORM 查询。
运行 manage.py migrate 以更新您的数据库,以便它具有跟踪客户端订阅所需的必要表。
- 当模型保存时,Django DDP 信号处理器向订阅相关 publications 的客户端发送更改消息。
根据您的应用程序代码中适当的位置使用模型 save() 和 delete() 方法,以便引发适当的信号并发送更改消息。
- 使用 Gevent 来并发运行 WebSocket 连接,同时运行您项目中的任何 Django 视图(通过您的项目 urls.py)。
使用 dddp 命令运行您的应用程序,该命令设置 gevent 主循环并为您项目的 Django 视图提供服务。此命令负责根据 Meteor 使用的 URL 路由 WebSocket 连接,不要在项目 urls.py 中添加 WebSocket 视图的 URL。
可扩展性
所有数据库查询以支持 DDP 事件都在通过 Django ORM 进行更改的服务器实例中执行一次。Django DDP 为活动订阅复用消息,在特定于每个已发布 Django 模型的通道上广播聚合的更改消息。
对等服务器订阅聚合广播事件,这些事件被解复用并分发给单个客户端连接。对等服务器不需要进行任何额外的数据库查询来解复用或分发。
限制
不支持SockJS XHR后备协议,以支持没有WebSockets(有关支持的浏览器,请参阅https://caniuse.cn/websockets)(请注意,目前唯一不支持WebSockets的浏览器是Opera Mini,它无论如何都不支持使用EcmaScript(JavaScript)进行交互的页面。提供SockJS XHR后备选项并不能实质性增加浏览器支持:如果排除Opera Mini,则所有当前浏览器版本,包括IE、Edge、Firefox、Chrome、Safari、Opera、iOS Safari、Android Browser Android和Chrome for Android都受支持。总之,欢迎提交pull请求。
必须通过Django ORM进行更改,因为django-ddp使用Django信号来接收模型保存/更新信号。没有技术原因不能使用数据库触发器 - 欢迎提交pull请求。
示例用法
将‘dddp’添加到settings.INSTALLED_APPS
# settings.py
...
INSTALLED_APPS = list(INSTALLED_APPS) + ['dddp']
如果您想支持Meteor Accounts包(即:使用django.contrib.auth进行登录/注销),请参阅下文中的身份验证部分,并使用以下行代替
# settings.py
...
INSTALLED_APPS = list(INSTALLED_APPS) + ['dddp', 'dddp.accounts']
将ddp.py添加到您的Django应用程序中
# bookstore/ddp.py
from dddp.api import API, Collection, Publication
from bookstore import models
class Book(Collection):
model = models.Book
class Author(Collection):
model = models.Author
class AllBooks(Publication):
queries = [
models.Author.objects.all(),
models.Book.objects.all(),
]
class BooksByAuthorEmail(Publication):
def get_queries(self, author_email):
return [
models.Author.objects.filter(
email=author_email,
),
models.Book.objects.filter(
author__email=author_email,
),
]
API.register(
[Book, Author, AllBooks, BooksByAuthorEmail]
)
启动Django DDP服务
DJANGO_SETTINGS_MODULE=myproject.settings dddp
将django-ddp作为次要DDP连接使用(快速开发)
以这种方式运行允许通过使用Meteor提供的热代码推送功能进行快速开发。
将您的Meteor应用程序连接到Django DDP服务
// bookstore.js
if (Meteor.isClient) {
// Connect to Django DDP service
Django = DDP.connect('http://'+window.location.hostname+':8000/');
// Create local collections for Django models received via DDP
Authors = new Mongo.Collection("bookstore.author", {connection: Django});
Books = new Mongo.Collection("bookstore.book", {connection: Django});
// Subscribe to all books by Janet Evanovich
Django.subscribe('BooksByAuthorEmail', 'janet@evanovich.com');
}
启动Meteor(在您的meteor应用程序目录中)
meteor
将django-ddp作为主要DDP连接使用(推荐)
如果您不想有两个DDP连接(一个连接到Meteor,另一个连接到django-ddp),可以将DDP_DEFAULT_CONNECTION_URL环境变量设置为使用指定的URL作为Meteor的主要DDP连接。在这种情况下,您不需要使用DDP.connect(…)或指定{connection: Django}在您的collections上。使用django-ddp作为主要连接是推荐的,如果您希望使用dddp.accounts通过django.contrib.auth对您的meteor应用程序提供身份验证,则确实需要这样做。
DDP_DEFAULT_CONNECTION_URL=http://localhost:8000/ meteor
从django-ddp提供您的Meteor应用程序
首先,您需要将您的meteor应用程序构建到目录中(以下示例假设目标目录名为myapp)
meteor build ../myapp
然后,在urls.py中添加一个MeteorView
from dddp.views import MeteorView
urlpatterns = patterns(
url('^(?P<path>/.*)$', MeteorView.as_view(
json_path=os.path.join(
settings.PROJ_ROOT, 'myapp', 'bundle', 'star.json',
),
),
)
添加API端点(服务器方法定义)
可以通过从Django应用程序的ddp.py模块中调用dddapi.API对象的register方法来添加API端点,该对象是从dddapi.APIMixin的子类中派生出来的 - 无论是dddapi.Collection还是dddapi.Publication都适合,或者您可以定义自己的dddapi.APIMixin的子类。一个很好的例子可以在django-ddp的源代码中的ddd/accounts/ddp.py中看到。
身份验证
使用标准meteor accounts系统提供身份验证,同时使用accounts-secure包关闭Meteor的密码散列,改用TLS(HTTPS + WebSockets)。这确保了所有数据传输的安全性。正确使用TLS/SSL还可以保护您的网站免受中间人攻击和重放攻击 - 没有使用加密,Meteor容易受到这两种攻击。
如示例用法部分中所述,将dddp.accounts添加到settings.INSTALLED_APPS,然后将tysonclugg:accounts-secure添加到您的Meteor应用程序(在您的meteor应用程序目录中)
meteor add tysonclugg:accounts-secure
然后按照正常程序将登录/注销视图添加到您的Meteor应用程序中。
贡献者
- Tyron Clugg
作者,概念设计。
- Yan Le
验证和修复ddd(accounts)子模块的bug。
- MEERQAT
项目赞助商 - 感谢您允许该项目以开源许可证发布!
- David Burles
在Meteor中DDP工作原理的专家指导。
- Brenton Cleeland
关于集合和发布如何限制特定用户对已发布文档的可见性的精彩讨论。
- Muhammed Thanish
使DDP测试套件可用。
本项目永远感激Common Code团队所给予的喜爱、支持和尊重。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。