IT

특정 경로를 제공하는 http 서버를 어떻게 실행합니까?

itgroup 2023. 6. 22. 21:42
반응형

특정 경로를 제공하는 http 서버를 어떻게 실행합니까?

다음은 제 Python3 프로젝트 계층 구조입니다.

projet
  \
  script.py
  web
    \
    index.html

부터script.py나는 콘텐츠를 제공하는 http 서버를 실행하고 싶습니다.web폴더를 누릅니다.

간단한 http 서버를 실행하기 위해 이 코드를 제안합니다.

import http.server
import socketserver

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

하지만 이것은 실제로 도움이 됩니다.project,것은 아니다.web서비스할 폴더의 경로를 지정하려면 어떻게 해야 합니까?

Python 3.7에서는 다음과 같은 인수를 사용할 수 있습니다.

import http.server
import socketserver

PORT = 8000
DIRECTORY = "web"


class Handler(http.server.SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=DIRECTORY, **kwargs)


with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

명령행에서 다음을 수행합니다.

python -m http.server --directory web

좀 이상해지려고 하는...임의 디렉터리에 대한 핸들러를 만들 수 있습니다.

def handler_from(directory):
    def _init(self, *args, **kwargs):
        return http.server.SimpleHTTPRequestHandler.__init__(self, *args, directory=self.directory, **kwargs)
    return type(f'HandlerFrom<{directory}>',
                (http.server.SimpleHTTPRequestHandler,),
                {'__init__': _init, 'directory': directory})


with socketserver.TCPServer(("", PORT), handler_from("web")) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

정적 파일만 제공하려면 Simple을 실행하면 됩니다.python 2를 사용하는 HTTPS 서버 모듈:

 python -m SimpleHTTPServer

또는 파이썬 3과 함께:

 python3 -m http.server

이렇게 하면 스크립트를 작성할 필요가 없습니다.

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

이 클래스는 현재 디렉터리 이하의 파일을 제공하여 디렉터리 구조를 HTTP 요청에 직접 매핑합니다.

따라서 서버를 시작하기 전에 현재 디렉토리를 변경하면 됩니다. 참조

예:

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()

명령행을 실행할 수도 있습니다.

python3 -m http.server -d web 8000

완전성을 위해 임의 디렉터리에서 파일을 제공하도록 실제 서버 클래스를 설정하는 방법은 다음과 같습니다.

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)

그런 다음 코드에 임의 경로를 설정할 수 있습니다.

web_dir = os.path.join(os.path.dirname(__file__), 'web')
httpd = HTTPServer(web_dir, ("", 8000))
httpd.serve_forever()

Python 3+에는 더 짧은 방법이 있습니다.

import functools
    
Handler = functools.partial(http.server.SimpleHTTPRequestHandler, directory='/my/dir/goes/here')

특정 디렉토리에서 쉽게 서비스할 수 있는 또 다른 방법입니다.

정말로 설정만 하면 되기 때문에directory의 매개 변수SimpleHTTPRequestHandlerfunctools.dll을 사용하여 클래스를 인스턴스화하지 않고 핸들러 클래스를 준비할 수 있습니다.

from functools import partial
from http.server import HTTPServer, SimpleHTTPRequestHandler
from pathlib import Path


def start_httpd(directory: Path, port: int = 8000):
    print(f"serving from {directory}...")
    handler = partial(SimpleHTTPRequestHandler, directory=directory)
    httpd = HTTPServer(('localhost', port), handler)
    httpd.serve_forever()
    

최신 웹 정적 서버가 필요하다면,
deno는 대안입니다.file server아무 것도 없이code.

단일 라인으로 deno 설치

https://github.com/denoland/deno_install#deno_install

설치하다file server외줄로

deno install --allow-net --allow-read https://deno.land/std@0.125.0/http/file_server.ts

거부권을 사용합니다.file-server

file_server . --port=<port>
# Downloading https://deno.land/std@0.125.0/http/file_server.ts...
# HTTP server listening on http://0.0.0.0:<port>/

자세한 내용은 https://deno.land/manual/discovery/file_server#codestdhttpcode-file-server 사용하기

언급URL : https://stackoverflow.com/questions/39801718/how-to-run-a-http-server-which-serves-a-specific-path

반응형