Python

Python - 15. 웹서버

꿀먹는매미 2021. 3. 17. 10:42

p.407 웹서버만들기

 

httpserver -> 서버 만들 수 있음

 

서버 띄우는 2가지 방법

  • SimpleHTTPRequestHandler
  • BaseHTTPRequestHandler

 

cmd 창에서 python -m http.server --cgi 8080 입력

방화벽을 허용해준다.

 

브라우저에서 127.0.0.1:8080 으로 접속해보면 서버의 디렉토리 확인가능

실행중 상태

 

  • SimpleHTTPRequestHandler
# server01.py
from http.server import HTTPServer, SimpleHTTPRequestHandler

#print( dir( HTTPServer ) )
#print( dir( SimpleHTTPRequestHandler ) )

httpd = HTTPServer( ( '127.0.0.1', 8000 ), SimpleHTTPRequestHandler )
print( '서버시작' )
# 무한 루프
httpd.serve_forever()
print( '서버종료' )

 

 

 

 

  • BaseHTTPRequestHandler

html 태그 출력

path 출력 -> parameter / url

# server02.py
from http.server import HTTPServer, BaseHTTPRequestHandler

class MyHTTPRequestHandler( BaseHTTPRequestHandler ):
    def do_GET(self):
        print( 'get 방식 요청' )
        
        self.send_response( 200 )
        self.send_header( 'Content-type', 'text/html; charset=utf-8' )
        self.end_headers()
        
        # parameter / url
        print( self.path )
        
        self.send_body1()
    
    def send_body1(self):    
        html = '''
        <!doctype html>
        <html lang=ko>
        <head>
        <meta charset="utf-8" />
        </head>
        <body>
            Hello Python, 안녕 파이썬
        </body>
        </html>
        '''
        
        self.wfile.write( html.encode( 'utf-8' ) )
        
    def do_POST(self):
        print( 'post 방식 요청' )
        
# public static void main()
if __name__ == '__main__' :
    httpd = HTTPServer( ( '127.0.0.1', 8000 ), MyHTTPRequestHandler )
    print( '서버시작' )
    httpd.serve_forever()
    print( '서버종료' )

 

 

  • controller 방식 구현

path를 urlparse로 넣고 분해해서 keyword와 value로 분리

value 값에 따라서 출력 다르게 나오도록 컨트롤러(if문 구성)

# server02.py
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse

class MyHTTPRequestHandler( BaseHTTPRequestHandler ):
    def do_GET(self):
        print( 'get 방식 요청' )
        
        self.send_response( 200 )
        self.send_header( 'Content-type', 'text/html; charset=utf-8' )
        self.end_headers()
        
        # parameter / url
        print( self.path )
        
        parts = urlparse( self.path )
        keyword, value = parts.query.split( '=', 1 )
        print( keyword, value )
        
        # controller
        if value == 'value1' :
            self.send_body1()
        elif value == 'value2' :
            self.send_body2()
        else:
            pass
    
    def send_body1(self):    
        html = '''
        <!doctype html>
        <html lang=ko>
        <head>
        <meta charset="utf-8" />
        </head>
        <body>
            Hello Python, 안녕 파이썬1
        </body>
        </html>
        '''
        
        self.wfile.write( html.encode( 'utf-8' ) )
        
    def send_body2(self):    
        html = '''
        <!doctype html>
        <html lang=ko>
        <head>
        <meta charset="utf-8" />
        </head>
        <body>
            Hello Python, 안녕 파이썬2
        </body>
        </html>
        '''
        
        self.wfile.write( html.encode( 'utf-8' ) )
        
    def do_POST(self):
        print( 'post 방식 요청' )
        
# public static void main()
if __name__ == '__main__' :
    httpd = HTTPServer( ( '127.0.0.1', 8000 ), MyHTTPRequestHandler )
    print( '서버시작' )
    httpd.serve_forever()
    print( '서버종료' )

주소에 query 입력
path가 표시되고 query가 분리되서 추출됨