처음 배우는 플라스크

0

Flask

목록 보기
3/4
post-thumbnail

1.4절 : 플라스크 기초


⭐️ 라우팅이란?

  • URL과 함수를 연결하는 기능을 한다
  • 이를 통해 사용자가 앱의 URL을 기억할 수 있게 돕는다

🌐 설명의 출처는 여기를 클릭

코드를 통해서 확인해보자

### Hello.py ###

from flask import Flask

app = Flask(__name__) # Flask의 인자는 __name__
		      # __name__은 정적 파일과 템플릿을 찾는 데 사용
@app.route('/index')  # '/index'는 접속하는 URL을 의미 
@app.route('/')       # route는 이렇게 둘 이상일 수도 있다

def hello_world():
    return 'Hello, world!'

@app.route('/index')의 '/index'
아래 정의된 hello_world()함수와 연결된다

💡 '/index'로 접속하면 이 URL과 연결된 hello_wolrd()함수의 return값이 브라우저에 그려지는 것이다

이를 직접 확인해봐야겠다

위의 코드를 구동하기 위해서는 간단한 설정이 필요하다

📌 $ export Flask_APP = hello.py
📌 $ export Flask_ENV = development

   # window 환경에서는 export를 set으로 바꿔서 입력하면 됨

차례로 터미널에 입력해준다
입력해도 눈에 들어오는 변화는 없을 것이다

플라스크를 실행하는 명령어는

📌 $ flask run

딱 요거다

그래서 우리가 작성한 hello.py를 flask로 run하기 위해서
Flask_APP을 hello.py로 잡아주는 작업을 한 것 같다
자세한 건 나도 모른다
대충 감은 잡히니까 괜찮다

중요하면 책에서 후술해주겠지

아무튼 flask run으로 웹 서버를 열어준다


이렇게 출력된 채로 상태가 유지될 것이다
빨간색 사각형 박스에 마우스 오버해보면 열 수 있다는 느낌의 그런 표시가 뜬다

Ctrl + 클릭 으로 열어보면

요렇게 뜨는 걸 볼 수가 있다

책에선 창이 두 개 뜨는 걸로 나오는데
나는 하나만 나온다

아무튼 봤으니 괜찮다

열린 브라우저는 뭘 누르든 닫고
터미널에서 실행중인 명령어는 Ctrl + c로 종료해준다

❓ 만약 공인 ip로 접속하고 싶다면?

📌 $ flask run --host=0.0.0.0 --port==5000

이런 식으로 외부 접속을 허락을 수 있고 포트도 변경할 수 있다


⭐️ 디버그 모드

위의 hello.py 코드의 마지막 부분을 살짝 수정한다

### Hello_debug.py ###

from flask import Flask

app = Flask(__name__) # Flask의 인자는 __name__
		      # __name__은 정적 파일과 템플릿을 찾는 데 사용
@app.route('/index')  # '/index'는 접속하는 URL을 의미 
@app.route('/')       # route는 이렇게 둘 이상일 수도 있다

def hello_world():
    return a 	     ❗#'Hello, world!'를 a로 수정

얘도 돌려보면
처음의 코드 입력 결과처럼 링크가 출력된다
그 링크로 들어가면

이렇게 디버그 모드가 실행되는 것을 볼 수 있다
가장 위에 대문짝만하게 NameError라고 표시되고
아랫줄에 에러의 내용을 잡아준다

❗ NameError: global name 'a' is not defined

아주 친절하게 'a'는 정의되지 않았다고 설명해준다
마음에 든다

🧐 set FLASK_ENV = production vs. development
차이점이 뭘까?
모르겠다!


⚡️ path parameter

저자가 갑자기 딴소리를 하고 있다

path parameter를 설명하는데 솔직히 뭐라고 하는지 잘 모르겠고 이걸 이해하자면

path parameter란 결과값을 달라지게 만드는 요소를 말한다

예를 들어

https://www.youtube.com/watch?v=🐱z-9YlsON0u0
https://www.youtube.com/watch?v=🐱C7dPqrmDWxs
https://www.youtube.com/watch?v=🐱u2KnTZa1_WU

