본문 바로가기

개발

[Python] Flask 테스트 웹 만들기 _ 1편 : HTTP 서버 만들기

1.개발 결과

 Flask를 이용하여 웹 페이지를 구성해보았다.

 

 GET / POST Method로 파라미터를 전달 받아, 사용자에게 다시 표시해주는 임시적인 웹 서버를 만들었다. 앞으로 학습 시 필요한 기능은 추가적으로 개발하기로 하였다.

GET Method 전송 시 URL 내 파라미터가 보인다.
POST Method 전송 시 URL 내 파라미터가 안 보인다.

 

2.개발 목적

 실습할 수 있는 기본 환경 구성을 위한 1단계로, Flask 웹 페이지를 구성해본다.

 

3.개발 사유

 웹, 모바일 앱, 네트워크 및 보안에 대한 학습 시, 필요한 대상을 구축하여 실습해보는 형태로 수행하기 위한 목적으로 개발하였다.

 

4.설계 단계

 1) HTTP 서버 만들기

 2) 서버 요청에 대한 응답 값으로 Hello, World가 아닌 html 페이지로 내려주기

 3) 파라미터를 받아서 표시해주는 로직을 추가 (GET / POST)

 

5.구현 단계

1) 구현 순서

(1) HTTP 서버 만들기

from flask import Flask, render_template, request
import json, ssl, os

app = Flask(__name__)

host_addr = "0.0.0.0"
host_port = "8777"

@app.route("/")
def index():
    return "Hello, World"

if __name__ == "__main__":
    app.debug = True
   # app.run(host=host_addr, port=host_port, ssl_context="adhoc")
    app.run(host=host_addr, port=host_port)

설정된 IP와 Port 접근 시 HTTP 서버가 동작하고 있는 것을 알 수 있었다.

 

(2) 서버 요청에 대한 응답 값으로 Hello, World가 아닌 html 페이지로 내려주기

- app.py

@app.route("/")
def index():
    return render_template("index.html")

- index.html

<!DOCTYPE html>
<html>
<head>
	<title> Index </title>
</head>
<body>
	hi! index.html
</body>
</html>

작성한 index.html 페이지를 내려줌을 알 수 있었다.

 

(3) 파라미터를 받아서 표시해주는 로직을 추가 (GET / POST)

 GET과 POST를 URL로 구분하였으나, methods=["GET", "POST"]로 작성하여 if문으로 구분하여도 된다.

 

- app.py

@app.route("/GET_Param", methods=["GET"])
def get_data():
    get_data = request.args.get("param")
    return render_template("get.html", text=get_data)

@app.route("/POST_Param", methods=["POST"])
def post_data():
    post_data = request.form.get("param")
    return render_template("post.html", text=post_data)

- index.html

<!DOCTYPE html>
<html>
<head>
	<title> Index </title>
</head>
<body>
	hi! index.html
    Get TEST.
    <form action="/GET_Param" method="GET">
    	<input type="text" name="param">
        <input type="submit" value="send">
    <form>
    <br>
    POST TEST.
    <form action="/POST_Param" method="POST">
    	<input type="text" name="param">
        <input type="submit" value="send">
    <form>
</body>
</html>

GET / POST Method 별 처리 결과를 확인해보자.

 

2)소스코드 및 기능 설명

 상세 설명이 필요 없는, 기본적인 소스코드로 주석 내용을 참조하며 필요한 기능을 구현하면 된다.

@app.route("/", methods=[]) // URL 경로 설정 및 접근 가능한 Method를 설정할 수 있다.
def function(): // 해당 URL 경로에서 수행될 함수명
    get_data = request.args.get("g_param") // GET Method의 파라미터를 받아올 시
    post_data = request.form.get("p_param") // POST Method의 파라미터를 받아올 시
    // 해당 URL에서 서버사이드(백엔드)로 동작할 기능을 추가할 수 있다.
    // 예시 : 로그인 기능 구현
    return render_template("get.html", text=get_data) // 응답 페이지 및 페이지 내 전달될 변수

 

3)구현단계에서 발생된 문제점 및 해결 방법

(1) 계층 구조 만들기 (template)

예상 상황 return 으로 render_template 로 선언한  index.html 페이지가 응답하겠지?
문제점 작성된 index.html 페이지를 응답해주지 않음
해결 방법 Linux 환경에서 첫 Flask 였는데, 작성된 메인 웹 서버 python 파일 (app.py)의 하위 경로에 위치 지정 필요
① app.py 경로에 template 폴더 생성
② template 폴더에 작성한 index.html 파일 위치
③ return render_template("inddex.html") 선언 시 정상 동작 확인
④ 별도로 template의 위치를 지정할 수 있음 (추가 확인 필요)

template 폴더가 없거나 별도 경로 지정이 없는 경우 작성된 index.html 파일을 호출하지 못한다.