【问题标题】:Send data from Django to another server将数据从 Django 发送到另一台服务器
【发布时间】:2019-11-30 14:50:46
【问题描述】:

我有一个已经存在的 Django 应用程序。我想添加一个系统,将数据从我的 Django 应用程序发送到另一个服务器上托管的另一个 Python 应用程序,以便 Python 应用程序可能以 json 格式从 Django 应用程序接收数据。

因此,例如,我需要创建一个视图,每隔几秒将数据从 DB 表发送到此应用程序,或者当点击表单时,将数据发送到此外部应用程序。

我该怎么做?有这个特殊问题的例子吗?我不知道我需要使用什么工具来创建这个系统,我只知道我需要使用 Celery 来执行异步任务,但没有别的;我应该使用 Webhooks 吗?还是 Django 频道?

编辑:添加更多上下文: 我有我的 Django 客户端。然后我有一个或两个 Python 应用程序在另一台服务器上运行。在我的 Django 客户端上,我有一些表格。提交表单后,数据将保存在数据库中,但我也希望将这些数据立即发送到我的 Python 应用程序。 Python 应用程序应该从 Django 接收 Json 格式的数据,并根据用户提交的值执行一些任务。然后应用程序应该向 Django 发送响应。

【问题讨论】:

  • 为什么不使用requests 将数据从您的应用程序发送到其他应用程序?
  • 你可以通过 ssh 连接到两个服务器吗?
  • 您想使用自己的两个应用程序来处理数据吗?两者都在 Python 中,一个在 Django 中?这第二个使用任何框架吗?仍然没有所有信息,我认为您可以让数据库进行通信并在应用程序中使用序列化程序来组合数据,也许您会拥有更快的数据速度和持久性。
  • @EndersonMenezes 我添加了更多上下文
  • 我做的事情和你做的差不多,我会尽量给你解释。对不起我的英语。

标签: python django


【解决方案1】:
import requests
from django import http

def view(request):
    url = 'python.app.com'  # replace with other python app url or ip
    request_data = {'key': 'value'}  # replace with data to be sent to other app
    response = requests.post(url, json=request_data)
    response_data = response.json()  # data returned by other app
    return http.JsonResponse(response_data)

这是一个基于函数的视图示例,它使用请求库来访问外部服务。请求库负责将您的数据编码/解码到 json。

【讨论】:

  • 但是您不认为使用 REST API 调用会很慢吗?你能推荐一些其他的方法吗?
  • 为什么会慢?这是同一个盒子上的应用程序。如果这是一个问题,您可以使用直接的数据库连接,但 OP 想要 json。也可以将数据存储在队列中并让 cron 或任务运行程序使用它,但 OP 的其他 python 应用程序需要处理数据并返回一些东西。
  • 所以基本上,我会将内容作为 Json 发送到外部 Python 应用程序?
  • 在原始帖子的编辑中,您提到您想将 json 发送到外部 Python 应用程序,所以我不确定您在此评论中要问什么。要回答,是的,我的回答将内容作为 json 发送到外部 py 应用程序。
  • @Airith 好的!但是我的外部 python 应用程序将如何接收发送的数据?
【解决方案2】:

来吧!我将在此处将您的 Django 应用程序称为 “DjangoApp” 并将您的 Python 应用程序称为 Flask 或 “OtherApp” 的其他框架。

首先,正如您预测的那样,您将需要一个能够执行任务的框架,新的 **Django 3.0 允许这样做,但 我没有使用过然而......我将把你正在使用的东西传给你,并且在 Django 2.8 和 Python 3.8 中完全可以使用**。

在您的 DjangoApp 服务器上,您需要与 Celery 建立良好的通信结构,让我们把任务交给他。你可以阅读Celery Docsthis post,制作这个架构非常好。

不管你的表单或 Django App 看起来如何,当你想让它在 celery 中激活一个任务时,它基本上是在后台传输数据的功能。

from .tasks import send_data

...
form.save()
# Create a function within the form to get the data the way you want it
# or do it the way you want.
values = form.new_function_serializedata()
send_data.delay(values) # [CALL CELERY TASKS][1]
...

也阅读CALL CELERY TASKS

在所有其他应用程序中,您将需要一个 POST 路由来接收和序列化这些数据,使用轻量级框架(如 Pyramid)来实现这一点

这样,每次提交表单时,您都会在 send_data 函数中将此数据发送到服务器。

根据我的经验,但对您的问题了解不多,我会使用类似的架构,但使用 Celery Beat

CELERY_BEAT_SCHEDULE = {
    'send_data': {
        'task': 'your_app.tasks.send_data',
        'schedule': crontab(), # CONFIGURE YOUR CRON
    },
}

上面的代码不仅是添加的,而且是这样的。

在您的模型中,我会为 sent 创建一个字段。并且每 2 秒、10 秒 .. 只要我希望过滤所有已发送 = false 的对象,并为 send_data 任务传递所有对象。

我不知道您是否感到困惑,这需要解释很多。但我希望我能帮助并回答您的问题。

【讨论】:

  • 这是一个有效的方法!但是如果我使用 Django 频道呢?使用 Celery 会有什么变化?
  • 我从未专门使用过 Channels,但您必须检查它的结构。它是一个开放项目吗? github上有吗?
  • 是的,这是一个开放的项目,在github上!
  • 发布链接,我会在另一天看到配置。
  • 还有一件事。我了解您代码的整个 Django 部分;但是我的外部 python 脚本如何接收数据?我的意思是,它必须连接到某个网址吗?
【解决方案3】:

是的,webhook 将是选项之一,但也有其他选项可用。

-> 您可以使用 Rest API 将数据从一个应用程序发送到另一个应用程序。但在他们的情况下,您需要考虑同步。这取决于您的要求,如果您不希望数据以同步方式,那么您可以使用 RabbiMq 或其他异步工具。只需在 Rabbitmq 中推送您的 REST API 请求,Rabbitmq 就会处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 2021-10-22
    • 2012-03-10
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    相关资源
    最近更新 更多