플라스크 3

Namung's Sea·2021년 10월 27일
0
post-thumbnail

리눅스 환경에서 플라스크 기초 실행하기!

  1. 리눅스 터미널 열기
  2. 가상환경 구축하기
    1)$ pip install virtualenv 가상환경 패키지 설치
    2)$ vitrualenv venv venv는 가상환경 이름. 아무 이름을 쓰면 된다. 가상환경 폴더를 만듦
    3)$ . ./venv/bin/activate 가상환경 실행. 실행하면 터미널 명령어 쓰는 곳에서 이름 앞에 (venv)라고 가상환경임이 표시된다.
  3. 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
  1. $ pip install -r reqirements.txt reqirements.txt에 적어둔 패키지를 설치한다. reqirements 속 패키지 버전에 따라 설치되지 않는 버전이 있을 수도 있다. 설치 되지 않는 버전은 '#'을 붙혀 무시하고 설치하자.

-> mysql 설치 시 #로 무시 말고 정상 설치하기
https://blog.boxcorea.com/wp/archives/2702

  1. $ vi hello.py로 아래 내용을 작성한다.
from flask import flask

app = Flask(__name__)

@app.route('/index')          #url경로
@app.route('/')
  1. $ export FLASK_APP=hello.py
    $ export FLASK_ENV=development
  2. flask run

위 사진에서 running on http://127.0.0.1:5000/을 리눅스에서 접속하면 hello world 페이지가 뜨는 걸 확인할 수 있다.

파이참에서 개발하면 더 편안하다⭐

책에서는 파이참에서 개발할 것을 권하고 있다. 명령어를 치지 않아도 파이참 프로그램을 시행해서 가상환경 설정만 해주면 바로 그 가상환경에서 개발할 수 있기 때문이다.
나는 나중에 라즈베리파이에서 이 모든 걸 해야하기 때문에 터미널에서 바로 하는 것에 익숙해져야 하지만... 지금은 공부하는 입장이니 파이참에서 실행하기로 결심했다.

저자는 파이참 버전을 커뮤니티가 아닌 프로페셔널을 추천한다. 무료 버전은 css, 자바스크립드를 지원하지 않아 실습에 차질이 생길 수 있기 때문이다.

파이참 프로페셔널 버전은 학생인증을 사용하면 1년 동안 무료로 사용할 수 있으며 1년이 지난 후 재인증하면 다시 1년간 무료로 사용이 가능하다.
학생 인증이 불가하다면 30일간 무료로 사용할 수 있으니 이 기간동안 책을 통해 개발해보길 권한다.

아래 링크의 도움을 받아 파이참을 우분투 리눅스에서 설치 및 실행해보자.
리눅스에서 파이참을 설치하고 실행

정적파일과 템플릿

  • 플라스크로 웹사이트 만들려면 정적 파일(css, js, image...)과 템플릿(html) 등이 필요함.
  • Flask 객체는 폴더 지정을 통해 정적 파일과 템플릿 위치를 추적함.
  • 위 사항을 실습을 통해 확인해보자.

따라해보기

flask/
|-----hello.py
|-----templates/
|      |---hello.html
|----- static/
       |----image/
            |----hello_world.png

↑ 위와 같은 구조를 만들자!

  1. flask 폴더 안에 templates 폴더와 static 폴더를 만들어주자.
  2. templates 폴더 안에 hello.html 파일을 만들어주자.
    hello.html파일 내용은 다음과 같다.
<!DOCTYPE html>
<html>
<head>
    <title>hello</title>
</head>
<body>
    <img src="/static/image/hello_world.png">
</body>
</html>
  1. static 폴더 안에 image 폴더를 만들고 hello_world.png 파일을 만들어주자.
    원하는 아무 png 파일의 파일명만 hello_world.png로 바꾸면 된다. 나는 귀여운 피카츄를 사용했다.
  2. hello.py 파일을 flask 폴더 안에서 만들어 준다. 파일 코드는 다음과 같다.
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에서 해당 템플릿 파일을 찾을 수 있다.

  1. 이제 플라스크를 구동해보자. export 명령어로 환경변수를 지정하자.
    터미널을 열고 아래를 입력해준다.
    $ export FLASK_APP=hello.py
    $ export FLASK_ENV=development

  2. flask run을 해준다.
    $ flaks run

  3. 아래와 같이 명령어가 뜨고 다음과 같이 http://127.0.0.1:5000으로 서버가 열렸다. 나는 hello.py을 hello_2.py로 하고 시행했다.
    링크를 클릭하면 다음과 같이 웹페이지가 열린다.

    주소창에서 마지막에 /hello로 path parameter를 지정해주면 다음과 같은 페이지가 열린다.

템플릿 엔진

  • 플라스크는 템플릿 엔진으로 jinja2를 사용한다. 이미 내장되어 있으므로 설치할 필요가 없다.
  • 이번엔 jinja2를 활용해 어떻게 페이지를 구성하는지 배워보자.
flask/
|-----hello.py
|-----templates/
|      |-----hello.html
       |-----hello2.html
       |-----layout/
             |-----base.html

↑ 위와 같은 구조를 만들자!

  1. template 폴더에 hello2.html 파일과 layout/base.html 파일을 추가하자.

  2. /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)
  1. jinja2에는 재사용을 위한 템플릿 상속 기능이 있다.
    한마디로 매번 같은 코드를 다시 작성할 필요가 없이 한 곳에서 수정할 수 있다는 것이다.
    {% 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 %} 키워드를 사용한다.

  1. path parameter 값에 따라 결과값이 다르게 나올 수 있게 설정해주자.
    다음과 같이 hello2.html을 작성해보자.
<!-- hello2.html -->
{% if name %}
    <h1>Hello2, {{ name }}!</h1>
{% else %}
    <h1>Hello2, World!</h1>
{% endif %}
  1. 플라스크를 구동해주자.
    터미널을 열고 아래를 입력해준다.
    $ export FLASK_APP=hello_3.py
    $ export FLASK_ENV=development
    $ flaks run

플라스크를 구동하여 웹사이트에 들어가면 아래와 같은 화면이 출력되는 걸 확인할 수 있다.

리다이렉션과 에러

🤔 리다이렉션(redirection)?

아주 잠깐 다른 소리를 하겠다.
사실 이 『처음 배우는 플라스크 웹 프로그래밍』은 나같은 초보에게 무척이나 어려운 책이다.
사전에 웹 애플리케이션 개발이나 기본적인 DB 지식, 파이썬 문법에 능숙한 사람은 이 책을 잘 이해하고 따라가겠지만, 나는 왕초보개발꿈나무에겐 공부해야 할 것이 많은 책이기도 하다.
그래도 어쩌겠는가. 배움만이 살 길이니 열심히 공부하도록 한다.

리다이렉션에 대해 친절하게 설명해놓은 글이 있어 링크를 건다.
링크를 통해서 리다이렉션이 무엇인지 개념부터 명확히 정리하도록 하자.
리다이렉션이란?
HTTP란? - 위키백과
[HTTP란? - 네이버]

redirect()를 이용한 error 핸들링

이제 실습을 통해서 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

위 사진을 통해서 에러 코드가 반환되는 것을 확인 가능하다.

profile
개발자로 시작| 공부한 것을 기록합니다.

0개의 댓글