[Python] Flask

2021. 1. 27. 13:21·Language/Python
반응형
flask

간단한 API 호출을 위한 웹 서버가 필요해서 flask 프레임워크를 사용해 구축하려고 한다. Spring, PHP, nodejs, django 등 많은 프레임워크가 있고 쓸 수도 있겠지만 두 가지 이유에서 flask를 선택했다. 간단하고 빠르게 개발이 가능하고 파이썬 언어를 사용하기 때문이다. 혼자서 개발하고 규모도 크지 않아 적절한 선택이라고 생각한다. flask로 직접 개발해본적은 없지만 쉽게 원하는 기능을 만들 수 있을것 같다.

개발 환경은 ubuntu16.04LTS, python3.6으로 진행했다.

 

모듈 설치

flask도 파이썬 모듈이기 때문에 pip로 설치 가능하다.

pip install flask

 

앱 생성

app.py파일을 만들고 코드를 작성한다.

x
from flask import Flask
app = Flask(__name__)
​
@app.route("/")
def hello():
    return "Hello World!"
​
if __name__ == "__main__":
    app.run()
xxxxxxxxxx
python app.py
  • app.run()을 호출해서 서버를 실행한다.
  • 라우팅은 @app.route("*") 처럼 데코레이터 형태로 구현 가능하다.

위 코드를 실행하면 아래와 같이 창이 생성된다.

 

라우팅

라우팅 구현에 대해 더 상세히 확인해보려 한다. 여러 기능을 수행하는데 필요한 기능이다.

@app.route('/user')
def user():
    return 'user page...'
  • @app.route()에 경로를 추가해준다. 지정한 경로로 접속할 경우 해당 함수가 호출된다.
xxxxxxxxxx
@app.route('/user/<user_name>/<int:user_id>')
def user_info(user_name, user_id):
    return f'name : {user_name}, id : {user_id}'
  • 슬래시(/) 다음에 <> 변수를 지정하고 동일한 이름의 변수를 파라미터에 준다. int:{변수이름}식으로 타입도 지정할 수 있다.

 

Request

HTTP 프로토콜을 최대한 활용하기 위해 REST API 형태로 구성한다. 이를 통해 GET, POST, PUT, DELETE 같은 요청 메소드에 따라 여러 기능을 구분해 개발한다. 각 요청 메소드를 flask에서는 어떻게 처리하는지 봤다.

x
# ...
​
from flask import request
​
@app.route('/student', methods=['GET'])
def student_get():
    stduent_name = request.args.get('name')
    return f"Get Request! {stduent_name}"
​
@app.route('/student', methods=ㄴ['POST'])
def student_post():
    student = request.args.get('name')
    student = request.form['name']
    return "Post Request!"
  • app.route의 methods 인자에 GET, POST, PUT, DELETE를 지정해 처리할 메소드를 선택한다. 배열 형태로 전달되기 때문에 한 함수로 여러 타입의 메소드를 처리할 수 있다.

  • request 모듈을 통해 요청 파라미터를 가져온다.

    • GET의 경우 URL의 뒤에 ?key1=value1&key2=value2 형태로 파라미터가 전달된다. 이 파라미터들을 request.args를 통해 가져온다.
    • POST의 경우 request.form을 통해 form 타입으로 전송된 요청 파라미터를 받는다.
    • POST 요청을 보낼때도 GET처럼 URL의 뒤에 요청 파라미터를 받을 수 있다. 이 때도 동일하게 request.args를 사용한다.

JSON

요청에 JSON 타입을 보내는 경우 아래와 같이 처리할 수 있다.

xxxxxxxxxx
@app.route('/student/json', methods = ['POST'])
def student_json():
    values = request.get_json()
    print(values)
    return values
  • request.get_json()을 통해 요청의 body에 들어있는 json 값을 가져온다.

 

Response

클라이언트에서 요청을 보내면 서버에서는 그에 따른 응답 메시지를 보낸다. 클라이언트에 보내는 내용은 HTML 페이지, 문자열, JSON, 파일 등 다양하다. HTML 파일과 JSON 응답을 보내는 방법은 아래와 같다.

HTML

정적 파일들은 프로젝트 디렉토리 안에 templates라는 폴더 안에 생성한다. html, css, js 파일들을 여기에 넣어줘야 한다.

x
├── templates
│   ├── css
│   │   └── style.css
│   ├── js
│   │   └── main.js
│   └ index.html
└── app.py # 플라스크 앱 파일

위처럼 정적 파일을 구성한다.

x
from flask import Flask, render_templates # render_templates 추가
​
# ...
​
@app.route("/")
def hello():
    return render_templates("index.html")
​
# ...
​
  • render_templates함수로 html 파일을 지정한다.

JSON

flask 모듈에 jsonify 함수를 사용하면 간단히 JSON 형태의 응답을 보낼 수 있다.

xxxxxxxxxx
@app.route("/json")
def json_res():
    data = {
        "name": "Tom",
        "age": 18,
        "grade": 3.6
    }
    return jsonify(data)
    # return jsonify(name="Tom", age=18, grade=3.6) # 동일한 결과
  • 파이썬의 dictionary 자료형을 jsonify에 전달하면 JSON 응답을 만들 수 있다.
  • jsonify의 인자로 key=value를 전달하는 방식으로도 응답을 생성할 수 있다.

 


위 내용들을 확인하면 간단히 서버 구축이 가능할 것 같다.

반응형
저작자표시 비영리 변경금지 (새창열림)
'Language/Python' 카테고리의 다른 글
  • [Python] Queue
  • [Python] GIL
  • [Python] 함수 인자
  • [Python] Pyenv
덴마크초코우유
덴마크초코우유
IT, 알고리즘, 프로그래밍 언어, 자료구조 등 정리
    반응형
  • 덴마크초코우유
    이것저것끄적
    덴마크초코우유
  • 전체
    오늘
    어제
    • 분류 전체보기 (117)
      • Spring Framework (2)
        • Spring (2)
        • JPA (2)
        • Spring Security (0)
      • Language (51)
        • Java (11)
        • Python (10)
        • JavaScript (5)
        • NUXT (2)
        • C C++ (15)
        • PHP (8)
      • DB (16)
        • MySQL (10)
        • Reids (3)
        • Memcached (2)
      • 개발 (1)
      • 프로젝트 (2)
      • Book (2)
      • PS (15)
        • 기타 (2)
        • 백준 (2)
        • 프로그래머스 (10)
      • 딥러닝 (8)
        • CUDA (0)
        • Pytorch (0)
        • 모델 (0)
        • 컴퓨터 비전 (4)
        • OpenCV (1)
      • 기타 (16)
        • 디자인패턴 (2)
        • UnrealEngine (8)
        • ubuntu (1)
        • node.js (1)
        • 블로그 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    pytorch
    MySQL
    php
    Unreal
    게임
    Unreal Engine
    자바
    프로그래머스
    파이썬
    C
    웹
    언리얼엔진4
    NUXT
    Python
    redis
    블루프린트
    memcached
    mscoco
    FPS
    CPP
    C++
    클래스
    딥러닝
    map
    게임 개발
    알고리즘
    JavaScript
    PS
    JS
    select
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
덴마크초코우유
[Python] Flask
상단으로

티스토리툴바