> For the complete documentation index, see [llms.txt](https://doongu.gitbook.io/pk_select/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://doongu.gitbook.io/pk_select/project-development/back/flask/view.md).

# app/

## *<mark style="background-color:green;">/app</mark>*

### *`/__init__.py`*

{% hint style="success" %}
application을 run\_app에서 받은 config를 토대로 생성하는 곳이다.

views*api와 controller*api에 있는 blueprint를 받아와 application 레지스터리에 등록도 한다.&#x20;
{% endhint %}

```python
"""
Application Factory Module
"""
from logging import DEBUG, debug
from flask import Flask

from .api.views_api import views_bp
from .api.controller_api import controller_bp


def create_app(config):

    application = Flask(
        import_name=__name__, static_folder="./static/", template_folder="./static/"
    )

    application.config.from_object(config)

    application.register_blueprint(views_bp, url_prefix="/")
    application.register_blueprint(controller_bp, url_prefix="/")

    return application

```

## *<mark style="background-color:green;">/app/api</mark>*

### *`/__init__.py`*

{% hint style="success" %}
&#x20;\_\_init\_\_은 특정 클래스나 폴더 혹은 모듈이 호출될떄 함께 호출되고 실행되며, 패키지로 인식하게 해준다.

&#x20;python3.3 버전부터는 `__init__`*`.`*`py` 파일이 없어도 패키지로 인식한다([PEP 420](https://www.python.org/dev/peps/pep-0420/)). 하지만 하위 버전 호환을 위해 `__init__.py` 파일을 생성하는 것이 안전한 방법이다.
{% endhint %}

###

### *`/controller_api/__init__.py`*

{% hint style="success" %}
Blueprint 등록을 위한 *init*.py 파일이다.
{% endhint %}

```python
"""
로그인 확인 및 LMS데이터를 return
"""
from flask import Blueprint
from .login_api import login_router


controller_bp = Blueprint("controller_bp", __name__)
login_router(controller_bp)

```

###

### *`/controller_api/login_api.py`*

{% hint style="success" %}
mainpage에서 id와 pw값을 받으면 controller/login\_checher.py에 해당 값을 보내  로그인 검증을 시행하고, 로그인이 되지 않는다면 에러 코드와 메세지를 반환 로그인이 된다면 해당 아이디로 가져온 lms 데이터를 반환해준다.&#x20;
{% endhint %}

```python
from flask import request
from controller import login_checker, selecter


"""
circular import 방지를 위해 deco함수를 만들었다
controller/login_checker.py에 해당 값을 보냄
"""
def login_router(login_bp):
    @login_bp.route("/login", methods=["POST"])
    def login_api():
        json_data = request.get_json()

        pk_user_id = json_data["pk_user_id"]
        pk_user_pw = json_data["pk_user_pw"]
        
        login_check_value = login_checker.login_check_and_get_session(
            pk_user_id, pk_user_pw
        )

        if login_check_value == False:
            return {"status" : 400, "error_msg": "올바른 ID혹은 PW가 아닙니다."}

        elif login_check_value == True:
            unoragnized_data = selecter.get_subject_information(pk_user_id, pk_user_pw)
        
        return unoragnized_data

```

###

### *`/views_api/__init__.py`*

{% hint style="success" %}
Blueprint 등록을 위한 *init*.py 파일이다.&#x20;
{% endhint %}

```python
"""
기본 view를 return
"""
from flask import Blueprint
from .views import views_router


views_bp = Blueprint("views_bp", __name__)
views_router(views_bp)

```

###

### *`/views_api/views.py`*

{% hint style="success" %}
pk-select.kro.kr 로 Get요청이 발생하면 main\_page를 보여준다.
{% endhint %}

```python
from flask import render_template

"""
main_page를 보여준다.
"""
# circular import 방지를 위해 deco함수를 만들었다
def views_router(views_bp):
    @views_bp.route("/")
    def main_view_api():

        print("views api inner")
        return render_template("pkselect.html")

```

## *<mark style="background-color:green;">/APP/static</mark>*

### *`/pkselect.html`*

{% hint style="success" %}
&#x20;main\_page와 second*page가 함께 있으며, js와 서버간의 요청을 통해 second\_page를 보여주는 동작을 한다.*
{% endhint %}

### *`/static`*

{% hint style="success" %}
.jpg, .png 등 이미지나 영상들을 모아두는 폴더이다.
{% endhint %}

### *`/js`*

{% hint style="success" %}
사용자가 로그인시 서버에 요청을 보내고, 응답에 따른 결과를 보여준다.
{% endhint %}

### *`/css`*

{% hint style="success" %}
&#x20;.css 파일들을 저장한다.
{% endhint %}
