실행 절차¶
시스템 흐름¶
sequenceDiagram
actor user
user->>Uvicorn: 브라우저에서 요청
critical: 미들웨어 실행
Uvicorn->>+Middleware: 요청 검증 및 처리
option: 정상 처리
Middleware->>Controller: 요청 처리 결과 전송
option: 오류 발생
Middleware->>-Uvicorn: 예외 처리 전송
Uvicorn->>user: 예외 처리 결과 전송
end
opt
Controller->>+Model: 데이터베이스 조회
Model->>-Controller: 데이터 전달
end
Controller->>View: 데이터 렌더링
View->>Uvicorn: 렌더링 결과 전송
Uvicorn->>user: 렌더링 결과 전송
그누보드 실행 과정¶
uvicorn
서버를 실행하면 main.py
를 기준으로 core, lib, plugin, theme 등의 파일을 찾아서 실행합니다.
참고
기본적으로 FastAPI의 실행 단계를 따릅니다.
1. Import¶
첫번째로 FastAPI 클래스를 가져오는 것과 함께 그누보드6 실행에 필요한 파이썬 라이브러리를 가져와 실행합니다. 가져오는 패키지는 크게 3가지로 나눌 수 있습니다.
-
Python 기본 및 써드파티 라이브러리
import datetime from apscheduler.schedulers.background import BackgroundScheduler from fastapi import FastAPI, Path, Request, Response from fastapi.responses import HTMLResponse, JSONResponse, RedirectResponse from pydantic import TypeAdapter from sqlalchemy import select, insert, inspect from starlette.staticfiles import StaticFiles
-
그누보드6 Core
import core.models as models from core.database import DBConnect, db_session from core.exception import ( AlertException, regist_core_exception_handler, template_response ) from core.middleware import should_run_middleware, regist_core_middleware from core.plugin import ( cache_plugin_state, cache_plugin_menu, get_plugin_state_change_time, import_plugin_by_states, read_plugin_state, register_plugin, register_plugin_admin_menu, register_statics ) from core.template import register_theme_statics, TemplateService, UserTemplates
-
그누보드6 유틸리티 함수 및 클래스
2. FastAPI 인스턴스 생성¶
먼저 FastAPI 인스턴스를 생성하고, 그누보드6 실행에 필요한 설정들을 추가합니다.
정적파일 경로 추가¶
-
각 테마의 static 경로를 추가합니다.
-
공용 static 경로를 추가합니다.
라우터 등록¶
사용자의 요청을 처리할 라우터를 등록합니다.
app.include_router(admin_router, prefix="/admin", tags=["admin"])
app.include_router(install_router, prefix="/install", tags=["install"])
app.include_router(board_router, prefix="/board", tags=["board"])
app.include_router(login_router, prefix="/bbs", tags=["login"])
...
Middleware¶
사용자의 특정 경로 작업을 처리하기 이전에 실행되고 사용자의 요청을 반환 하기 전 모든 응답에도 적용할 수 있는 기능입니다. 그누보드6의 미들웨어는 core/middleware.py
와 main.py
에서 정의합니다.
1. middleware.py
¶
그누보드 실행에 필수적인 미들웨어를 정의합니다. regist_core_middleware
함수를 통해 등록합니다.
core_middleware
- 플러그인, 접속환경(접속 기기, 반응형 등)을 처리하는 커스텀 미들웨어입니다.
SessionMiddleware
- 세션을 처리하는 starlette의 미들웨어입니다.
BaseSchemeMiddleware
X-Forwarded-Proto
헤더를 통해 기본 스킴을 설정하는 커스텀 미들웨어입니다.
2. main.py
¶
main_middleware
- 설치 여부 확인, 로그인, 기본환경설정, 접속자 이력 등을 처리합니다.
3. 플러그인 추가¶
사용자가 설치한 플러그인을 추가하고 필요한 정보들을 캐시합니다.
플러그인 활성화 상태에 따라서 import, 관리자메뉴, static 경로 추가의 작업이 실행됩니다.
기본 라우터 등록 보다 먼저 실행됩니다.
# 플러그인 라우터 우선 등록
plugin_states = read_plugin_state()
import_plugin_by_states(plugin_states)
register_plugin(plugin_states)
register_statics(app, plugin_states)
cache_plugin_state.__setitem__('info', plugin_states)
cache_plugin_state.__setitem__('change_time', get_plugin_state_change_time())
cache_plugin_menu.__setitem__('admin_menus', register_plugin_admin_menu(plugin_states))
4. exception_handler 등록¶
오류 발생 시, 경고창 템플릿을 렌더링할 수 있는 예외처리 핸들러를 등록합니다. core/exception.py
에서 정의한 regist_core_exception_handler
함수를 통해 등록합니다.
5. scheduler 등록¶
정해진 시간 또는 일정 간격으로 실행되는 작업을 등록합니다.
기본적으로 매일 오전 10시, 최근게시물/쪽지/접속자로그/인기검색어/탈퇴회원 삭제 처리가 등록되어 있습니다.
# 예약 작업을 관리할 스케줄러 생성
# https://apscheduler.readthedocs.io/en/3.x/modules/triggers/cron.html
scheduler = BackgroundScheduler(timezone='Asia/Seoul')
@scheduler.scheduled_job('cron', hour=10, id='remove_data_by_config')
def job():
delete_old_records()
# FastAPI 앱 시작 시 스케줄러 시작
scheduler.start()
참고
추후 코드가 변경/개선 될 수 있는 부분입니다.