2016-10-01 18 views
5

đây là Python3 dự án hiearchy tôi:Làm thế nào để chạy một máy chủ http phục vụ một đường dẫn cụ thể?

projet 
    \ 
    script.py 
    web 
    \ 
    index.html 

Từ script.py, tôi muốn chạy một máy chủ http mà cung cấp nội dung của thư mục web.

Here được đề nghị mã này để chạy một máy chủ http đơn giản:

import http.server 
import socketserver 

PORT = 8000 
Handler = http.server.SimpleHTTPRequestHandler 
httpd = socketserver.TCPServer(("", PORT), Handler) 
print("serving at port", PORT) 
httpd.serve_forever() 

nhưng điều này thực sự phục vụ project, không web. Làm cách nào tôi có thể chỉ định đường dẫn của thư mục mà tôi muốn phân phát?

+0

Did bạn thực sự đọc phần còn lại của tài liệu? –

Trả lời

7

https://docs.python.org/3/library/http.server.html#http.server.SimpleHTTPRequestHandler

lớp này phục vụ tập tin từ thư mục hiện hành và dưới, trực tiếp lập bản đồ cấu trúc thư mục để yêu cầu HTTP.

Vì vậy, bạn chỉ cần thay đổi thư mục hiện hành trước khi bắt đầu máy chủ - xem os.chdir

ví dụ:

import http.server 
import socketserver 
import os 

PORT = 8000 

web_dir = os.path.join(os.path.dirname(__file__), 'web') 
os.chdir(web_dir) 

Handler = http.server.SimpleHTTPRequestHandler 
httpd = socketserver.TCPServer(("", PORT), Handler) 
print("serving at port", PORT) 
httpd.serve_forever() 
+0

Cảm ơn bạn! Lưu ý: Tôi đã thêm thử: 'httpd.serve_forever(); ngoại trừ KeyboardInterrupt: pass; httpd.server_close() 'để thực sự đóng cổng. – roipoussiere

4

Nếu bạn chỉ muốn phục vụ tập tin tĩnh bạn có thể làm điều đó bằng cách chạy SimpleHTTPServer mô-đun:

python -m SimpleHTTPServer 

Bằng cách này bạn không cần phải viết bất kỳ tập lệnh nào.

2

Chỉ cần cho đầy đủ, dưới đây là cách bạn có thể thiết lập các lớp máy chủ thực tế để phục vụ tập tin từ một thư mục tùy ý:

try 
    # python 2 
    from SimpleHTTPServer import SimpleHTTPRequestHandler 
    from BaseHTTPServer import HTTPServer as BaseHTTPServer 
except ImportError: 
    # python 3 
    from http.server import HTTPServer as BaseHTTPServer, SimpleHTTPRequestHandler 


class HTTPHandler(SimpleHTTPRequestHandler): 
    """This handler uses server.base_path instead of always using os.getcwd()""" 
    def translate_path(self, path): 
     path = SimpleHTTPRequestHandler.translate_path(self, path) 
     relpath = os.path.relpath(path, os.getcwd()) 
     fullpath = os.path.join(self.server.base_path, relpath) 
     return fullpath 


class HTTPServer(BaseHTTPServer): 
    """The main server, you pass in base_path which is the path you want to serve requests from""" 
    def __init__(self, base_path, server_address, RequestHandlerClass=HTTPHandler): 
     self.base_path = base_path 
     BaseHTTPServer.__init__(self, server_address, RequestHandlerClass) 

Sau đó, bạn có thể thiết lập bất kỳ đường dẫn tùy ý trong mã của bạn:

web_dir = os.path.join(os.path.dirname(__file__), 'web') 
httpd = HTTPServer(web_dir, ("", 8000)) 
httpd.serve_forever() 
Các vấn đề liên quan