Flask의 특징은 자유도가 높은 프레임워크다. 프레임워크는 대부분 규칙이 복잡하고 개발자는 그 규칙을 반드시 따라야 한다. 하지만 플라스크에는 최소한의 규칙만 있으므로 개발의 자유도는 다른 프레임워크보다 높다.
간단히 말하자면, Flask는 웹페이지를 찍어내는 공장이다.
pip install Flask
위의 소스코드를 비주얼 스튜디오 코드 터미널에 입력하면 된다.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
app.run()
flask를 실행시키는 코드다. 그 다음에는 flask 코드가 있는 문서를 실행시킬 때, 내 컴퓨터를 기준으로
PS D:\zakumann\zakumann\Python> python 10.flask.py
를 입력했었다.
glitch.com에서 flask를 테스트하는 코너에서 다음과 같은 코드를 입력했었다.
from flask import Flask
app = Flask(__name__)
topics = [
{"id":1, "title":"HTML", "body":"html is ...."},
{"id":2, "title":"CSS", "body":"css is ...."},
{"id":3, "title":"JS", "body":"Javascript is ...."},
]
def template(content):
liTags = ''
for topic in topics:
liTags = liTags + f'<li><a href="/read/{topic["id"]}/">{topic["title"]}</a></li>'
return f'''
<html>
<body>
<h1><a href="/">WEB</a></h1>
<ol>
{liTags}
</ol>
{content}
<ul>
<li><a href='/create/'>create</a></li>
</body>
</html>
'''
@app.route("/")
def index():
return template(f'<h2>Welcome</h2>Hello, WEB!')
@app.route("/read/<int:id>/")
def read(id):
title = ''
body = ''
for topic in topics:
if topic['id'] == id:
title = topic['title']
body = topic['body']
break;
return template(f'<h2>{title}</h2>{body}')
@app.route('/create/')
def create():
content='''
<form action="/create/">
<p><input type="text" name="title" placeholder="title"></p>
<p><textarea placeholder="body"></textarea></P>
<p><input type="submit" value="create"></p>
</form>
'''
return template(content)
@app.route('/update/')
def update():
return 'Update'
app.run()
이 코드는 flask를 실행하기 위해 사용된 코드로, 기본적인 홈페이지 구성을 만들때 사용된 것으로 참고용으로 쓰여진 것이다.
topics = [
{"id":1, "title":"HTML", "body":"HTML is ...."},
{"id":2, "title":"CSS", "body":"CSS is ...."},
{"id":3, "title":"JS", "body":"JS is ...."}
]
nextId = 4
어제 작성했던 코드 밑에 nextId =4 를 추가시켰는데, nextId는 밑에 작성할 nextId를 통해서 글을 작성한다.
@app.route('/create/')
def create():
content = '''
<form action="/create_process/" method="POST">
<p><input type="text" name="title" placeholder="title"></p>
<p><textarea name="body" placeholder="body"></textarea></p>
<p><input type="submit" value="create"></p>
</form>
'''
return template(content)
위의 코드는 글 내용을 추가시키는 코드로 이전에 작성했었던 template()로 연결되어 진다. /create/기능을 통해서 아래의 코드와 연동된다.
@app.route('/create_process/', methods=['POST'])
def create_process():
global nextId
title = request.form['title']
body = request.form['body']
newTopic = {"id":nextId, "title": title, "body": body}
topics.append(newTopic)
nextId = nextId + 1
return redirect(f'/read/{nextId-1}/')
이 코드를 통해서 새로 작성된 글을 업로드시킬 수가 있으며, request.form을 통해서 이뤄지는데 여기서
from flask import Flask
를 작성했었는데 여기에서 request, redirect를 추가시킨다.
from flask import Flask, request, redirect
이를 추가시켜야만 비로서 새로운 글을 업로드 시킬 수가 있다.
다음으로, 작성했던 글을 삭제시키는 코드를 구현시키면 우선 이전에 작성했던 코드를 수정해야 할 필요가 있는데, 아래와 같이 코드를 수정하면 된다.
def template(content, id=None):
(중략)
def template(content, id=None):
liTags = ''
for topic in topics:
liTags = liTags + f'<li><a href="/read/{topic["id"]}/">{topic["title"]}</a></li>'
return f'''
<html>
<body>
<h1><a href="/">WEB</a></h1>
<ol>
{liTags}
</ol>
{content}
<ul>
<li><a href="/create/">create</a></li>
<li>
<form action="/delete/{id}/" method="POST">
<input type="submit" value="delete">
</form>
</li>
</ul>
</body>
</html>
'''
위의 코드를 통해서 업로드 되었던 글을 지울 수 있는 코드가 구현되어졌다. 다음에는 실제로 글을 지울 수 있는 기능을 구현 시킬 차례다.
@app.route('/delete/<int:id>/', methods=['POST'])
def delete(id):
for topic in topics:
if topic['id'] == id:
topics.remove(topic)
break;
return redirect('/')
Flask는 단 10줄도 안되는 코드로 웹 서버를 구동할 수 있다. 너무나도 간단해서, from flask import Flask 를 시작으로 서버를 시작하는 코드까지 10줄이 되지 않는다. 물론 그만큼 최소한의 패키지로 구성되어있기때문에 Hello World는 간단히 구현 되지만, 상용 웹 서버를 구현할때는 단순하지만은 않다. 왜냐하면, Flask에는 ORM (Object relational mapping) 기능이 제공되지 않기 때문에 개발자가 직접 SQLAlchemy 등 개발자에게 편하거나 익숙한 패키지를 설치하여 사용할 수 있다.
위에서 언급한대로 Flask는 최소한의 기능만을 제공해서 데이터 베이스 연결 외에도 양식 처리, 보안, 인증 등 모두 개발자가 직접 처리해주어야 한다.
즉, django에서는 탄탄한 framework 안에서 다른 설계 패턴으로 벗어날 수 없다는 점을 Flask에서는 직접 새로운 framework로 설계할 수 있다는 장점이 있지만 이제 막 파이썬 웹 프레임워크에 진입하는 입장에서는 신경써야할게 한두가지가 아니기때문에 최대 단점으로 다가올 수 있다.
Pinterest Engineering
Mozilla
Bitbucket
Udemy
The Onion
Disqus
Washington Post
NASA
Spotify
Instagram Engineering
National Geographic
The Guardian
JSFiddle
Pinterest
Twilio