[Python]
Python을 이용한 간단한 파일공유 웹서버 개발하기

2020. 9. 6. 19:48


728x90

Python의 SimpleHTTPServer를 사용하는 이유

일반적으로 서버는 요청을 처리하고 네트워크를 통해 클라이언트에 데이터를 전달하는 컴퓨터 소프트웨어 또는 하드웨어입니다. 다양한 유형의 서버가 존재하며 가장 일반적인 서버는 웹서버, 데이터베이스 서버, 애플리케이션 서버 및 트랜잭션 서버이다.

Apache, Nginx, Monkey, Jigsaw등 널리 사용되는 웹서버는 간단한 프로젝트를 테스트하기에는 비효율, 비적합하다. 또한 이러한 웹서버를 테스트 서버로 사용하기 위해 개발자는 프로그램 로직 생성에서 서버 설정으로 초점이 변경되기도 한다.

Python의 SimpleHTTPServer 모듈은 위 상황을 포함해 개발자가 간편하고 유용하게 사용할 수 있으며 무엇보다도 파일 공유 웹서버로 사용할 수 있다.

*다만 SimpleHTTPServer는 상용화를 위한 모듈이 아닌 단지 테스트를 위해 사용되는 모듈이며, 이는 공식 문서에서도 주의를 권장하고있다.

SimpleHTTPServer Command line 사용방법

SimpleHTTPServer는 Command line에서 사용할 수 있다. 즉 Windows의 CMD 또는 Linux, Mac의 Terminal Bash 환경에 빠르게 실행시킬 수 있다는것이다.

Python2

$ python -m SimpleHTTPServer 8000

Python3

$ python -m SimpleHTTPServer 8000

해당 명령을 실행하게 되면, 명령을 실행한 디렉토리에서 브라우저를 통해 접근할 수 있다.

위 사진과 같이 서버의 특정 디렉토리의 파일들에 클라이언트가 웹브라우저를 이용해 접근할 수 있다.

이러한 방법은 HTTP를 통해 로컬로 파일을 직접 제공하는 가장 간단한 방법이다.

SimpleHTTPServer 파이썬 코드 사용 방법

단순히 파일만을 제공하는 간단한 웹서버의 경우 이전에 설명했던 Command line에서 SimpleHTTPServer를 실행시키는 방법을 사용해도 되지만, 특정 기능을 커스텀하고싶거나 작동방식의 일부분을 수정해서 사용하기 위해서는 직접적으로 파이썬 코드를 작성하여야 한다.

import http.server
import socketserver

PORT = 8000

handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), handler) as httpd:
    print("Server started at localhost:" + str(PORT))
    httpd.serve_forever()

위 코드 역시 마찬가지로 해당 파이썬 파일이 위치한 경로에서 웹서버를 실행한다.

* Python 3.6 이전 버전에서는 옳바르게 작동하지 않을 수 있다. Python 3.6 이전 버전에서는 socketserver.TCPServer를 지원하지 않는다.

동적인 HTML 반환(HTTP GET 메소드 사용)

import http.server
import socketserver
from urllib.parse import urlparse
from urllib.parse import parse_qs

class MyHttpRequestHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        # Sending an '200 OK' response
        self.send_response(200)

        # Setting the header
        self.send_header("Content-type", "text/html")

        # Whenever using 'send_header', you also have to call 'end_headers'
        self.end_headers()

        # Extract query param
        name = 'World'
        query_components = parse_qs(urlparse(self.path).query)
        if 'name' in query_components:
            name = query_components["name"][0]

        # Some custom HTML code, possibly generated by another function
        html = f"<html><head></head><body><h1>Hello {name}!</h1></body></html>"

        # Writing the HTML contents with UTF-8
        self.wfile.write(bytes(html, "utf8"))

        return

# Create an object of the above class
handler_object = MyHttpRequestHandler

PORT = 8000
my_server = socketserver.TCPServer(("", PORT), handler_object)

# Star the server
my_server.serve_forever()

 

1 2 3 4 5 6 7 8 ··· 45