2012-04-10 18 views
6

Tôi cần triển khai một ứng dụng giống như máy chủ web rất đơn giản bằng Python sẽ thực hiện các yêu cầu và phản hồi HTTP cơ bản và hiển thị đầu ra rất cơ bản trên trang web. Tôi không quá lo lắng về việc thực sự mã hóa nó bằng Python, nhưng tôi không chắc bắt đầu từ đâu? Làm thế nào để thiết lập này? Một tập tin? Nhiều tệp? Tôi đoán tôi không có ý tưởng làm thế nào để tiếp cận thực tế rằng đây là một "máy chủ" - vì vậy tôi không quen với cách tiếp cận đối phó với yêu cầu HTTP/socket/xử lý yêu cầu, vv Bất kỳ lời khuyên? Tài nguyên?Làm cách nào để triển khai một máy chủ web đơn giản bằng Python mà không cần sử dụng bất kỳ thư viện nào?

+0

Giải thích thêm các yêu cầu của bạn (và tại sao). Bạn có muốn triển khai ngăn xếp cấp ứng dụng đầy đủ hay bạn có thể sử dụng ví dụ: Apache? Giải thích thêm những gì bạn cần * Và tại sao. * Cuối cùng, khi bạn có thẻ "websocket", bạn có ý đó hay chỉ là một thẻ không chính xác để sử dụng? –

+2

Nếu không sử dụng * bất kỳ * thư viện nào? Chắc chắn 'socket' sẽ được yêu cầu ở mức tối thiểu? – geoffspear

+0

kiểm tra [tài liệu này] (http://docs.python.org/library/simplehttpserver.html) trang, ở đây tôi giả định rằng "bất kỳ thư viện" là thư viện không được bao gồm trong cài đặt python. –

Trả lời

2

Bạn có thể sử dụng socket programming cho mục đích này. Đoạn sau tạo một ổ cắm tcp và lắng nghe trên cổng 9000 cho các yêu cầu http:

from socket import * 

def createServer(): 
    serversocket = socket(AF_INET, SOCK_STREAM) 
    serversocket.bind(('localhost',9000)) 
    serversocket.listen(5) 
    while(1): 
     (clientsocket, address) = serversocket.accept() 
     clientsocket.send("HTTP/1.1 200 OK\n" 
     +"Content-Type: text/html\n" 
     +"\n" # Important! 
     +"<html><body>Hello World</body></html>\n") 
     clientsocket.shutdown(SHUT_WR) 
     clientsocket.close() 

    serversocket.close() 

createServer() 

Khởi động máy chủ, $ python server.py. Mở http://localhost:9000/ trong trình duyệt web của bạn (hoạt động với tư cách khách hàng). Sau đó, trong cửa sổ trình duyệt, bạn có thể thấy văn bản "Hello World" (phản hồi http).

EDIT ** Đoạn mã trên chỉ được thử nghiệm trên chrome, và như các bạn gợi ý về các trình duyệt khác, mã đã được sửa đổi như sau:

  1. Để thực hiện các phản ứng http-cũng như bạn có thể gửi ở đồng bằng tiêu đề với phiên bản http 1.1, mã trạng thái 200 OK và nội dung kiểu văn bản/html.
  2. Ổ cắm ứng dụng khách cần phải đóng khi nhận được phản hồi vì đó là cổng TCP.
  3. Để đóng đúng client socket, shutdown() cần phải được gọi socket.shutdown vs socket.close

Sau đó mã đã được thử nghiệm trên chrome, firefox (http://localhost:9000/) và curl đơn giản trong thiết bị đầu cuối (cuộn tròn http://localhost:9000).

+2

-1. Bạn đã thử cái này chưa? Điều này không hiệu quả chút nào; đó là một máy chủ socket, nhưng không nói HTTP. – Ashe

+3

Nó không thực sự nói HTTP, vì vậy hầu như mọi trình duyệt sẽ không làm việc với điều này. Nó không hoạt động trong Chrome. Nó chỉ hoạt động trong Firefox nếu bạn nhấn nút Stop. Đây không phải là máy chủ web. – Ashe

+0

Tôi đã sao chép tập lệnh của bạn chạy nó và tôi nhận được một lỗi nói rằng 'một đối tượng giống như byte được yêu cầu không phải là 'str'' làm thế nào để sửa lỗi này? – Simon

8

Bạn nên xem mô-đun SimpleHttpServer (py3: http.server).

Tùy thuộc vào những gì bạn đang cố gắng làm, bạn chỉ có thể sử dụng hoặc kiểm tra nguồn của mô-đun (py2, py3) để biết các ý tưởng.

Nếu bạn muốn nhận được cấp thấp hơn, SimpleHttpServer mở rộng BaseHttpServer (source) để làm cho nó hoạt động.

Nếu bạn muốn nhận được thậm chí nhiều hơn cấp thấp, hãy xem SocketServer (nguồn: py2, py3).

Mọi người thường chạy python như python -m SimpleHttpServer (hoặc python3 -m http.server) nếu họ chỉ muốn chia sẻ thư mục: đó là một máy chủ đơn giản và đầy đủ chức năng.

+0

Tôi có thể nói bạn nên kiểm tra tài liệu HTTP trước. như RFC. – zinking

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