위키독스의 "점프 투 플라스크" 라는 강좌를 공부하며 정리한 내용입니다.
https://www.wikidocs.net/81052
* 디렉토리 구조
+ 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 |