2017-10-19 156 views
0

我想运行python代码来解决浏览器中的一些方程式。我目前在web工作人员用javascript做到这一点。这根本不与DOM进行交互,它只是接收一些输入,进行一些计算,然后返回输出。我希望能够以相同的方式使用python。这可能吗?在后台运行python脚本或web worker

回答

3

我不认为你能够让客户端的浏览器执行任何Python代码。你必须弄清楚某种协议来与Python进行反复通信。执行此操作的常见方法是让Python进程运行在某个地方,充当HTTP(s)服务器。您可以让客户端的浏览器向Python服务器发出一个API调用(某种形式的HTTP请求),并且单独运行的一段Python代码将捕获该调用并发回数据。这可以像框架>标签或一些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() 

的test.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> 

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

$ python server.py 

虽然即运行,也启动web服务器来提供html(也是python3):

$ python -m http.server 8000 

然后尝试导航浏览器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端),它们打算为这种类型的事物提供更强大的功能。

+0

更新:现在有一个实验性的python解释器在javascript中执行。检查一下@ http://pypyjs.org。 – mathewguest

+0

我还建议您在浏览器开发人员工具中查看HTTP(s)请求(对于许多Web浏览器,热键为F12)。您应该看到1个对test.html页面的HTTP请求,然后对python服务器发出第二个AJAX请求。在这个请求的回应中将是这些数字的总和。 – mathewguest