flask docs에서 Flask는 Werkzeug와 Jinja2 라이브러리에 의존적이다.
Werkzeug는 웹 어플리케이션과 다양한 서버 사이의 개발과 배포를 위한 표준 파이썬 인터페이스인 WSGI를 구현한 툴 킷이다.
Jinja2는 HTML 템플릿을 렌더링하는 템플릿엔진이다.
Docs에서는 다양한 파이썬 환경에서 사용할 경우를 대비해 가상환경에서 Flask를 실행하는 것을 권장하지만 기본적인 구조를 알기 위해 Local에서 진행한다.
가상 현실 진행을 원한다면 https://flask-docs-kr.readthedocs.io/ko/latest/installation.html#virtualenv 에서 window와 linux, mac OS 에 맞는 진행을 하면 된다.
from flask import Flask
app = Flask(__name__)
@app.route('/)
def hello_world():
return 'Hello World'
if __name__ == '__main__':
app.run()
Flask로 서버를 띄우기 위한 가장 기초적인 코드이다.
참고로 .py 의 이름은 flask.py로 호출하면 안된다. 왜냐하면 Flask 자체와 충돌이 나기 때문이다.
기본적인 Flask 실행 서버는 local에서 5000번대로 실행된다.
코드 해석
1. Flask class Import 하기
2. Flask class의 인스턴스 생성한다. 인자로 모듈이나 패키지의 이름을 넣는다. 이 행위는 플라스크에서 템플릿이나 정적파일을 찾을 때 필요하다.
3. route() 데코레이터를 사용하여 Flask에게 어떤 URL이 작성한 함수를 실행시켜주는지 알려준다.
@app.route('/') : root 페이지
4. route를 이용하여 root페이지에서 하는 동작을 함수로 정의함
5. 최종적으로 run() 함수를 이용하여 개발한 어플리케이션을 로컬 서버로 실행.
if __name__ == '__main__' : 소스 파일을 모듈이 아닌 python 인터프리터를 이용해 직접 실행
이 문장은 실행한 서버가 현재 동작되는 유일한 서버라는 것을 보장
실행된 서버를 중지하려면 Ctrl + C 버튼을 누르면 된다.
위의 서버를 실행했다면, 그 서버는 네트워크 상에 있는 다른 컴퓨터에서 접근이 안되고 로컬 서버에서만 접근이 가능
만약 네트워크 상의 사용자들을 신뢰한다면 debug모드를 해제하거나 다음의 코드처럼 작성하여 서버의 접근을 오픈할 수 있다.
debug 모드 해제 : app.debug = True or app.run(debug=True)
- 또한, debug모드를 사용하면 개발 중 수정한 사항을 실시간으로 반영되어 서버가 자동으로 재가동된다.
서버 접근 오픈 : app.run(host='0.0.0.0')
위의 변경은 모든 public IP를 접근가능하도록 설정한다.
라우팅
현대 웹 어플리케이션은 잘 구조화된 URL로 구성되있다. 이것으로 사람들은 URL을 쉽게 기억할 수 있고, 열악한 네트워크 연결 상황하의 기기들에서 동작하는 어플리케이션에서도 사용하기 좋다. 사용자가 인덱스 페이지를 거치지 않고 바로 원하는 페이지로 접근할 수 있다면, 사용자는 그 페이지를 좋아할 것이고 다시 방문할 가능성이 커진다.
위의 route() 데코레이터는 함수와 URL을 연결해준다.
예시 :
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
return 'Hello World'
URL
1. localhost:5000/
2. localhost:5000/hello
변수 규칙
다른 서버 프로그램들의 변수를 넣는 형식과 같이 Flask에서는 <>안에 변수를 넣어 그 값을 함수의 키워드 인수로 받아들인다. 또한, 선택적으로 규칙을 표시하여 변환기를 추가할 수 있다.
제공하는 변환기
| int | 정수 허용 |
| float | int와 같지만 부동 소수점 값의 경우 |
| path | 기본값과 유사하지만 슬래시도 허용한다. |
두 가지 예
@app.route('/user/<username>') # <username> : 변수
def show_user_profile(username):
#show the user profile for that user
return 'User %s' % username
@app.route('/post/<int:post_id>') #<int:post_id> : 정수 값인 post_id
def show_post(post_id):
# show the post with the given id, the id is an integer
return 'Post %d' % post_id
슬래시, /
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
이 둘은 비슷해 보이지만, URL 정의에 있어서 뒷 슬래시(trailing slash) 사용이 다르다.
첫 번째, projects 끝 점에 대한 정규 URL은 뒷 슬래쉬를 포함한다. 여기서 파일 시스템의 폴더와 유사하다. 뒷 슬래쉬 없이 URL에 접근하면 Flask가 뒷 슬래쉬를 가진 정규 URL로 고쳐준다.
두 번째, URL은 Unix 계열의 파일의 경로명처럼 뒷 슬래쉬 없이 정의됐다. 이 경우 뒷 슬래쉬를 포함해서 URL에 접근하면 404 Error가 나온다.
이것은 사용자가 뒷 슬래쉬를 잊어버리고 페이지에 접근했을때 상대적인 URL이 문제없이 동작하게한다. 이 방식은 아파치 및 다른 서버들이 동작하는 방식과 일치한다. 또한, URL을 유일하게 유지할 것이고, 검색엔진이 같은 페이지를 중복해서 색인하지 않도록 도와준다.
참고 : https://flask-docs-kr.readthedocs.io/ko/latest/quickstart.html