2012-10-30 38 views
12

Tôi đang cố gắng tạo một máy chủ web python đơn giản để lưu văn bản được Post chỉnh sửa thành tệp có tên store.json nằm trong cùng thư mục với tập lệnh python. Đây là một nửa mã của tôi, ai đó có thể cho tôi biết phần còn lại nên là gì?Máy chủ web Python đơn giản để lưu tệp

import string,cgi,time 
from os import curdir, sep 
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
#import pri 

class StoreHandler(BaseHTTPRequestHandler): 
def do_GET(self): 
    try: 
     if self.path == "/store.json": 
      f = open(curdir + sep + "store.json") #self.path has /test.html 
      self.send_response(200) 
      self.send_header('Content-type','text/json') 
      self.end_headers() 
      self.wfile.write(f.read()) 
      f.close() 
      return 
     return 
    except IOError: 
     self.send_error(404,'File Not Found: %s' % self.path) 
def do_POST(self): 
    //if the url is 'store.json' then 
    //what do I do here? 

def main(): 
    try: 
     server = HTTPServer(('', 80), StoreHandler) 
     print 'started...' 
     server.serve_forever() 
    except KeyboardInterrupt: 
     print '^C received, shutting down server' 
     server.socket.close() 
if __name__ == '__main__': 
    main() 

Trả lời

26

Dưới đây là hướng dẫn chung:

from os import curdir 
from os.path import join as pjoin 

from http.server import BaseHTTPRequestHandler, HTTPServer 

class StoreHandler(BaseHTTPRequestHandler): 
    store_path = pjoin(curdir, 'store.json') 

    def do_GET(self): 
     if self.path == '/store.json': 
      with open(self.store_path) as fh: 
       self.send_response(200) 
       self.send_header('Content-type', 'text/json') 
       self.end_headers() 
       self.wfile.write(fh.read().encode()) 

    def do_POST(self): 
     if self.path == '/store.json': 
      length = self.headers['content-length'] 
      data = self.rfile.read(int(length)) 

      with open(self.store_path, 'w') as fh: 
       fh.write(data.decode()) 

      self.send_response(200) 


server = HTTPServer(('', 8080), StoreHandler) 
server.serve_forever() 
$ curl -X POST --data "one two three four" localhost:8080/store.json 
$ curl -X GET localhost:8080/store.json  
one two three four% 
+0

Nó nói 'ImportError: Không có module nào có tên 'BaseHTTPServer'' –

+2

Ok, bạn cần thay đổi' từ BaseHTTPServer' thành 'từ http.server' –

+1

Xin lỗi, không nhận thấy phần' -3.x' của thẻ. – gvalkov

7

Điều quan trọng là bạn sẽ phải xây dựng cgi.FieldStorage đúng cách từ dữ liệu được đăng thô, ví dụ:

form = cgi.FieldStorage(
      fp=self.rfile, 
      headers=self.headers, 
      environ={'REQUEST_METHOD':'POST', 
        'CONTENT_TYPE':self.headers['Content-Type'], 
        }) 

sau đó nó rất dễ dàng để đổ tập tin, đây là một bộ xử lý đơn giản trong đó cho thấy một biểu mẫu trên do_GET để tải lên bất kỳ người sử dụng tập tin chọn và tiết kiệm mà tập tin vào/tmp trong do_POST khi mẫu được đăng

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler 

import cgi 

class StoreHandler(BaseHTTPRequestHandler): 
    def do_POST(self): 

     form = cgi.FieldStorage(
      fp=self.rfile, 
      headers=self.headers, 
      environ={'REQUEST_METHOD':'POST', 
        'CONTENT_TYPE':self.headers['Content-Type'], 
        }) 
     filename = form['file'].filename 
     data = form['file'].file.read() 
     open("/tmp/%s"%filename, "wb").write(data) 

     self.respond("uploaded %s, thanks"%filename) 

    def do_GET(self): 
     response = """ 
     <html><body> 
     <form enctype="multipart/form-data" method="post"> 
     <p>File: <input type="file" name="file"></p> 
     <p><input type="submit" value="Upload"></p> 
     </form> 
     </body></html> 
     """   

     self.respond(response) 

    def respond(self, response, status=200): 
     self.send_response(status) 
     self.send_header("Content-type", "text/html") 
     self.send_header("Content-length", len(response)) 
     self.end_headers() 
     self.wfile.write(response) 

Cũng lưu ý rằng self.respond không phải là phương pháp chuẩn mà tôi vừa thêm nó để trả lại nhanh một số phản hồi.

+0

này là Python 3, không SimpleHTTP vẫn làm việc? Xin lỗi, tôi đã không đề cập đến điều đó. –

+0

@ArlenBeiler Tôi đã thay đổi thành BaseHTTPRequestHandler nếu nó hoạt động trên python3, cũng có vẻ như SimplreREquestHandler trong python3 http://docs.python.org/3.3/library/http.server.html#http.server.SimpleHTTPRequestHandler –

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