2017-10-19 20 views
0

ブラウザでいくつかの方程式を解くためにPythonコードを実行したいと思います。私は現在、Webワーカーのjavascriptでこれを行います。これはまったくDOMとやりとりしません。ちょうど入力を受け取り、いくつかの計算を行い、出力を返します。私は同じようにPythonを使うことができるのが大好きです。これは可能ですか?バックグラウンドまたはWebワーカーでPythonスクリプトを実行

答えて

3

クライアントのブラウザにPythonコードを実行させることはできません。あなたは、Pythonで前後にやりとりするための何らかのプロトコルを見つけなければなりません。これを行う一般的な方法は、HTTPサーバーとして動作するPythonプロセスをどこかで実行させることです。クライアントのブラウザがPythonサーバーへのAPI呼び出し(何らかの形式のHTTP要求)を行い、実行している別のPythonコードがその呼び出しを捕捉してデータを返すようにすることができます。これは、<フレーム>タグまたは要求を行い、ブラウザで応答を解釈するJavaScriptコードと同じくらい単純なものです。

これを試して、新しいディレクトリに移動して2つのファイルを作成してください。 (のpython3上に構築された)

server.py:

#!/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 

ながら実行している、また、html(またpython3)を提供するWebサーバーを開始:

$ python -m http.server 8000 

その後、20の数字の合計を含むHTTPレスポンスを返信する)http://localhost:8000/test.htmlにブラウザをナビゲートしてみてください、あなたは(PythonのメソッドのMyHandler.do_GETを呼び出しますhttp://localhost:8001/7/13への要求を行うtest.htmlという表示されるはずですクレジットは私が基本的にコピーしたこのウェブサイトに行く:https://daanlenaerts.com/blog/2015/06/03/create-a-simple-http-server-with-python-3/

これは入手したものと同じくらい簡単ですが、それは1つまたは2つの機能には効果的ですが、多くの機能をPythonにエクスポートすると、より高度なライブラリとフレームワークにアップグレードする価値がありますクライアント/ Javascript側とサーバ/ Python側)には、このタイプのことを実行するためのより堅牢で機能が充実しています。

+0

更新:javascriptで実行される実験的なPythonインタプリタがあります。それを@ http://pypyjs.orgでチェックしてください。 – mathewguest

+0

また、ブラウザの開発者ツール(多くのWebブラウザではホットキーはF12)でHTTPリクエストを監視することをお勧めします。 test.htmlページに対して1つのHTTPリクエストが表示され、次にPythonサーバーに2つ目のAJAXリクエストが表示されます。その要求からの応答では、それらの数値の合計になります。 – mathewguest

関連する問題