$ pip install virtualenv
가상환경 패키지 설치$ vitrualenv venv
venv는 가상환경 이름. 아무 이름을 쓰면 된다. 가상환경 폴더를 만듦$ . ./venv/bin/activate
가상환경 실행. 실행하면 터미널 명령어 쓰는 곳에서 이름 앞에 (venv)라고 가상환경임이 표시된다.cd venv
로 venv 폴더로 이동 후$ vi reqirements.txt
로 아래 내용을 적어준다.flask==1.1.2
Flask-Script==2.0.6
Flask-Migrate==2.7.0
Flask-SQLAlchemy==2.5.1
Flask-WTF==0.14.3
Flask-Login==0.5.0
mysqlclient==2.0.3
redis==2.10.6
unittest2==1.1.0
requests==2.25.1
flasgger==0.9.5
$ pip install -r reqirements.txt
reqirements.txt에 적어둔 패키지를 설치한다. reqirements 속 패키지 버전에 따라 설치되지 않는 버전이 있을 수도 있다. 설치 되지 않는 버전은 '#'을 붙혀 무시하고 설치하자.-> mysql 설치 시 #
로 무시 말고 정상 설치하기
https://blog.boxcorea.com/wp/archives/2702
$ vi hello.py
로 아래 내용을 작성한다.from flask import flask
app = Flask(__name__)
@app.route('/index') #url경로
@app.route('/')
$ export FLASK_APP=hello.py
$ export FLASK_ENV=development
flask run
위 사진에서 running on http://127.0.0.1:5000/을 리눅스에서 접속하면 hello world 페이지가 뜨는 걸 확인할 수 있다.
책에서는 파이참에서 개발할 것을 권하고 있다. 명령어를 치지 않아도 파이참 프로그램을 시행해서 가상환경 설정만 해주면 바로 그 가상환경에서 개발할 수 있기 때문이다.
나는 나중에 라즈베리파이에서 이 모든 걸 해야하기 때문에 터미널에서 바로 하는 것에 익숙해져야 하지만... 지금은 공부하는 입장이니 파이참에서 실행하기로 결심했다.
저자는 파이참 버전을 커뮤니티가 아닌 프로페셔널을 추천한다. 무료 버전은 css, 자바스크립드를 지원하지 않아 실습에 차질이 생길 수 있기 때문이다.
파이참 프로페셔널 버전은 학생인증을 사용하면 1년 동안 무료로 사용할 수 있으며 1년이 지난 후 재인증하면 다시 1년간 무료로 사용이 가능하다.
학생 인증이 불가하다면 30일간 무료로 사용할 수 있으니 이 기간동안 책을 통해 개발해보길 권한다.
아래 링크의 도움을 받아 파이참을 우분투 리눅스에서 설치 및 실행해보자.
리눅스에서 파이참을 설치하고 실행
flask/
|-----hello.py
|-----templates/
| |---hello.html
|----- static/
|----image/
|----hello_world.png
↑ 위와 같은 구조를 만들자!
<!DOCTYPE html>
<html>
<head>
<title>hello</title>
</head>
<body>
<img src="/static/image/hello_world.png">
</body>
</html>
from flask import Flask, render_template
app = Flask(__name__, static_folder='static', template_folder='template')
@app.route('/hello')
def hello():
return render_template('hello.html')
Flask 객체에서 static_folder와 template_folder를 지정해준다.
static_folder를 지정해주면 /static URL로 접근할 수 있다. template_folder를 지정해주면 render_template에서 해당 템플릿 파일을 찾을 수 있다.
이제 플라스크를 구동해보자. export 명령어로 환경변수를 지정하자.
터미널을 열고 아래를 입력해준다.
$ export FLASK_APP=hello.py
$ export FLASK_ENV=development
flask run을 해준다.
$ flaks run
아래와 같이 명령어가 뜨고 다음과 같이 http://127.0.0.1:5000으로 서버가 열렸다. 나는 hello.py을 hello_2.py로 하고 시행했다.
링크를 클릭하면 다음과 같이 웹페이지가 열린다.
주소창에서 마지막에 /hello
로 path parameter를 지정해주면 다음과 같은 페이지가 열린다.
jinja2
를 사용한다. 이미 내장되어 있으므로 설치할 필요가 없다.flask/
|-----hello.py
|-----templates/
| |-----hello.html
|-----hello2.html
|-----layout/
|-----base.html
↑ 위와 같은 구조를 만들자!
template 폴더에 hello2.html 파일과 layout/base.html 파일을 추가하자.
/hello URL에 path parameter를 받아 이름이 있는 해당 변수를 출력하는 예제를 작성해보자.
# hello_3.py
from flask import Flask, render_template
app = Flask(__name__, static_folder='static', template_folder='template')
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
{% block %}
을 사용하면 상속받은 파일에서 코드를 추가할 수 있게 해준다.아래와 같이 base.html 코드와 hello.html 코드를 작성해주자.
<!-- base.html -->
<!DOCTYPE html>
<html>
<head>
{% block head %}
{% endblock %}
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
<!-- hello.html -->
{% extends 'layout/base.html' %}
{% block head %}
<title>hello</title>
{% endblock %}
{% block body %}
{% if name %}
<h1>Hello, {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
{% include 'hello2.html' %}
{% endblock %}
전체적인 틀은 {% extends %}
키워드를 활용.
반복적이거나 따로 분리하고 싶은 html 코드는 {% include %}
키워드를 사용한다.
<!-- hello2.html -->
{% if name %}
<h1>Hello2, {{ name }}!</h1>
{% else %}
<h1>Hello2, World!</h1>
{% endif %}
$ export FLASK_APP=hello_3.py
$ export FLASK_ENV=development
$ flaks run
플라스크를 구동하여 웹사이트에 들어가면 아래와 같은 화면이 출력되는 걸 확인할 수 있다.
아주 잠깐 다른 소리를 하겠다.
사실 이 『처음 배우는 플라스크 웹 프로그래밍』은 나같은 초보에게 무척이나 어려운 책이다.
사전에 웹 애플리케이션 개발이나 기본적인 DB 지식, 파이썬 문법에 능숙한 사람은 이 책을 잘 이해하고 따라가겠지만, 나는 왕초보개발꿈나무에겐 공부해야 할 것이 많은 책이기도 하다.
그래도 어쩌겠는가. 배움만이 살 길이니 열심히 공부하도록 한다.
리다이렉션에 대해 친절하게 설명해놓은 글이 있어 링크를 건다.
링크를 통해서 리다이렉션이 무엇인지 개념부터 명확히 정리하도록 하자.
리다이렉션이란?
HTTP란? - 위키백과
[HTTP란? - 네이버]
이제 실습을 통해서 redirect()
가 어떻게 쓰이는지 익혀보자.
다음 코드는 로그인을 하지 않은 유저가 /users를 호출하려고 할 때(로그인을 해야만 가능한 행위) 에러를 반환하는 걸 보여준다.
# hello_error.py
from flask import Flask, redirect, url_for, abort
app = Flask(__name__)
@app.errorhandler(403) # 4. @app.errorhandler를 사용하면 403 error exception을 받아 처리 가능.
def permission_denied(error):
return '403', 403
@app.route('/')
def index():
return redirect(url_for('user_list')) # 1. url_for()는 해당 인자의 url을 반환함. 여기선 user_list를 요청해 /users를 반환.
# 2. redirect()를 통해 반환 받은 주소로 다시 http 요청을 함.
@app.route('/users')
def user_list(): # 3. user_list API가 redirect 요청을 받았고 다시 abort() 함수로 403 에러를 보냄.
abort(403)
이제 플라스크를 구동해 확인해보자.
$ export FLASK_APP=hello_error.py
$ export FLASK_ENV=development
$ flaks run
위 사진을 통해서 에러 코드가 반환되는 것을 확인 가능하다.