在后台或 Web Worker 中运行 python 脚本

Jos*_*rth 0 python web-worker

我想运行一个 python 代码来解决浏览器中的一些方程。我目前在网络工作者中使用 javascript 执行此操作。这根本不与 DOM 交互,它只是接收一些输入,进行一些计算,然后返回输出。我希望能够以同样的方式使用 python。这可能吗?

mat*_*est 6

我认为您无法让客户端的浏览器执行任何 Python 代码。您必须找出某种协议来与 Python 来回通信。一种常见的方法是让 Python 进程在某个地方运行,充当 HTTP(s) 服务器。您可以让客户端的浏览器向 Python 服务器发出 API 调用(某种形式的 HTTP 请求),运行的单独 Python 代码段将捕获该调用并发回数据。这可以像 <frame> 标记或一些 Javascript 代码一样简单,这些代码在浏览器中发出请求并解释响应。

试试这个,进入一个新目录并创建两个文件。

server.py(建立在python3上):

#!/usr/bin/env python

import http.server
import logging

IP = '127.0.0.1'
PORT = 8001

class MyHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        url = self.path
        headers = self.headers
        print('received request:', url)

        numbers = url.split('/')
        print('parsed numbers:', numbers)
        try:
            sumTotal = 0
            for num in numbers:
                if num == '':
                    continue
                sumTotal += int(num)
            self.respond(sumTotal)
        except ValueError as ex:
            logging.error('unable to parse value: %s' % num)
            self.respond(-1)

    def respond(self, sumTotal):
        # Send response status code
        self.send_response(200)

        # Send headers
        self.send_header('Content-type','text/html')
        self.send_header('Access-Control-Allow-Origin', '*')
        self.end_headers()

        # Send message back to client
        message = str(sumTotal)
        # Write content as utf-8 data
        self.wfile.write(bytes(message, 'utf8'))
        return

def main():
    address = (IP, PORT)
    httpd = http.server.HTTPServer(address, MyHandler)
    httpd.serve_forever()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

测试.html:

<!DOCTYPE HTML>
<html lang="en-us">
<head>
  <title>Python Linking Demo</title>
  <script type="text/javascript">

    function addNumbers(a, b) {
      var url = 'http://localhost:8001/' + a + '/' + b;
      var xhr = new XMLHttpRequest();
      xhr.onreadystatechange = function() {
        if (xhr.readyState == XMLHttpRequest.DONE) {
          var data = xhr.responseText;
          var el = document.getElementById('data-div');
          if (!el) {
            return;
          }
          el.innerHTML = data;
        }
      }
      xhr.open('GET', url, true);
      xhr.send(null);
    };

    setTimeout(function(){addNumbers(7, 13);}, 1000);

  </script>
</head>
<body>
  <h1>With some luck, this will populate below:</h1>
  <div id="data-div">{{number}}</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

现在,首先为 Python 进程启动服务器:

$ python server.py
Run Code Online (Sandbox Code Playgroud)

在运行时,还要启动 Web 服务器来提供 html(也是 python3):

$ python -m http.server 8000
Run Code Online (Sandbox Code Playgroud)

然后尝试将浏览器导航到http://localhost:8000/test.html,您应该看到 test.html 向http://localhost:8001/7/13发出请求,这将调用 Python 方法 MyHandler.do_GET()它发回包含数字总和的 HTTP 响应,20。功劳归于这个网站,我基本上是从这里复制粘贴的:https : //daanlenaerts.com/blog/2015/06/03/create-a-simple- http-server-with-python-3/。

这非常简单和原始,它对一两个函数很有用,但是如果您发现自己将大量功能导出到 Python,那么升级到更高级的库和框架(都在客户端/ Javascript 端和服务器/Python 端),它们打算在做这类事情时更加健壮和功能完整。