코드를 통해서 확인해보자
### 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란 결과값을 달라지게 만드는 요소를 말한다
예를 들어
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()
플라스크로 웹을 만들어내려면
이러한 요소들이 필요하다
아래의 그림과 같이 미리 디렉터리를 구성하고
파일들을 생성해둔다
🌟 Flask 객체는
폴더 지정을 통해 정적파일과 템플릿 위치를 추적한다
이 말은 앞서 처음 작성한 코드인 hello.py의 설명부분에서도 확인할 수가 있다
Flask객체에
아래의 코드를 통해 확인해본다
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절 메소드를 마무리해야겠다
오늘은 끝!