내가 보려고 만든 블로그
<Python> Framework 안쓰고 Api 서버 만들기 본문
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
'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 |