【问题标题】:How do I Create a JavaScript API That I Can Call From Python? [closed]如何创建可以从 Python 调用的 JavaScript API? [关闭]
【发布时间】:2019-11-22 11:52:38
【问题描述】:

我使用 Node.js 用 Ja​​vaScript 编写了一个程序(目前更像是一个网站)。你可以在这里找到它:https://github.com/bhofff/Wikipedia-Image-Data-Tool

我对与 JavaScript 有关的几件事有点困惑,并且想知道如何从 python 文件运行包含 JavaScript API 的函数。

首先是一些背景。

该程序的目的是使用 Wikipedia API 下载特定页面上的所有图像、它们各自的描述以及主体页面。它为我桌面上的每个页面创建一个新文件,以页面命名,所有文件都放在那里。

到目前为止,处理从 Wikipedia 获取所有数据的 Wiki.js 文件在服务器上运行,来自 index.ejs(类似于 html)。 Node 运行启动服务器的 app.js。您转到http://localhost:3000/wiki 并输入您想要的维基百科页面的名称,然后它将其发送到 Wiki.js,后者收集图像 URL 和文本字符串并将它们发送到未托管在服务器上的 wikiController.js 并处理创建带有页面名称的文件夹,并将图像和文本文件下载到该文件夹​​。

我的问题。

  1. 我的第一个问题是 Wiki.js 是否必须托管在服务器上。我相信确实如此,但只是好奇。

  2. 假设它确实如此,并且我将它托管在服务器上,我需要什么才能让 python 脚本从我的计算机调用它(发送页面名称)并接收回数据?基本上,我想将 Wiki.js 包装在一个可由 python 脚本调用的 API 中。

  3. 接下来我不想使用 Node.js 下载任何东西。这个问题对我来说是最令人困惑的,因为即使我为 wikiController.js 编写了所有代码,但我实际上并不知道它在客户端还是服务器上运行?我的理解是:

    I) Node 运行 app.js,

    II) 然后在 app.js 里面我做:

    var express = require('express');
    var wikiController = require('./controllers/WikiController');
    var app = express();
    wikiController(app);

它运行 wikiController.js 并发送某种 var/object (app) 以便可以在 wikiController.js 中使用??

III) 然后我们开始托管服务器:

    app.listen(3000, function() {
        console.log('we be listening to da port of 3000');
    });

但是“wikiController(app);”首先发生,所以 wikiController.js 只是编辑“app”对象/whatever-it-is,以便在服务器启动时的下一行,它知道 pare 的 html(ejs) 是什么以及对所有的做什么请求?

这与我的第一个问题有关,因为我认为“Java 创建的应用程序在虚拟机或浏览器中运行,而 JavaScript 代码仅在浏览器上运行。”节点是什么允许我在我的计算机上运行 JavaScript?我很困惑。

  1. 如果我将 API 托管在 GitHub 上,它就可以工作,对吗?感觉是个愚蠢的问题,但我只是想确定一下。

  2. 我可以使用 .py 或 .java 来运行 app.js 并将服务器本地化(假设我已经重新编码 app.js 以不使用 Node)?

    //example 1
    $.ajax({
        type: 'POST',
        url: '/wiki/' + 'descriptions',
        data: tempDes,
        success: function(sendData) {
        }
    });
    //example 2
    $.ajax({
        type: 'POST',
        url: '/wiki/' + foldername,
        data: foldername,
        success: function(folderData) {
        }
    });

我希望它如何工作。

1) 我可能从 GitHub 托管服务器。

2) thing1.py 调用 thing2(python 或 java 或 JavaScript,我不在乎)并向 thing2 发送两个字符串('页面标题','文件目录位置')。

3) thing2 将“页面标题”发送到 GitHub 上的服务器/API

4) GitHub 服务器将执行它在 Wiki.js 中已经执行的所有操作,但不是在每个函数中执行第二个 POST 请求(例如第 145-151、159-166 行 也显示在上面 ) 它将数据(图像和文本字符串)在 API 的“success:”字段中发送回下载它的 thing2。

非常感谢您提前提供的任何帮助!

【问题讨论】:

  • 您的 API 应托管在始终运行的服务器上,您不能将其托管在 Github 上(Github 仅托管代码)。从那里,您将能够从任何其他机器(包括同一台机器)调用 API。在这种情况下,node.js 应用程序是服务器。接下来,您可以创建一个客户端应用程序/脚本来与服务器交互。首先,您需要创建一个快速路由,允许您的 API 将您想要发送到客户端的数据发送到客户端。接下来,如果您想使用 python 进行调用,请查看本教程:realpython.com/python-requests
  • 我的建议是执行以下操作: 1. 创建一个节点 api 服务器来处理与维基百科的所有交互 2. 在 python 中创建一个与节点服务器交互的客户端应用程序

标签: javascript java python node.js api


【解决方案1】:

好的,让我们一点一点来,大致按照您要求的顺序,但在某些地方会有所偏差。

这里有很多问题。其中第一个也是最重要的是,您并不真正了解 Node.js 是什么或它的作用。正如您所建议的,Node.js 是 JavaScript 的服务器端实现——换句话说,它允许您在服务器上运行 JavaScript,与您的 Web 浏览器完全分离(在这种情况下,服务器是 localhost)。在尝试实现类似的东西之前,我真的建议您回去学习有关您正在使用的框架的基础知识。

如果Wiki.js 正在与您的 Node.js 服务器交互,是的,您需要在服务器上进行交互。由于我不知道Wiki.js 包含的详细信息,因此很难比这更具体。同样,回到 Node.js 的基础知识在这里可能会有所帮助。

wikiController 在您的服务器上运行,您在app.js 中调用它就证明了这一点,这您的服务器。调用wikiController(app); 会“编辑”app 对象,一旦您开始侦听连接,可能会扩展其功能。

GitHub 不是服务器主机。 GitHub 页面是静态 HTML,因此您无法在其上运行 API。我建议您查看Glitch,它允许您托管 Node.js 服务器来测试您的 API。它是免费的,但有一些限制,但它们可能不会在您测试时影响您。它还与 GitHub 集成,因此您可以将更改提交到 GitHub 存储库,并在您的 Web 服务器上自动更新。

为了“使用 .py 或 .java 运行 app.js”,如果您正在运行 Node.js 应用程序,则需要使用 Python 或 Java 向localhost 发出 Web 请求本地,或者如果您选择在网络上托管它,也可以在您的公共网址上。

在我看来,您在这里遇到的大多数问题都是由于缺乏对 Node.js、JavaScript 和 API 的基础知识。这不是一件坏事,但我建议寻找有关创建简单服务器的深入课程或指南,然后从那里开始。

【讨论】:

  • 我可以从不在服务器上的 python 或 java 文件连接到 Wikipedia API 吗?就像我桌面上的一样?另外,非常感谢您的帮助!
  • @BrandonHoffmann 从表面上看,是的!在 PyPI 上快速搜索会发现一个古老但流行的开源包 wikipedia,它允许您在 Python 中与 Wikipedia 的 API 进行本机交互。该描述特别提到从一篇文章中检索所有图像。
  • 非常感谢,你是我的英雄!
  • @BrandonHoffmann 没问题!很高兴我能帮助你。如果您对我的回答感到满意并认为它解决了您的问题,请vote it up and click the check mark 结束您的问题。
猜你喜欢
  • 1970-01-01
  • 2013-05-28
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 2017-06-16
相关资源
最近更新 更多