2016-11-02 2 views
0

나는 googleing을 시도하고 있으며 대답이 없습니다. ("어떻게 파이썬을 사용하여 POST 요청을 보내나요?").파이썬 서버에 Ajax POST/GET 요청

이야기 :

이미 하드웨어 주변 장치와의 통신과 같은 몇 가지 작업을 수행하는 파이썬 스크립트를 사용하여 오전 POS 시스템을 개발. 지금까지 이러한 스크립트가 아파치를 설치하고 ajax.php에 POST 요청을 통해 시작됩니다있는 작은 서버에서 실행되고, 이제 system('python scriptname.py 1200 &');

지금은 생각하고에 system('python ' . $_POST['name'] . '.py ' . $_POST['param1'] . ' &');으로 PHP 명령을 통해 전송되는 두 PARAMS $_POST['name']='scriptname'$_POST['param1']=1200로 가정 해 봅시다 아파치가 설치되지 않은 순수한 리눅스/파이썬 서버를 설치하고 똑같은 일을 수행하기를 원한다.

간단히 말하면, 지정된 폴더에 대해 simpleHTTPserver가 실행 중입니다.

첫번째 질문 :

방법 :

나는 그것을 관리 할 수있는 방법, 그래서 http://192.168.20.11:8080/scriptname.py?arg=1200

두번째 질문처럼이 서버에 다른 네트워크 클라이언트에서 POST (또는 지금의이 GET 가정 해 봅시다) 요청을 보낼 보내는 네트워크 클라이언트에서 응답 (ajax 데이터 부분)을 계속 사용하려면 '완료'또는 1560과 같은 숫자의 응답을 USB 축척의 응답으로받을 수 있습니까?

+1

당신은이 지역의 정적 파일을 제공 할 목적으로 SimpleHTTPServer를 사용하지 마십시오 . 당신은 적절하게 wsgi 응용 프로그램을 구현해야합니다. 아마도 Django 나 Flask 같은 것을 사용했을 것입니다. – spectras

+1

이 엔드 포인트를 발견하면 누군가가 쉽게'main.py & rm -rf'를 할 수 있기 때문에 보안 취약점에 대해 생각하고 있기를 바랍니다. 그리고 이것에 대한 @pectpectras에 동의합니다. Django 또는 Flask를 사용하여 Python webapp을 개발하십시오. –

+0

왜 아파치를 사용하지 않으시겠습니까? –

답변

0

항복 하시겠습니까? 절대로!

시간 후에 ... 아직까지 약간의 손이 필요하고, 약간의 작은 움푹 들어간 곳과 긁힌 자국이 지금까지 나는 볼 수 있지만, 원래 실행하고 싶었던 방식으로 실행되고 있습니다.

동시에 랩퍼와 서버의 일종이며, 강화 된 몇 가지 타당성 및 보안 검사가 포함되어 있으며 현재는 쉼표로 구분 된 단일 매개 변수, 문자열 (원하는 이름 하위 프로세스 스크립트)와 숫자 (예 : sayhello,2000)를 매개 변수로 사용합니다. 아직 아직 JSON이 추가되지 않았지만 현재는 필요하지 않습니다.

그것은 어떤 파이썬 프레임 워크없이 작동하지만, JQuery와 AJAX 및 상시 관측소와 WSGIserver, 클라이언트 측에 (나중에에 필요하므로, 아직 다른 시스템에 테스트하지 다른 URL, 테스트)

이로써 당신 ' 세 개의 파일을 찾을 수 있습니다. ajax.html, server.py 및 testscript sayhello.py.

사전에 추가 힌트, 경고 또는 개선을 보내 주셔서 감사합니다. 너가 좋아하길 바래.

ajax.html

<html> 
<head> 
<title>Ajax POST to python</title> 
</head> 
<body> 

    send message: <input type="text" id="message" value="" size="10" placeholder="string,number"> <input type=button id="send" value="send"> 
    <br /> 
    response: <span id="response"></span> 

