2017-10-19 142 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