[Flask] Flask 기초

suhyun-guri·2021년 11월 6일
0

Flask

목록 보기
1/1
post-thumbnail

📌 1. Flask란..

  • 파이썬으로 작성된 자유도가 높은 간결한 프레임워크 !
  • Flask를 이용하면 하나의 파일에 구성된 짧은 코드만으로 완벽하게 동작하는 웹 프로그램을 만들 수 있다.
  • Flask에는 폼과 데이터베이스를 처리하는 기능이 없다. 대신 확장 모듈을 사용하여 이를 보완한다.
  • 개발자가 필요한 확장 모듈을 그때그때마다 포함해가며 개발하므로 Flask 프로젝트는 가볍고 쉽게 확장이 가능하다.

Flask Simple Web Server 만들기

초기 설치 : pip3 install flask

from flask import Flask
app = Flask(__name__)

@app.route('/')
def guri():
	return "hello world"

if __name__ = "__main__":
	app.run()

app = Flask(__name__) : 이 파일이 다른 파일을 통해 실행이 됐는지 아니면 직접 실행된 건지를 알려준다.
@app.route('/') ~~ : Flask의 기능과 Python의 함수가 합쳐져서 하나의 API 역할을 한다.
@ : 데코레이터 => 어떤 반복적인 기능을 만들기 위해서, 자주 사용하는 기능을 만들기 위해서 코드를 반복해서 사용하는 경우가 있는데 이 데코레이터가 그런 수고를 덜어준다.

JSON 형식 데이터 나타내기

from flask import Flask, jsonify
app = Flask(__name__)

@app.route('/')
def guri():
	data = {"name" : "guri"}
	return jsonify(data)

if __name__ = "__main__":
	app.run()

flask 패키지 안에 존재하는 jsonify를 import
data를 json 형식으로 바꿔서 리턴한다.
결과값은 {"name" : "guri"}이 화면에 나타난다.

HTML 형식 데이터 나타내기


HTML을 화면에 전달하기 위해서는 html 파일이 필요하다.
html 파일은 위 사진처럼 templates라는 폴더 아래에 넣어줘야 한다. (index.html)
templates 폴더에 html 파일을 넣어주면 Flask가 자동으로 찾아서 연결해준다 !

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/')
def guri():
	return render_template('index.html')

if __name__ = "__main__":
	app.run()

그리고 app.py에서 render_template를 import하고 리턴 값에 render_template(html파일이름)을 준다.
render_template라는 함수는 templates라는 폴더 안의 html 파일을 읽어오는 역할을 한다.

여러 가지 Url 연결

@app.route('URL주소') 형식으로 여러 개 사용해서 다양한 url을 만들 수 있다.
주의사항은 다른 @app.route에 중복된 이름(앞서 다른 app.route에서 정의한 이름)의 함수를 생성할 수 없다

@app.route('/')
def guri():
	return jsonify("hello")
@app.route('/list')
def guri():
	return jsonify("list page")
...

📌 2. REST API

REST API ?

  • HTTP URL을 통해 데이터의 자원을 표현하고 HTTP Method(POST, GET, PUT, DELETE)를 통해서 데이터를 다루는 방법을 의미한다. (CRUD Operation 적용)
  • 다양한 클라이언트가 생겨남에 따라서 REST API가 필요하다 - 다양한 곳에서 통신
  • 메시지가 의도하는 바를 URL에서 나타내므로 쉽게 기능을 파악할 수 있다.

HTTP Method

  • GET
    • 데이터와 URL 뒤에 ?와 함께 사용
    • https:// ~~~ ?name=elice&lecture=python ⇒ GET 방식으로 서버에 data를 전송하는 방법 - 길이 제한 있음. 보안 취약
    • 그래서 로그인의 경우 GET방식 사용 X
  • POST
    • 특정 양식(form)에 데이터를 넣어 전송하는 방법
    • data를 html의 body에 저장해서 서버로 전송 (GET은 header에 추가해서 전송)
    • 다른 사람이 볼 수 없어 보안이 좋고 데이터 길이에 제한이 없다.
@app.route('url1', methods=["GET"])
@app.route('url2', methods=["POST"])
@app.route('url3', methods=["GET", "POST"])

methods라는 옵션을 추가해서 해당하는 HTTP Method만 사용할 수 있도록 적용

GET

from flask import *
app = Flask(__name__)
@app.route("/" , methods=["GET"] ) # URL 뒤에 ?name=guri 넣어 GET 요청
def guri():
	name = request.args.get('name') 
	result = "hello. " + name
	return result
if __name__== "__main__":
	app.run()

=> name = request.args.get('name') : 주소 (localhost:5000?name=guri)치면 name을 리턴

POST
templates/index.html 생성해서 그 안에 form을 생성한다.

from flask import *
app = Flask(__name__)
@app.route("/login" , methods=["POST"] )
def guri_login():
	id = request.form['id'] 
	password = request.form['password'] 
	if id == 'guri' and password = '1111':
    	return 'Hello'
    else:
    	'Bye'
if __name__== "__main__":
	app.run()

request.form[~~]을 통해 데이터를 받아옴

📌 3. Blueprint, Jinja

Blueprint?

  • API들을 분류/관리해주는 것
  • Flask의 기능이 점점 늘어날수록, 코드의 양도 증가한다.
  • 이때, Blueprint를 사용해서 길어진 코드를 모듈화해주어 수정 개발과 유지보수에 용이하게 코드를 관리할 수 있음.
  • 한 파일에서 (app.py) 여러 파일로 생성함 !

Blueprint 사용

  • board = Blueprint('board', __name__) : 이름 선언
  • 기존 @app.route() 였던 것을 @board.route()로 변경
  • 파일로 다면 (user_api.py, board_api.py) app.py에서 from board_api import board 이런 식으로 불러와줘야 함
  • 그러고 app.register_blueprint(board)로 Blueprint 등록
from flask import Blueprint
# 블루프린트 객체 생성
bp = Bluprint(“hello”, __name__, url_prefix=/hello”)
# app.route 데코레이터가 아닌 bp.route로 선언
@bp.route(/)
def hello_guri():
	return ‘Hello, GURI!”

Jinja2

  • Python에서 가장 많이 사용하는 템플릿
  • 서버에서 받아온 데이터를 효과적으로 보여주고 비교적 간략한 표현으로 데이터를 가공할 수 있다.
  • 간략한 표현 = HTML 내에서 python 문법처럼 데이터를 불러올 수 있다.
  • 반복문, if문 사용 가능 => 효과적으로 데이터를 나타낼 수 있다.
  • for문 사용법 : {{% for d in data %}} ~ {{% endfor %}}
  • if문 사용법 : {{% if name == 'guri' %}} ~ {{% endif %}}
#if 사용법 (+ for문 )
{% for student in student_list %}
    {% if student['name'] == 'guri' %}
        <p> {{ student['text'] }} </p>
    {% endif %}
{% endfor %}

📑 중요 키워드
@app.route 사용해서 url 생성
jsonify로 json 형식 데이터 전송
render_template 사용해서 HTML 파일 연결
GET은 request.args.get(~), POST는 request.form[~]
Blueprint로 코드 모듈화! 유지보수 good
jinja 템플릿으로 html 내에서 python문법처럼 데이터 다루기 가능

profile
Done is better than Perfect.

0개의 댓글