ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Flask Project - MyBlog 프로젝트 목적, 아키텍쳐, Config, gitignore 관리
    프로젝트 2024. 4. 8. 18:49
    반응형

    https://github.com/WooyoungJun/MyBlog_project

     

    GitHub - WooyoungJun/MyBlog_project

    Contribute to WooyoungJun/MyBlog_project development by creating an account on GitHub.

    github.com

    프로젝트 목적

    1. Flask 웹 어플리케이션 개발
    2. 테스트 코드 작성 경험 쌓기
    3. CI/CD 적용
    +) 가능하면 Docker로 포장해서 heroku로 배포해보기
    웹 개발에 대해 공부하면서, 지금까지 공부했던 내용들을 묶어서 하나의 과정으로 승화시키는 프로젝트가 필요하다고 느껴 이 프로젝트를 시작하게 되었습니다. 중간에 모르는 것은 채우고, 고민했던 부분은 공유하면서 진행하겠습니다.
    웹 백엔드 개발에 필요한 부분을 정리하는 프로젝트이기 때문에 마이크로 웹 프레임워크인 Flask를 사용하고, 프론트엔드는 부트스트랩의 clean-blog 템플릿 코드를 사용하겠습니다. - 출처: https://startbootstrap.com/theme/clean-blog

     

    Start Bootstrap

     

    startbootstrap.com

     


    패키징 파일: __init__.py

    본격적으로 프로젝트 시작 전에 파이썬에서 모듈 패키징 관리에 중요한 "__init__.py" 파일에 대해 설명하겠습니다.

    directory
    |-- a.py
    |-- b.py
    app.py

    위 구조에서 app.py에서 a.py, b.py 파일 안에서 정의한 함수나 변수를 사용하기 위해서는 아래와 같이 구현해야합니다.

    # a.py
    def a():
        return "a"
    
    # b.py
    def b():
        return "b"
    
    # app.py
    from directory.a import a
    from directory.b import b
    a()
    b()

    그러나 아래처럼 __init__.py 를 추가하면 폴더를 모듈로(패키징) 사용할 수 있고, 코드가 간결해집니다.

    directory
    |-- __init__.py
    |-- a.py
    |-- b.py
    app.py
    
    # __init__.py
    from .a import a
    from .b import b
    
    # app.py
    from directory import a, b
    a()
    b()

    프로젝트 아키텍쳐

    백엔드

    - Flask-SQLAlchemy: ORM(Object Relational Mapping) 라이브러리 = 파이썬 클래스(object)와 DB(Relational) 매핑
        - models.py: DB 스키마 관리

    - Flask-wtf: Form 데이터 validate 체크 등을 간편하게 할 수 있는 라이브러리
        - forms.py: 제출용 form 관리

    - Flask-admin: 관리자 페이지를 간편하게 생성하고 관리할 수 있는 라이브러리
        - admin_models.py: 관리자 페이지 관리

    - auth.py: auth 하위에 login, logout, sign-up 엔드포인트 관리

    - views.py: views 하위에 about-me, category, contact, post_read, post_write, posts-list 엔드포인트 관리
     

    프론트엔드

    - Jinja2 템플릿 엔진 - 부트스트랩 템플릿 코드 활용


     

    1. 프로젝트 폴더 구조

    MyBlog_project
    ㄴvenv			# 가상환경
    ㄴblog
      ㄴstatic			# assets, css, js 폴더 + 파일들 관리
      ㄴtemplates			# html 템플릿 관리
      __init__.py 			# blog 패키징 파일
      auth.py			# auth 엔드포인트 관리
      views.py			# views 엔드포인트 관리
      config.py			# 각종 환경변수 관리(Secret key, db URI 관리 등)
      forms.py			# flask-wtf 폼 관리
      models.py			# flask-sqlalchemy 모델 관리(스키마 관리)
    ㄴtests  		# 테스트 코드 작성 시 설명
    ㄴmigrations  		# flask-migrate 모듈 사용 시 설명(자동 생성)
    .gitignore  		# git 추적 X 파일 관리
    Readme.md		# 프로젝트 소개
    app.py			# 플라스크 앱 실행 파일

     

    2. Flask app 생성(with 팩토리 함수)

    Flask 웹 어플리케이션 생성의 기본은 Flask 객체를 선언하는 것입니다. 이 때 해당 객체를 전역으로 접근하지 못하게 함으로써 순환참조를 방지하는 패턴이, 팩토리함수(create_app)입니다. 따라서 플라스크 앱 실행 시 app(Flask 객체)을 create_app 메소드 내에서 생성한 뒤, config 파일로 환경설정을 진행하고 해당 객체를 return하는 패턴이 자주 사용됩니다.
    테스트용 환경 설정도 간편하게 하기 위해, 아래처럼 config를 매개변수로 받는 팩토리 함수를 지정해주는게 좋습니다!
    자세한 코드는 아래를 참고해주시고, 더 깊은 내용을 알고 싶으시면 아래 링크를 참고해주세요.
    https://flask-docs-kr.readthedocs.io/ko/latest/patterns/appfactories.html

     

    어플리케이션 팩토리 — Flask 0.11-dev documentation

    어플리케이션 팩토리 여러분이 어플리케이션에 이미 패키지들과 청사진들을 사용한다면(블루프린트를 가진 모듈화된 어플리케이션) 그 경험들을 좀 더 개선할 몇 가지 정말 좋은 방법들이 있

    flask-docs-kr.readthedocs.io

    # blog/__init__.py
    from flask import Flask
    
    def create_app(config):
        ''' 
        플라스크의 팩토리 지정함수(app 객체 생성 함수)
        app 객체를 생성할 때 전역으로 접근하지 못하게 함 
        즉, 순환 참조 방지
        '''
        app = Flask(__name__)
        app.config.from_object(config) # 환경변수 설정 코드
    
        return app
        
    # blog/config.py
    import os
    
    class Config():
        PORT = ~~ # 사용자 설정
        SECRET_KEY = ~~ # 사용자 설정
        
    # app.py
    from blog import create_app
    from blog.config import Config
    
    app = create_app(config=Config) # config로 db 연결 설정
    app.run(debug=True, port=Config.PORT)

     
    SECRET_KEY 생성은 총 3가지 방법이 있으니 원하시는 방법을 선택하시면 됩니다.
    모듈을 사용해 SECRET_KEY를 생성하고 난 뒤, 해당 결과값을 SECRET_KEY에 넣어주세요. 메소드를 직접 할당한다면 서버 restart와 동시에 SECRET_KEY가 재생성되면서 관련된 모든 데이터들이 초기화됩니다!
    (출처: https://stackoverflow.com/questions/34902378/where-do-i-get-secret-key-for-flask)

    # 방법 1: os 모듈 사용(python 2 or 3 사용 가능)
    import os
    >>> os.urandom(12)
    '\xf0?a\x9a\\\xff\xd4;\x0c\xcbHi'
    >>> os.urandom(12).hex() # python 3 사용 가능
    'f3cfe9ed8fae309f02079dbf'
    
    # 방법 2: uuid 모듈 사용(python 2 or 3 사용 가능)
    import uuid
    >>> uuid.uuid4().hex
    '3d6f45a5fc12445dbac2f59c3b6c7cb1'
    
    # 방법 3: secrets 모듈 사용(python 3.6 이상 사용 가능)
    import secrets
    >>> secrets.token_urlsafe(16)
    'Drmhze6EPcv0fN_81Bj-nA'
    >>> secrets.token_hex(16)
    '8f42a73054b1749f8f58848be5e6502c'

     

    주의

    app.config.from_object 메소드 소스코드를 살펴보면 아래와 같습니다. 따라서 Config 클래스 내의 모든 속성은 대문자로 선언해야합니다.

    for key in dir(obj):
        if key.isupper():
            self[key] = getattr(obj, key)

     
     

    3. git 연결(with gitbash)

    프로젝트를 관리하기 위해 git bash를 활용, git과 연결해주겠습니다.

    # 1. git 기초 설정
    # 프로젝트 루트 디렉토리에서 터미널 열고 실행해주세요.
    # git version 2.42.0.windows.2 
    git init
    
    # 2. branch 설정
    # 버전에 따라 다르지만, default가 master로 뜨는 경우(구버전)
    # 그냥 연결해버리면 새로운 branch가 분기되기 때문에
    # branch 이름을 main으로 설정해야합니다.
    git branch -m main
    
    # 3. git repo와 현재 프로젝트 연결
    # git repo는 git 들어가서 새 repo 생성해주시고, 해당 repo url 넣어주시면 됩니다.
    git remote add origin [연결하려는 git repo]
    
    # 4. 변경사항 스테이징
    # . 은 모든 변경사항을 스테이징한다는 뜻입니다.
    # 스테이징 전에, 아래 gitignore 설정을 해주신 뒤에 진행해주세요.
    git add .
    
    # 5. 변경사항 commit
    git commit -m "변경사항을 적어주시면 됩니다."
    
    # 6. 변경사항 push
    # 현재 작업중인 브랜치에서 origin(git repo)의 main 브랜치에 push하도록 함 
    # git push --set-upstream origin [branch 이름] 
    # pull 먼저 하라는 오류 뜬다면 --force를 붙여주세요
    git push --set-upstream origin main

     

    4. .gitignore 파일 설정

    .gitignore 파일은 git에서 추적하지 않도록 하고 싶은 파일, 폴더를 관리하는 파일입니다.(venv 폴더, config 파일 등)
    flask-migrate는 db 스키마 변경, 테이블 삭제 등의 변경사항이 발생할 때 간단한 명령어들로 db를 관리할 수 있는 라이브러리입니다. flask db init시 migrations 폴더가 생성되면서 db 버전 관리를 자동으로 추적해주는데, 이 때문에 git에 push하면 여러 문제가 발생한다고 합니다. 그래서 제외했습니다.
    해당 문제에 대해서 참고한 글입니다. https://foramonth.tistory.com/32

     

    Django - .gitignore활용 (feat. migrations)

    django 웹 개발을 진행 중일 때, 어떤 파일들을 .gitignore에 포함시켜야 할까? Jump to django 문서를 참고해 아래의 파일들을 .gitignore를 사용해 commit목록에서 제외시켜 왔다. .idea db.sqlite3 __pycache__ *.pyc v

    foramonth.tistory.com

    # Environments
    venv/
    
    # config 파일
    *config*
    
    # sqlite3 db
    db.sqlite3
    *.db
    
    # migrations 폴더 제외
    migrations/
    
    # 컴파일된 모듈의 캐시 디렉토리 무시
    # .pyc, .pyo, .pyd 무시
    __pycache__
    *.py[cod]

    프로젝트 기초 설정은 모두 완료했습니다. 다음으로 아래 순서대로 프로젝트를 진행하도록 하겠습니다.
    1. flask-sqlalchemy(with flask-migrate)로 db 관리
    2. flask-admin으로 관리자 페이지 생성 및 관리
    3. Blueprint로 엔드포인트 관리 + flask_login으로 로그인 관리

    반응형
Designed by Tistory.