2015-07-12 26 views
27

Tôi đang cố xây dựng một máy chủ REST đơn giản với SimpleHTTPServer trăn. Tôi đang gặp sự cố khi đọc dữ liệu từ bài đăng. Vui lòng cho tôi biết nếu tôi làm đúng.Đọc JSON từ SimpleHTTPServer Đăng dữ liệu

from SimpleHTTPServer import SimpleHTTPRequestHandler 
import SocketServer 
import simplejson 

class S(SimpleHTTPRequestHandler): 
    def _set_headers(self): 
     self.send_response(200) 
     self.send_header('Content-type', 'text/html') 
     self.end_headers() 

    def do_GET(self): 
     print "got get request %s" % (self.path) 
     if self.path == '/': 
      self.path = '/index.html' 
      return SimpleHTTPRequestHandler.do_GET(self) 

    def do_POST(self): 
     print "got post!!" 
     content_len = int(self.headers.getheader('content-length', 0)) 
     post_body = self.rfile.read(content_len) 
     test_data = simplejson.loads(post_body) 
     print "post_body(%s)" % (test_data) 
     return SimpleHTTPRequestHandler.do_POST(self) 

def run(handler_class=S, port=80): 
    httpd = SocketServer.TCPServer(("", port), handler_class) 
    print 'Starting httpd...' 
    httpd.serve_forever() 

Các tập tin index.html

<html> 
<title>JSON TEST PAGE</title> 
<head> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
<script type="text/javascript"> 

JSONTest = function() { 

var resultDiv = $("#resultDivContainer"); 

$.ajax({ 
    url: "http://128.107.138.51:8080", 
    type: "POST", 
    data: {txt1: $("#json_text").val()}, 
    dataType: "json", 
    success: function (result) { 
     switch (result) { 
      case true: 
       processResponse(result); 
       break; 
      default: 
       resultDiv.html(result); 
     } 
    }, 
    error: function (xhr, ajaxOptions, thrownError) { 
    alert(xhr.status); 
    alert(thrownError); 
    } 
}); 
}; 

</script> 
</head> 
<body> 

<h1>My Web Page</h1> 
<div id="resultDivContainer"></div> 
<form> 
<textarea name="json_text" id="json_text" rows="50" cols="80"> 
[{"resources": {"dut": "any_ts", "endpoint1": "endpoint", "endpoint2": "endpoint"}}, 
{"action": "create_conference", "serverName": "dut", "confName": "GURU_TEST"}] 
</textarea> 
<button type="button" onclick="JSONTest()">Generate Test</button> 
</form> 
</body> 
</html> 

Các simplejson thất bại trong việc tải các json từ thông điệp POST. Tôi không quen thuộc với mã hóa web và tôi thậm chí không chắc chắn nếu những gì tôi đang làm là đúng cho việc tạo ra một máy chủ API REST đơn giản. Tôi đánh giá cao sự giúp đỡ của bạn.

+1

Cũng xin vui lòng cho tôi biết nếu đây không phải là con đường để đi và nếu có một django là cách duy nhất để đi. –

Trả lời

32

Cảm ơn matthewatabet cho ý tưởng klein. Tôi đã tìm ra cách để thực hiện nó bằng BaseHTTPHandler. Mã dưới đây.

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
import SocketServer 
import simplejson 
import random 

class S(BaseHTTPRequestHandler): 
    def _set_headers(self): 
     self.send_response(200) 
     self.send_header('Content-type', 'text/html') 
     self.end_headers() 

    def do_GET(self): 
     self._set_headers() 
     f = open("index.html", "r") 
     self.wfile.write(f.read()) 

    def do_HEAD(self): 
     self._set_headers() 

    def do_POST(self): 
     self._set_headers() 
     print "in post method" 
     self.data_string = self.rfile.read(int(self.headers['Content-Length'])) 

     self.send_response(200) 
     self.end_headers() 

     data = simplejson.loads(self.data_string) 
     with open("test123456.json", "w") as outfile: 
      simplejson.dump(data, outfile) 
     print "{}".format(data) 
     f = open("for_presen.py") 
     self.wfile.write(f.read()) 
     return 


def run(server_class=HTTPServer, handler_class=S, port=80): 
    server_address = ('', port) 
    httpd = server_class(server_address, handler_class) 
    print 'Starting httpd...' 
    httpd.serve_forever() 

if __name__ == "__main__": 
    from sys import argv 

if len(argv) == 2: 
    run(port=int(argv[1])) 
else: 
    run() 

Và html tương ứng trang

<form action="/profile/index/sendmessage" method="post" enctype="application/x-www-form-urlencoded"> 
<div class="upload_form"> 
    <dt id="message-label"><label class="optional" for="message">Enter Message</label></dt> 
    <dd id="message-element"> 
    <textarea cols="80" rows="50" id="message" name="message"> 
[{"resources": {"dut": "any_ts", "endpoint1": "multistream_endpoint", "endpoint2": "multistream_endpoint"}}, 

{"action": "create_conference", "serverName": "dut", "conferenceName": "GURU_SLAVE_TS"}, 

{"action": "dial_out_ep", "serverName": "dut", "confName": "GURU_SLAVE_TS", "epName": "endpoint1"} 
] 
     </textarea></dd> 
    <dt id="id-label">&nbsp;</dt> 
    <dd id="id-element"> 
    <input type="hidden" id="id" value="145198" name="id"></dd> 
    <dt id="send_message-label">&nbsp;</dt> 
    <dd id="send_message-element"> 
    <input type="submit" class="sendamessage" value="Send" id="send_message" name="send_message"></dd> 
</div> 
</form> 

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

var message = $('textarea#message').val(); 
var id  = $('input#id').val(); 
url = "http://128.107.138.51:8080" 

var posting = $.post(url, message) 

posting.done(function(data) { 
    alert(message); 
}); 
}); 


</script> 
8

SimpleHTTPRequestHandler không hỗ trợ POST. Nó thực sự rất đơn giản. Kiểm tra Klein có máy chủ là một chút đầy đủ tính năng hơn.

Có một ví dụ về một PUT json (khá gần với POST) ở đây: https://pypi.python.org/pypi/klein/0.2.3

import json 

from klein import Klein 


class ItemStore(object): 
    app = Klein() 

    def __init__(self): 
     self._items = {} 

    @app.route('/') 
    def items(self, request): 
     request.setHeader('Content-Type', 'application/json') 
     return json.dumps(self._items) 

    @app.route('/<string:name>', methods=['PUT']) 
    def save_item(self, request, name): 
     request.setHeader('Content-Type', 'application/json') 
     body = json.loads(request.content.read()) 
     self._items[name] = body 
     return json.dumps({'success': True}) 

    @app.route('/<string:name>', methods=['GET']) 
    def get_item(self, request, name): 
     request.setHeader('Content-Type', 'application/json') 
     return json.dumps(self._items.get(name)) 


if __name__ == '__main__': 
    store = ItemStore() 
    store.app.run('localhost', 8080) 
+0

Cảm ơn bạn đã liên kết. Tôi cũng nghĩ rằng nó có thể được thực hiện với BaseHTTPHandler. –

Các vấn đề liên quan