跳转到主要内容

Django/PostgreSQL实现Meteor服务器。

项目描述

Django DDP 是一个基于 DjangoPostgreSQL 的 Meteor DDP 服务器实现,允许 Meteor 订阅 Django 模型的变化。该软件采用 MIT 许可证发布。

要求

您必须在您的 Django 项目中使用 PostgreSQLpsycopg2 以使 django-ddp 正常工作。由于 PostgreSQLpsycopg2 提供了异步支持,因此不需要任何异步框架(如 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

概述和入门

  1. Django DDP 在所有模型保存/更新操作上注册了 Django 信号 处理器。
    • 'dddp' 添加到项目设置文件中的 INSTALLED_APPS。

  2. 每个 Django 应用程序(即:您的代码)通过 ddp 子模块注册 Collections 和 Publications,用于所有 INSTALLED_APPS。
    • 在您的应用程序模块中,在一个名为 dddp.py 的文件中注册 collections 和 publications。

  3. 客户端订阅 publications,条目将写入 dddp.Subscriptiondddp.SubscriptionCollection 模型表,并调用 publications 的 get_queries 方法以检索将发送给客户端的对象的 Django ORM 查询。
    • 运行 manage.py migrate 以更新您的数据库,以便它具有跟踪客户端订阅所需的必要表。

  4. 当模型保存时,Django DDP 信号处理器向订阅相关 publications 的客户端发送更改消息。
    • 根据您的应用程序代码中适当的位置使用模型 save()delete() 方法,以便引发适当的信号并发送更改消息。

  5. 使用 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提供您的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

本项目永远感激Common Code团队所给予的喜爱、支持和尊重。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源代码分布

django-ddp-0.19.1.tar.gz (224.9 kB 查看哈希值)

上传时间 源代码

构建分布

django_ddp-0.19.1-py2.py3-none-any.whl (70.9 kB 查看哈希值)

上传时间 Python 2 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面