본문 바로가기

카테고리 없음

[Flask] 플라스크가 뭘까? - 5.추가

  • 간단한 예
  • 플라스크의 특징
  • request 이용하기

0. 간단한 예

from flask import Flask
app = Flask(__name__)

@app.route("/")
def home():
    return "<h1>안녕하세요!</h1>"

간단한 예

 * Serving Flask app 'main.py' (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
 * Restarting with stat
127.0.0.1 - - [17/Jun/2022 09:52:51] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [17/Jun/2022 09:52:51] "GET /favicon.ico HTTP/1.1" 404 -
127.0.0.1 - - [17/Jun/2022 09:54:03] "GET / HTTP/1.1" 200 -

주소 : 127.0.0.1:5000(개인 pc 로컬 주소)

상태 : 127.0.0.1 - - [날짜와 시간] "GET / HTTP/1.1" 200 -

(200뒤에 Reason-Pharse을 포함하고 있다.)

리소스를 가져왔다. 200 - 요청성공

1. 플라스크의 특징

1. 명확한 애플리케이션 객체

WSGI을 기반으로 한 파이썬 웹 애플리케이션은 핵심적인 호출가능한 객체를 가지고 이 객체가 실질적인 애플리케이션을 실행시킨다.

플라스크(Flask) 또한 WSGI 기반이므로 호출가능한지 점검하는 객체가 있고
그 객체가 실직적인 애플리케이션을 실행시키는 인스턴스이며 class Flask 의 인스턴스이다.

각각의 플라스크 앱은 아래의 예시처럼 클래스 Flask 의 인스턴스를 만들어야하고 모듈의 이름을 할당해야한다.

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello World!'

아니면 아래와 같이 작성해야하는데 별로 추천하지 않는다.

from hypothetical_flask import route

@route('/')
def index():
    return 'Hello World!'

1) 한번에 하나의 인스턴스를 요구한다.

하나의 앱 객체로 여러개의 가짜 앱들이 스택구조로 쌓여 있을 수 있는데 이러면 나중에 문제가 생길 수 있다.

왜냐면 플라스크는 마이크로 프레임워크이라 다중 앱을 실시하기에 무리가 있다.

 

다만 unit test하는 경우와

특정 동작을 변경하기 위해 기본클래스(Flask)을 하위 클라스로 지정하는 경우를 제외하는데

미리 생성된 개체이므로 해킹없이는 불가능한 경우이다.

2) 패캐지 이름

보통 Flask 로 인스턴스를 만들 때 패키지 이름으로 __name__ 을 사용하는데

이 패키지에 해당하는 정보에 따라 관련된 정보와 모듈을 적절하게 불러오기 위해서다.

 

이 패키지 경우에 템플릿(templates) 와 정적(static) 파일이 저장된 위치를 파악 할 수 있도록 한다.

그럼 나중에 html 파일이나 css , js파일을 '경로불러오기' 없이 가져올 수 있다.

from flask import Flask
app = Flask(__name__)

만일 하나의 프로세서에 다중 앱을 실행하는 경우 경로불러오기는 사용이 안될수 도 있다.

그래서 위처럼 명확한 객체 설정이 필요하다.


2. 라우팅 시스템 : Werkzeug .route("/")

라우팅이란 서버가 클라이언트가 주고 받는 경로를 효율적으로 지정하는 동작을 뜻하는데

플라스크(flask)는 Werkzeug 라는 라우팅시스템을 이용한다.

내 맘대로 경로를 선언하더라도 작동할 수 있다.

 

하나의 앱에 여러 모듈로 분할될 때 데코레이터@app.route("/")가 정의 되지 않는 경우

순서대로 실행될수 있기 때문에자의적으로 경로를 선언하는 라우팅 시스템을 이용한다.


2. Request 이용하기

client 가 server에게 데이터를 주고 받는 것은 웹 애플리케이션의 가장 중요한 기능이다.

플라스크에서는 이를 위해 전역객체 request을 사용하는데

(플라스크의 몇몇의 특정 객체는 전역개체이다. 하지만 자주 사용되는 종류는 아니다.)

 

요청이 들어오면 웹서버는 새로운 스레드를 만든다. 만약 플라스크가 내부의 요청을 시작하면 현재의 스레드가 활성임을 파악하고 현재 앱과 WSGI 환경을 해당 스레드에 바인딩한다. 하나의 응용 프로그램이 다른 프로그램을 동시에 사용하지 않도록 도와준다.

 

두 가지의 방식을 사용할 수 있는데

메소드 대상 불러오는 객체
Application configuration variables, database connection , logger current_app,
g
Request URL, HTTP method, headers, request data, session info request,
session

예시

from flask import request

with app.test_request_context('/hello', method='POST'):
    # now you can do something with the request until the
    # end of the with block, such as basic assertions:
    assert request.path == '/hello'
    assert request.method == 'POST'

with 블럭안에서 request를 사용할 수 있다. 

라우터 경로를 "/hello"로 설정하고 method로 "POST"를 지정한다는 뜻이다.

.test_request_context("")

만일 unit testing 을 하기 위해서는 위와 같은 함수를 이용하는 것이 좋다.

위 코드를 아래와 같이 사용할 수도 있다.

with app.request_context(environ):
    assert request.method == 'POST'

1 ) 데이터 요청하기

https://flask.palletsprojects.com/en/2.1.x/api/#flask.Request

 

API — Flask Documentation (2.1.x)

rv (Union[Response, str, bytes, Dict[str, Any], Tuple[Union[Response, str, bytes, Dict[str, Any]], Union[Headers, Mapping[str, Union[str, List[str], Tuple[str, ...]]], Sequence[Tuple[str, Union[str, List[str], Tuple[str, ...]]]]]], Tuple[Union[Response, st

flask.palletsprojects.com

플라스크내 request 모듈 불러오기

from flask import request

request.method

request.form['값']

@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
        else:
            error = 'Invalid username/password'
    # the code below is executed if the request method
    # was GET or the credentials were invalid
    return render_template('login.html', error=error)

만일 key 의 값이 없다면 keyerror 가 발생한다.

따라서 if 조건문으로 존재하지 않는 경우에 행당하는 메세지를 보낸다.

 

플라스크의 기본 URL 은 172.0.0.1.5000에서

만일 클라이언트가 보내는 정보를 플라스크가 받아 들이는 경우의 url은

172.0.0.1.5000/some?key=datafromclient [URL (?key=value)] 와 같이 바뀐다.

 

이런 경우에는 객체 = request.args.get('key', '')

searchword = request.args.get('key', '')