내가 보려고 만든 블로그

<Python> Framework 안쓰고 Api 서버 만들기 본문

Python | Web/Python

<Python> Framework 안쓰고 Api 서버 만들기

정의김 2022. 8. 20. 13:58

Django나 플라스크 없이 간단하게 api 서버를 만드는 법 정리.

먼저, 정적 웹서버를 띄우는법은 http.server 클래스를 이용하면 됨. 

python3 -m http.server {PORT번호}

와 같은 형식으로 쉘에서 실행해주면 다음과 같이 index.html 혹은 index.hml 파일을 디렉토리내에서 찾아서 html파일을 리턴하게 된다.

만일 index.html 파일이 없을 경우 커맨드를 실행한 디렉토리의 파일들을 보여주게 됨.

 

다음으로 특정 엔드포인트 (test) 에 접근했을때 test.htm (파일) 을 리턴하도록 만들어 볼 것이다. 

server.py라는 파일을 다음과 같이 작성하고. 같은 디렉토리내에 test.html 을 자유롭게 만들어주면 된다.

import http.server
import socketserver

class myhandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/test':
            self.path = 'test.html'
        return http.server.SimpleHTTPRequestHandler.do_GET(self)

PORT = 8000
handler = myhandler

myserver = socketserver.TCPServer(("",PORT),handler)
myserver.serve_forever()

먼저 엔드포인트를 호출했을때 어떻게 처리해줄지를 정할 myhandler클래스를 만들어준다. 

http.server.SimpleHTTPRequestHandler 의 do_GET은 get메소드를 통해 요청이 들어왔을때 현재 작업중인 디렉토리를 기준으로 상대경로를 찾아 파일을 제공해준다. 

handler를 정의해 줬으면 socketserver.TCPServer()를 통해 호스트, 포트, 그리고 만들어둔 핸들러를 지정해준 후 서빙하면 된다.

(참고: ""  = localhost 임. )

근데 찾아보니까 socketserver.TCPServer 외에 HTTPServer 클래스등을 통해서 서빙해도 된다. 

이제 python3 server.py를 통해 서버를 실행하고 지정한 호스트 , 포트로 접속해주면 다음과 같이 test.html을 리턴함 . 

 

 

마지막으로 특정 엔드포인트로 접근했을때 날짜를 json형태로 보여주는 api서버를 만들어보자.

import json
from http.server import HTTPServer, BaseHTTPRequestHandler
from datetime import datetime

class RequestHandler(BaseHTTPRequestHandler):

    def do_time(self):
        self.send_response(200)
        self.send_header("Set-Cookie", "foo=bar")
        self.end_headers()
        json_string =json.dumps({'now':str(datetime.now())})

        # solution 1
        self.wfile.write(bytes(json_string,'utf-8'))

    def do_GET(self):
        request_path = self.path
        if request_path == '/time':
            self.do_time()

    def do_POST(self):
        request_path = self.path
        request_headers = self.headers
        self.send_response(200)
        self.send_header("Set-Cookie", "foo=bar")
        self.end_headers()
        json_string =json.dumps({'now':str(datetime.now())})
        self.wfile.write(bytes(json_string,'utf-8'))

def main():
    port = 9004
    print('Listening on localhost:%s' % port)
    server = HTTPServer(('', port), RequestHandler)
    server.serve_forever()


if __name__ == "__main__":
    main()
~

간단히 설명하자면 /time 엔드포인트를 호출하면 do_time이라는 메소드가 실행되게 된다.  do_time이라는 메소드는 datetime 모듈을 이용해서 시간을 찍고 시간을 json형태로 덤프하고 최종적으로  wfile.write를 통해 바이트형식으로 보내주게 된다. 

만일 포스트 방식을 쓰고 싶으면 do_get 대신 do_post 해주기만 하면 끝. 리퀘스트를 보내면 다음과 같이 잘 전달되는거 확인.

 

전체코드는 여기

https://github.com/todtjs92/Python/tree/master/API_server

 

GitHub - todtjs92/Python: 파이썬으로 이것 저걱

파이썬으로 이것 저걱. Contribute to todtjs92/Python development by creating an account on GitHub.

github.com

 

'Python | Web > Python' 카테고리의 다른 글

<Python> pydantic  (0) 2022.10.15
<Python> typing  (0) 2022.10.14
<Python> Socket 통신으로 간단한 채팅 프로그램 만들기  (0) 2022.07.13
<파이썬> Decorator 란?  (0) 2021.08.15
<파이썬> Descriptor  (0) 2021.08.08