</body> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
<script> 
$("input#send").click(function(event) { 
    event.preventDefault(); 

    $.ajax({ 
     type: 'POST', 
     url: 'http://localhost:8080', 
     crossDomain: true, 
     data: $('input#message').val(), 
     dataType: 'text', 
     timeout: 3000, 
     success: function(responseData, textStatus, jqXHR) 
     { 
      $('span#response').html(responseData); 
     }, 
     error: function (responseData, textStatus, errorThrown) 
     { 
      console.warn(responseData, textStatus, errorThrown); 
      alert('failed - ' + textStatus); 
     } 
    }); 
}); 
</script> 
</html> 

#!/usr/bin/env python 

import threading 
from subprocess import Popen, PIPE 
from pathlib import Path 
from wsgiref.simple_server import make_server 

PORT = 8080 
REQUEST_METHOD = "POST" 

def myapp(env, http_stuff): 
    if env['REQUEST_METHOD'] == REQUEST_METHOD: 
     try: 
      request_body_size = int(env['CONTENT_LENGTH']) 
      request_body = env['wsgi.input'].read(request_body_size) 
     except (TypeError, ValueError): 
      request_body = "0" 
     try: 


#---------------------------security/plausibility 
      allowed_scripts = ["sayhello","count_apples","get_scale_weight","etc."] 
      el = request_body.split(","); 
      arg_filename = str(el[0].strip()) 
      arg_num = int(el[1].strip()) 

      if not (arg_filename in allowed_scripts):   
       arg_filename = "" 

      if isinstance(arg_num, int): 
       arg_num = str(arg_num) 
      else: 
       arg_num = "" 


#---------------------------script exists ? 
      my_file = Path(arg_filename+".py") 
      if my_file.is_file(): 
       output = "no valid output." 


#---------------------------subprocess 
       proc = Popen(["python", arg_filename+".py",arg_num], shell=False, stdout=PIPE, stderr=PIPE) 
       output = proc.communicate()[0] 


#---------------------------more stuff 
       response_body = output 
      else: 
       response_body = "["+request_body+"] is not allowed !" 
     except: 
      response_body = "some other error" 
    else: 
     response_body = "no POST data" 
    status = '200 OK' 


#---------------------------header with CORS support 
    headers = [('Content-type', 'text/plain'), 
      ("Access-Control-Allow-Origin", "*")] 
    http_stuff(status, headers) 
    return response_body 

def start_server(): 
    httpd = make_server("", PORT, myapp) 
    httpd.serve_forever() 

if __name__ == "__main__": 
    start_server() 

sayhello.py server.py

#!/usr/bin/env python 

import sys 

print "I am sayhello.py and I say HELLO "+sys.argv[1] 
+1

그 종류가 그 요점을 무찔 렀지, 안 그래? 전체 아이디어는 응용 프로그램 서버에서 직접 논리를 실행하는 것이 었습니다. 코드의 복잡성을 [flask 's hello] (http://flask.pocoo.org/docs/0.11/quickstart/)의 4 행과 비교하십시오. – spectras

+0

@spectras 응용 프로그램 서버를 가리키는 경우 사용자가 전적으로 옳은 것인지 확인하십시오. 내가 무엇을 필요로하는지 충분히 설명하지 못했습니다. – ddlab

+0

@spectras AMP 기반 웹 앱이 인터넷에서 실행 중이며 사용자가 iPad 또는 Android 태블릿 또는 일반 데스크톱을 통해 액세스합니다. 위의 "응용 프로그램 서버"는 하드웨어 인터페이스에 대한 것입니다. 해결 된 방법은 인증 된 하드웨어에 대한 Apple의 제한 사항입니다. 하나의 프린터는 확장 가능하고 확장 가능한 인쇄 서버라고 할 수 있습니다.이 프린터 서버는 여러 대의 프린터뿐만 아니라 비늘, 바코드 스캐너 a.s.o를 지원합니다. 따라서 Flask, Werkzeug, Jinja 및 ...이 필요하지 않습니다. 나중에 나중에 마음을 바꿀 수는 있지만, 현재이 간단한 WSGI 서버와 일부 라인이 내 필요를 충족시킵니다. – ddlab