2017-10-19 8 views
0

브라우저에서 일부 방정식을 해결하기 위해 파이썬 코드를 실행하고 싶습니다. 저는 현재 웹 작업자의 javascript를 사용하여이 작업을 수행합니다. 이것은 DOM과 전혀 상호 작용하지 않으며, 단지 입력을 받아 계산을 수행 한 다음 결과를 반환합니다. 같은 방식으로 파이썬을 사용할 수 있기를 바랍니다. 이것이 가능한가?배경 또는 웹 작업자에서 python 스크립트를 실행하십시오.

답변

3

클라이언트의 브라우저에서 파이썬 코드를 실행할 수 없을 것이라고 생각합니다. 당신은 파이썬과 앞뒤로 의사 소통하기위한 어떤 종류의 프로토콜을 찾아야 할 것이다. 이렇게하는 일반적인 방법은 파이썬 프로세스를 HTTP 서버 역할을하는 어딘가에서 실행시키는 것입니다. 클라이언트의 브라우저가 Python 서버에 API 호출 (HTTP 요청의 일부 형태)을하도록 할 수 있으며 실행중인 Python 코드의 개별 부분이 해당 호출을 수신하고 데이터를 다시 전송합니다. 이는 < frame> 태그 또는 브라우저에서 요청을 해석하고 응답을 해석하는 일부 자바 스크립트 코드처럼 간단 할 수 있습니다.

이것을 시도하고 새 디렉토리로 이동하여 두 개의 파일을 만듭니다. (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 :

$ python server.py 

동안 :

이제
<!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> 

먼저 파이썬 프로세스 서버를 시작 실행중인 웹 서버도 html (또한 python3) 서비스를 시작합니다.

$ python -m http.server 8000 

그런 다음, 20 숫자의 합을 포함하는 HTTP 응답을 다시 전송하는) http://localhost:8000/test.html에 브라우저를 탐색하려고하면 (파이썬 방법 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/.

이것은 생생하고 간단하지만 기능이나 2에 대해서는 훌륭하게 작동하지만 많은 기능을 파이썬으로 내보내는 경우 고급 라이브러리 및 프레임 워크로 업그레이드하는 것이 좋습니다. 클라이언트 측/자바 측, 서버/파이썬 측)에 대해 설명하고 있습니다.

+0

업데이트 : 이제 자바 스크립트에서 실행되는 실험용 파이썬 인터프리터가 있습니다. @ http://pypyjs.org에서 확인하십시오. – mathewguest

+0

또한 브라우저 개발자 도구에서 HTTP 요청을 보는 것이 좋습니다 (핫키는 많은 웹 브라우저에서 F12 임). test.html 페이지에 대한 HTTP 요청 1 개와 Python 서버에 대한 두 번째 AJAX 요청이 표시되어야합니다. 해당 요청의 응답에서 해당 숫자의 합계가됩니다. – mathewguest

관련 문제