Flask는 Werkzeug와 Jinja2 라이브러리에 의존합니다. Werkzeug는 웹어플리케이션과 다양한 서버 사이의 개발과 배포를 위한 표준 파이썬 인터페이스인 WSGI를 구현한 툴킷입니다. 반면 Jinja2는 HTML 템플릿을 렌더링 하는 템플릿 엔진입니다.
Flask를 사용하는 방법은 여러가지가 있습니다. 그 중 가장 강력한 사용법은 virtualenv을 사용하는 것입니다. 하지만 해당 글은 사용하지 않습니다.
Python에서 Flask를 설치하지 않았다면 pip를 이용해 먼저 설치하도록 합니다.
$ pip install Flask
Flask의 기본 어플리케이션은 다음과 같은 모습을 가지고 있습니다.
from flask from Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'hello world!'
if __name__ == '__main__':
app.run()
위의 코드가 어떤 일을 했는지 궁금하다면 더보기를 클릭하시면 됩니다.
① 임포트한 Flask class의 인스턴스가 우리의 WSGI 어플리케이션이 됩니다. 첫번째 인자는 이 어플리케이션의 이름이며 만약 단일모듈을 사용한다면 __name__을 사용해야합니다. 이유는 파일이 어플리케이션으로 실행되는지 혹은 모듈로 임포트되는지에 따라 이름이 달라지기 때문입니다.
classflask.Flask(import_name, static_path=None, static_url_path=None, static_folder='static', template_folder='templates', instance_path=None, instance_relative_config=False)
- import_name – 애플리케이션 패키지의 이름
- static_url_path – 웹에서 정적 파일에 대해 다른 경로를 지정하는 데 사용할 수 있습니다. static_folder 폴더 의 이름이 기본값입니다 .
- static_folder – static_url_path 에서 제공되어야 하는 정적 파일이 있는 폴더입니다 . 'static' 응용 프로그램의 루트 경로에 있는 폴더가 기본값입니다 .
- template_folder – 애플리케이션에서 사용해야 하는 템플릿이 포함된 폴더입니다. 'templates'응용 프로그램의 루트 경로에 있는 폴더가 기본값입니다 .
- instance_path – 애플리케이션의 대체 인스턴스 경로입니다. 'instance'기본적으로 패키지 또는 모듈 옆의 폴더는 인스턴스 경로로 간주됩니다.
- instance_relative_config – True 로 설정하면 구성을 로드하기 위한 상대 파일 이름이 애플리케이션 루트 대신 인스턴스 경로에 상대적인 것으로 간주됩니다.
② route() 데코레이터는 Flask에게 어떤 URL이 우리가 작성한 함수를 실행시키는지 알려주는 역할을 합니다. 작성된 함수의 이름은 그 함수에 대한 URL을 생성하는데 사용되며, 그 함수는 사용자 브라우저에게 보여줄 메시지를 리턴합니다.
③ 최종적으로 run() 함수를 사용해서 개발한 어플리케이션을 로컬서버로 실행합니다. 여기서
if __name__ == '__main__' :
해당 구문은 실행한 서버가 현재 동작되는 유일한 서버라는 것을 보장합니다.
❗외부에서 접근 가능한 서버
위의 서버를 실행했다면, 그 서버는 네트워크상에 있는 다른 컴퓨터에서는 접근이 안되고 로컬서버에서만 접근이 가능합니다. 만약 외부에서 접근 가능한 서버를 만들고 싶다면 debug 모드를 해제하거나 다음과 같이 run() 메소드의 호출을 변경해서 서버의 접근을 오픈할 수 있습니다.
app.run(host = '0.0.0.0')
❕디버그 모드
run() 메소드는 로컬개발서버를 실행시키기에는 좋지만 코드 변경 후 수동으로 재시작을 해야한다는 단점이 존재합니다. Flask는 그런 번거로운것을 개선한 방식을 제공하고 있습니다. 바로 디버그모드를 지원하는 것입니다.
app.debug = True
app.run()
혹은 어플리케이션을 실행할때 파라미터로 넘겨주는 방식을 이용하면 됩니다.
app.run(debug = True)
대화식 디버거는 forking 환경에서 동작이 되지 않아야 합니다. 하지만 여전히 임의의 코드가 실행될 수 있으며 이러한 점은 주요 보안 취약점이 될 수 있으므로 운영 환경에서는 절대 사용하지 않는 것을 권장합니다.
❕라우팅
기본적인 라우팅은 위와 같이 route() 데코레이터를 사용합니다.
@app.route('/')
def index():
return 'Index Page'
그러나 이는 정적으로 이미 URL을 지정하여 함수와 연결한 것 입니다. 즉 동적으로 URL을 생성하지는 못 합니다.
만약 동적으로 URL을 구성해야한다면 함수에 여러 룰을 덧 붙여 사용할 수 있습니다.
❗변수규칙
URL의 변수 부분을 추가하려면 <varible_name>으로 URL에 특별한 영역을 표시해야합니다. 이렇게 표시한 영역은 키워드 인수로써 넘어가며 선택적으로 <converter:varible_name>으로 규칙을 표시하여 변환기를 추가할 수 있습니다.
■ <varible_name>
@app.route('/user/<username>')
def show_user_profile(username):
return 'user %s' %username
■ <converter:varible_name>
- int
- float
- path
@app.route('/post/<int:post_id>')
def show_post(post_id):
return 'Post %d' %post_id
🔊 유일한 URL과 리디렉션 동작
Flask의 URL 규칙은 Werkzeug의 라우팅 모듈에 기반하고 있습니다. 그 라우팅 모듈의 기본 사상은 아파치나 초기 HTTP서버들에서 제공한 전례에 기반두고 있습니다. 이는 유일한 URL을 보장하는 것입니다.
다음의 두 규칙을 살펴보도록 합니다.
@app.route('/project/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
위의 코드는 비슷해보이지만 URL 정의에 있어서 뒷 슬래쉬(traulling slash) 사용이 다릅니다.
정규 URL은 첫번째 project 끝점에 대한 뒷 슬래쉬를 포함합니다. 이 말은 파일시스템의 폴더와 유사한데 사용자가 뒷 슬래쉬 없이 URL에 접근하면, Flask가 뒷 슬래쉬를 가진 정규 URL로 고쳐 접근을 가능하도록 합니다.
그러나 두번째 경우의 URL은 뒷 슬래쉬를 포함하지 않고 정의되었습니다. 이는 Unix계열의 파일 경로명과 유사합니다. 이런 경우에는 사용자가 만약 뒷 슬래쉬를 포함하여 요청하게되면 서버는 404 페이지 에러를 반환합니다.
이것은 사용자가 뒷 슬래쉬를 잊어버리고 페이지에 접근했을 때 상대적인 URL이 문제없이 동작하게 하며 이 방식은 아파치 및 다른 서버들이 동작하는 방식과 일치합니다. 또한 URL을 유일하게 유지하고 검색엔진이 같은 페이지를 중복해서 색인하지 않도록 방지합니다.
❕URL 생성
Flask가 URL을 맞춰줄 수 있다면, URL을 생성할 수 있을까라고 질문한다면 가능하다고 대답할 것입니다. 하지만 이를 위해서는 특별하게 사용해야할 것이 있습니다. 바로 url_for() 함수입니다. 이 함수는 첫번째 인자로 함수의 이름과 URL 룰의 변수 부분에 대한 다수의 키워드를 인자로 받습니다.
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index(): pass
@app.route('/login')
def login(): pass
@app.route('/user/<username>')
def profile(username): pass
with app.test_request_context():
print url_for('index') >> /
print url_for('login') >> /login
print url_for('login', next = '/') >> login?next=/
print url_for('profile', username = 'John') >> /user/John
템플릿에 URL을 하드코딩하지 않고 URL을 얻어내는 이유는 총 세가지의 적합한 이유가 있습니다.
- URL 역변환이 URL을 하드코딩하는 것 보다 훨씬 설명적이고 안정적입니다. 이 방식은 전체적으로 URL이 어디있는지 기억할 필요없이 한번에 URL을 다 변경할 수 있습니다.
- URL을 얻어내는 것은 특수 문자 및 유니코드 데이터에 대한 이스케이핑을 명확하게 해줍니다.
- 작성한 어플리케이션의 URL이 최상위 바깥에 위치한다면 별도의 설정을 해줄 필요가 없습니다. url_for() 함수가 그 위치를 상대적 위치로 적절하게 처리해주기 때문입니다.
'Python > Flask' 카테고리의 다른 글
[Flask] 응답 및 보내기 (0) | 2023.07.19 |
---|---|
[Flask] 데이터 접근 (0) | 2023.07.14 |
[Flask] 템플릿 접근 (0) | 2023.07.14 |
[Flask] Error : pip : 'pip' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다. (0) | 2022.11.13 |