2.22. 내용정리: 25일차
흔한 찐따 edited this page May 7, 2022
·
7 revisions
- 프레임워크는 사전적인 의미로 틀 혹은 뼈대, 골조 라는 뜻이다.
- 프레임워크(Framework) 란, 복잡한 문제를 해결하거나 서술하기 위해 사용되는 기본적인 개념 구조이다.
- 다시 말해, 어떤 소프트웨어를 개발하는데에 있어 필요한 구성 요소들을 언제든 재사용이 가능하도록 구성해놓은 것이 바로 프레임워크이다.
- 컴포넌트, 라이브러리를 포함하는 개념이라고 볼 수 있다.
- 라이브러리는 소프트웨어를 개발하는데 필요한 부품, 프레임워크는 소프트웨어의 뼈대로 비유할 수 있다.
-
MVC 패턴이란, Model-View-Controller를 지칭하는 디자인 패턴의 일종이다.
- 디자인 패턴(Design pattern) 은 소프트웨어 공학의 소프트웨어 디자인에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책을 의미한다.
- 모델-뷰-컨트롤러는 응용 프로그램을 다음과 같이 세 가지의 구성요소로 나눈다.
각각의 구성요소들 사이에는 다음과 같은 관계가 있다.
- 모델(model) 이란, 어떠한 동작을 수행하는 코드를 말한다.
- 모델은 모델의 상태에 변화가 있을 때 컨트롤러와 뷰에 이를 통보한다.
- 이와 같은 통보를 통해서 뷰는 최신의 결과를 보여줄 수 있다.
- 어떤 MVC 구현에서는 통보 대신 뷰나 컨트롤러가 직접 모델의 상태를 읽어 오기도 한다.
- 뷰는 보여줄 값(모델)을 컨트롤러로부터 받아와 사용자에게 보여준다.
- 뷰는 사용자가 볼 결과물을 생성하기 위해 모델로부터 정보를 얻어 온다.
-
컨트롤러는 모델에 명령을 보냄으로써 모델의 상태를 변경할 수 있다.
- 예: 워드 프로세서에서 문서를 편집하는 것
- 또, 컨트롤러가 관련된 뷰에 명령을 보냄으로써 모델의 표시 방법을 바꿀 수 있다.
- 예: 문서를 스크롤하는 것
-
플라스크(flask) 란, 파이썬용 마이크로 프레임워크(micro-framework) 이다.
- 마이크로 프레임워크(micro-framework) 란, 미니멀리스틱한 웹 애플리케이션 프레임워크을 가리키기 위해 사용되는 용어이다.
-
flask
는 더 작은 애플리케이션, API 및 웹 서비스를 구축하기 위한 라이브러리이다. - 좀 더 자세한 설명은 flask 공식 문서 를 참고하면 된다.
- 디자인 패턴 중에서 웹 프레임워크에 보편적으로 사용되는 패턴인 MVC 패턴으로 설계되었다.
-
flask
는 특히 간단하게 웹 서비스를 개발할 수 있는 강력한 프레임워크이다. -
flask
를 사용하기 위해서는 명령 프롬프트에pip
명령어를 통해 설치해야 한다.- 설치 명령어:
pip install flask
- 설치 명령어:
- 아래는
flask
를 사용하여 MVC 패턴을 적용시켜 웹 애플리케이션을 작성한 간단한 예시이다.
from flask import Flask
# 먼저, Flask 애플리케이션 객체를 생성한다.
# Flask 객체는 웹 애플리케이션을 구현하고 그 중심적인 역할을 한다.
# 인자값으로 애플리케이션의 모듈 또는 패키지 이름이 전달된다.
# 일단 생성되면 보기(View) 기능, URL 규칙(rules), 템플릿(templates) 구성 등을 위한 애플리케이션의 중심부 역할을 한다.
app = Flask(__name__)
# 그 다음 'route' 함수를 통해 URL을 지정한다.
# 아래의 예시처럼 데코레이터로 정의한다.
@app.route('/')
def main():
# 반환값은 웹 브라우저에 보여주기 위한 HTML 코드가 전달된다.
return '<h1>Hello, Flask!</h1>'
# Flask 애플리케이션을 실행하기 위해서는 'run' 메서드를 호출하면 된다.
# 인자값으로는 호스트(host) 주소와 포트(port) 번호를 받는다.
# 여기서는 포트 번호를 웹 서버 포트 번호인 '80'을 입력해주었다.
if __name__ == '__main__':
host = 'localhost'
port = 80
app.run(host, port)
- 실행이 완료되면 http://localhost:80 으로 접속해본다.
- URL 뒷부분의 포트 번호는 웹 포트 번호인 80이므로, http://localhost 같이 생략하여 접속이 가능하다.
flask
의 프로젝트 구조는 다음과 같다.
Project/
static/
templates/
...
-
static: 정적 파일들(
css
파일이나js
파일)의 최상위 폴더이다. -
templates:
jinja2
템플릿 파일들(html
파일)의 최상위 폴더이다.-
flask
는jinja2
라는 템플릿을 사용한다. -
html
파일에jinja2
문법을 적용시켜서 파이썬 데이터를 표현할 수 있다.
-
아래는 jinja2
문법으로 html
파일을 작성한 예시이다.
<!DOCTYPE HTML>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ message }}</h1>
</body>
</html>
- 위와 같이
templates
폴더 안의html
파일에{ }
기호가 포함되어 있다면jinja2
문법이다. -
jinja2
문법의 종류는 다음과 같다.
<h1>{{ data }}</h1>
<body>
{% if data == 'hello' %}
<h1>Hello, Flask!</h1>
{% elif data == 'bye' %}
<h1>Goodbye, Flask!</h1>
{% else %}
<h1>This is Flask!</h1>
{% endif %}
</body>
<table>
{% for e in elements %}
<tr>
<td>{{ e.data }}</td>
</tr>
{% endfor %}
</table>
- 위와 같이
jinja2
문법으로 작성된html
에 파이썬 데이터를 보내야 한다. - 그럴때 사용하는 것이
flask
라이브러리의render_template
함수를 사용한다.
먼저, templates
폴더 안에 html
파일을 jinja2
문법으로 작성한다.
<!-- example.html -->
<!DOCTYPE HTML>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ message }}</h1>
</body>
</html>
그 다음, jinja2
문법으로 표현된 파이썬 변수들을 render_template
함수를 통해 표현한다.
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route('/')
def main():
title = 'Flask Tutorial'
message = 'Hello, Flask!'
template = render_template('example.html', title=title, message=message)
return template
if __name__ == '__main__':
host = 'localhost'
port = 80
app.run(host=host, port=port)
위의 코드를 실행하면 웹 페이지에 접속했을때 잘 뜨는 것을 확인할 수 있다.
-
url_for
함수는 URL 주소값을 가져오는 함수이다. - 인자값으로
route
함수명을 넣어주면 해당route
의 URL 주소를 가져온다.
아래는 url_for
함수를 통해 정의된 route
를 실행하는 예시이다.
from flask import Flask
from flask import url_for
app = Flask(__name__)
@app.route('/')
def main():
# 인자값으로 route로 정의한 함수 'my_test'를 넣어준다.
url = url_for('my_test')
# 실행되면 '/test'가 출력된다.
print(url)
html = f'''
<html>
<body>
<h1>url_for 함수</h1>
<a href="{url}">
<p>Test</p>
</a>
</body>
</html>
'''
return html
@app.route('/test')
def my_test():
return '<h1>This is url_for function test.</h1>'
if __name__ == '__main__':
host = 'localhost'
port = 80
app.run(host=host, port=port)
실행해보면 a
태그의 href
속성값으로 /test
URL이 전달된 것을 확인할 수 있다.