이렇게 다 똑같이 가는 척하다가 🐱이후는 그 내용이 다르다
결과를 달라지게 하는 🐱이후의 부분을
path parameter라고 한다

플라스크에서는
string, int, float, path, uuid 등을
path parameter로 사용한다


⭐️ 메서드

  • .method 인자로 허용할 메서드를 정할 수 있다
  • 이 때 서로 다른 메서드를 정할 수 있다
  • request.method 로 서로 다른 메서드를 구분한다

다음은 메서드에 따른 로그인 / 로그인 입력 폼을 보여주는 예제코드이다

### hello_method.py ###

from flask import Flask, request

app = Flask(__name__)

@app.route('/login', method=['GET', 'POST'])
# method 정의

def login():
    # method에 따라 분기
    if request.method == 'POST':
        return do_the_login()
    else:
    	return show_the_login_form()

POST 메서드로 해당 URL에 접속하면:
do_the_login() 함수가 실행되고

GET 메서드로 접속하면:
show_the_login_form() 함수가 실행된다

hello_method.py 코드는 메서드에 따라 분기된다
그리고 분기된다 해도 공통 로직에 포함된다

다음의 예제코드는 위의 예제코드와는 달리
공통 로직을 타지 않아도 될 때(?) 사용한다

### hello_method_distinct.py ###

from flask import Flask, request

app = Flask(__name__)

# 사용할 메서드의 개수만큼 라우팅을 만든다
# 하나의 로직 안에서 작동하는 것이 아니라
# 각기 정의된 로직 안에서 작동한다

@app.route('/login', method=['GET']) 
def login_page():
    return show_the_login_form()
    
@app.route('/login', method=['POST']) 
def login_page():
    return do_the_login()

⭐️ 정적 파일과 템플릿

플라스크로 웹을 만들어내려면

  • 정적파일: *css *js *image 등
  • 템플릿: html

이러한 요소들이 필요하다
아래의 그림과 같이 미리 디렉터리를 구성하고
파일들을 생성해둔다

🌟 Flask 객체는
폴더 지정을 통해 정적파일과 템플릿 위치를 추적
한다

이 말은 앞서 처음 작성한 코드인 hello.py의 설명부분에서도 확인할 수가 있다

Flask객체에

  • static_folder를 지정한다
    이로써 Flask객체가 /static URL로 접근 가능해진다
  • template_folder를 지정한다
    이로써 render_template에서 해당 템플릿 파일(*html)을 찾을 수 있다

아래의 코드를 통해 확인해본다

from flask import Flask, render_template

app = Flask(__name__,
	    static_folder='static',
  	    template_folder='templates')


@app.route('/hello')
def hello():
    return render_template('hello.html')


여기서 이 트리를 코드와 함께 구경해보면
대강 돌아가는 분위기를 알 수가 있다
근데 알아도 그만 몰라도 그만임

아무튼 위의 코드를 $ flask run으로 돌려보니

😐 망했다

내가 왜 망했을까?
30분에서 40분 정도를 헤맸다

문제는
아랫 부분의 @app.route('/hello') 부분이었다

📌 @app.route('< 부분은 브라우저 상의 주소가 들어갈 자리!>*)

망한 화면의 브라우저 주소를 주목해보자

😲 아무것도 적지 않았다

와우! @app.route() 라우팅 메서드의 인자를 제대로 이해하지 못해서 그렇게 헤맸던 것이었다

함께 수업을 듣는 갈매기 사나이의 가르침을 받고서야 나는 이 사실을 깨달았다

화가 잔뜩 나버린 나는

@app.route('/') 이렇게 괄호 안을 비워버리고 출력해내고야 말았다
@app.route('/') **이 놈의 뜻을 제대로 알아먹은 것은 오늘의 엄청난 수확이었다
하루종일 제대로 배운 것이 없는 것 같아서 우울했는데 다행이다

내일은 1.4절 메소드를 마무리해야겠다

오늘은 끝!

0개의 댓글