Try to be the expert.

Ainsetin's Hacking & PS & Math

2021 1人 1 Project

1인 1프로젝트 : 8일차 (python Flask & Jinja2 template)

Ainsetin 2021. 6. 15. 20:56

Flask는 파이썬으로 작성된 마이크로 웹 프레임워크의 하나로, Werkzeug 툴킷과 Jinja2 템플릿 엔진에 기반을 두고 있다. Flask로 누구나 손쉽게 웹 서버를 열 수 있으며, 동작하고 있는 서버 상에서는 debug mode를 통해 어떻게 http 요청이 진행되고 있는지를 알 수 있어 간편하고 깔끔한 웹 프레임워크로 현재까지도 자리잡고 있다.

 

flask로 로컬에서 웹서버를 만드는 과정은 다음과 같다.

1. python3의 pip로 flask 설치

2. flask 설치 후 가장 기본적인 파일인 app.py를 수정하여 원하는 페이지에 접근할 수 있도록 기본 뼈대 작성.

3. python3 app.py 실행 -> localhost:5000에 잘 붙었는지 확인. (기본 포트는 5000)

4. Jinja2 Template Engine을 사용하여 템플릿 문법이 포함된 HTML 파일을 추가적으로 렌더링할 수 있음.

 

1. Python Flask 실습 과정


우선, 다음 코드로 python에 flask를 설치한다.

 

1
$ pip3 install flask
cs

 

그 다음, 다음과 같이 기본 app.py의 내용을 집어 넣어 저장한다.

 

다음과 같이 준비가 완료 되었다면, 이제 app.py를 실행한다.

 

다음과 같은 문구가 뜨면서 127.0.0.1:5000에 debug mode가 active된 상태로 실행된 것을 볼 수 있다.

debug 모드에서는 동작 시 오류가 난다면 어떤 부분에서 오류가 났는지 깔끔하게 볼 수 있다는 장점이 있다.

다음과 같이 오류를 확인할 수 있다.

 

Flask에는 <(converter) : variable_name>이라는 형태로 url에서 인자를 가져오는 방법을 사용할 수 있다.

converter는 다음 5개 중 하나로 지정해줄 수 있다.

  • string (기본값) : slash가 포함되지 않은 문자열
  • int
  • float
  • path : string과 동일하지만 slash를 포함한다.
  • uuid : UUID(범용고유식별자) 형식

100을 int로 받아 user_name과 같이 출력한 모습이다.

 

2. Flask Jinja2 연동 + 템플릿 사용법


Jinja는 Python 프로그래밍 언어를위한 Web Template Engine이다.

다음 템플릿을 사용한다면, Flask에서 render_template와 같은 연동 함수를 통해 Template가 포함되어 있는 html 파일을 동적으로 실행할 수 있다.

 

다음 template code와 app.py를 작성하여 다시 실행해보았다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    {% if title %}
    <title>{{ title }}</title>
    {% endif %}
</head>
<body>
 
<h1>Bind string: {{ home_str }}</h1>
<p>This page is for Flask tutorial.</p>
<p>Bind list value: {{ home_list[2:4] }}</p>
<ul>
  {% for idx in home_list %}
  <li>{{ idx }}</li>
  {% endfor %}
</ul>
 
</body>
</html>
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from flask import Flask, render_template
 
app = Flask(__name__)
 
@app.route('/')
@app.route('/home')
def home():
    return 'Hello, World!'
 
@app.route('/user')
def user():
    return 'Hello, User!'
 
@app.route('/template_test')
def template_test():
    return render_template(
        'index.html',
        title='Flask Template Test',
        home_str  = 'Hello Flask!',
        home_list = [12345]
    )
 
@app.route('/user/<user_name>/<int:user_id>')
def user_listing(user_name, user_id):
    return f'Hello, {user_name}({user_id})!'
 
if __name__ == '__main__':
    app.run(debug=True)
cs

다음과 같이 app.py에 template_test라는 path를 더 만들어 jinja2 template 테스트를 해보았다. 처음 코드는 /templates 폴더 안에 넣어야 render_template에서 참조가 가능하다.

 

 

다음과 같이 실행이 잘 되는 것을 확인할 수 있다.

 

template 안에서도 여러 가지 문법을 사용할 수 있다. 위와 같이 list value를 원하는 만큼 슬라이싱하여 가져올 수도 있다.

 

Conclusion :

jinja2를 flask에서 사용하여 html의 원하는 부분에 그대로 출력할 수 있게 하여 간편하게 동적 웹을 구현할 수 있다!

[END]