본문 바로가기
프로그래밍/웹

플라스크 초기 사용법

by 써드아이 2020. 8. 22.

위키독스의 "점프 투 플라스크" 라는 강좌를 공부하며 정리한 내용입니다.

 

 

https://www.wikidocs.net/81052

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

* 디렉토리 구조

+ project/
	+ pybo.db
	+ pybo/						# FLASK_APP에 등록된 이름의 디렉토리
		+ __init__.py
		+ filter.py
		+ forms.py 				# 브라우저에서 사용될 form 관련 클래스 처리
		+ models.py 			# 모델기반의 데이타베이스 처리를 위한 모델 클래스들

		+ views/				# 화면에 보여지는 내용을 처리하기 위한 코드들
								# templates 디렉토리의 파일을 가져다 렌더링하여
								# 브라우저에 보여질 html 코드를 생성한다.
			+ answer_views.py 
			+ auth_views.py
			+ comment_views.py
			+ main_views.py
			+ question_vies.py
			+ vote_vies.py
		+ static/
				+ jquery.js
				+ bootstrap.css
				+ style.css
		+ templates/
			+ answer/
					+ answer_form.html
			+ auth/
					+ login.html
					+ signup.html
			+ comment/
					+ comment_form.html
			+ question/
					+ question_detail.html
					+ question_form.html
					+ question_list.html
			+ base.html
			+ form_errors.html
			+ navbar.html
	+ config/
		+ __init__.py
		+ default.py
		+ development.py
		+ production.py

 

위 구조는 https://www.wikidocs.net/81052 의 pybo 프로젝트의 구조이다.

 

 

 

클라이언트에서 호출 가능한 주소는 blueprint의 prefix로 등록되고 하위 주소가 blueprint의 route() 데코레이터에 의해 특정 함수로 매칭되어 해당 함수가 실행 된다.

 

blueprint의 prefix가 '/' 이고 데코레이터의 값이 route("/post/")

이 데코레이터가 사용된 함수명이 post_article() 이라면

 

클라이언트에서 http://some_address/post/ 주소가 호출되었을 때 

 

flask의 post_article() 함수가 호출된다.ㅇㅇㅇ

 

* 시작점

프로젝트의 패키지 파일 __init__.py 의 동작

SQLAlchemy 클래스의 인스턴스를 전역으로 생성

Migrate 클래스의 인스턴스를 전역으로 생성

 

db = SQLAlchemy()

migrate = Migrate()

 

Flask 클래스의 인스턴스를 리턴하는 create_app() 함수를 정의 하고 데이타베이스를 초기화, 등록

 

 

db.init_app(app)

migrate.init_app(app, db)

 

view에서 생성한 blueprint를 등록

 

 

 

 

* view

 

blueprint 객체 생성

 

생성된 객체의 route()를 데코레이터로 사용한 함수 작성

 

bp = Blueprint(이름, 모듈명, url prefix) # '이름'은 함수명으로 url을 찾아내는 url_for 함수에서 사용된다.

 

@bp.route('', )

def func():

...

...

return redirect(url_for("blueprint_name.함수"))

 

 

blueprint_name : Blueprint 객체를 생성할 때 주어진 이름

함수 : 생성된 Blueprint 객체의 route() 데코레이터로 사용한 함수

 

url_for("blueprint_name.함수") ==> Blueprint 생성시 주어진 url prefix와 함수의 데코레이터에 주어진 주소를 합쳐서 주소를 뽑아낸다.

 

 

 

 

* 모델

 

패키지 전역으로 생성된 SQLAlchemy 클래스의 인스턴스의 Model 멤버를 상속받은 클래스를 생성한다.

 

class SomeData(db.Model):

속성 = db.Column(db.속성의타입, 옵션)

속성의 타입은 Integer / String() / Text() / DateTime()

옵션은 primary_key=True/False, nullable=True/False, db.ForeignKey(), backref

속성 = db.relationshiup(클래스, )

 

사용방법은

 

some = SomeData(속성=값, 속성=값)

db.session.add(some)

db.session.commit()

 

SomeData.query.all()

SomeData.query.filter(SomeData.속성=값).all()

SomeData.query.get(2)

 

SomeData.query.filter(SomeData.속성.like("%뭘까%")).all()

 

 

 

* 템플릿

 

클라이언트의 화면에 출력이 필요한 경우 render_template() 함수를 사용하여 미리 정의된 template html 파일을 출력하게 된다.

 

render_template() 함수를 호출할 때

 

첫번째 인자는 template로 사용될 html 파일명이며, 두번째 인자는 template 안에서 사용될 객체 이름=python 파일에서 사용하는 객체 이름 이다.

 

 

html 파일은 상속이 가능하며

 

{% extends "base.html" %}

{% block content %}

 

{% endblock %}

 

처리를 하게 된다.

 

 

 

FlaskForm 클래스를 상속 받은 클래스를 만들고 멤버 변수로 html 파일의 form 태그 안에서 사용될  입력 변수을 멤버로 만들어준다.

 

이 클래스의 인스턴스를 render_template() 함수의 두번째 인자로 넘겨주면 template html 파일안에서 파이썬의 객체를 사용 가능하다.

 

 

 

 

* db 파일 생성

 

(venv) $ flask db init  # 초기 생성시 
(venv) $ flask db migrate  # 모델을 신규로 생성하거나 변경할 때 
(venv) $ flask db upgrade  # 변경된 내용을 적용할 때

'프로그래밍 > ' 카테고리의 다른 글

[css] 체크박스  (0) 2022.03.10
[javascript] 체크박스 선택/해제  (0) 2022.03.10
css 선택자  (0) 2022.03.05