python-flask / 1.flask 시작하기

dothouse·2024년 1월 26일

python_flask

목록 보기
2/11

1. 가상환경

  • 웹 구현하고, 서비스 할때 package 충돌을 막기 위해 가상환경을 구현

python 가상환경 생성

cmd 활용

# 가상환경 폴더 생성
D:\> mkdir venvs

# 해당폴더 이동 후 
D:\> cd venvs

# 가상환경 생성
D:\venvs> python -m venv 프로젝트 이름

d:/song/practice/project1/web
Flask app이 담길 폴더(각자에 맞게 생성)
해당 폴더에 Flask 관련 파일 정리

2. Flask 환경설정

flask app의 기본설정 (ex - app 이름 , debuging 설정 등)을
가상환경 시작과 함께 적용하기 위해
기본설정을 담은 cmd파일로 만들어 두면 편하다.

cmd 파일 생성

D:\venvs> 에서 jeju.cmd 파일 생성

  • 가상환경 폴더(D:\venvs>)와 맞는 이름(jeju) 사용

파일내용

@echo off
d:
cd d:/song/practice/project1/web
set FLASK_APP=jeju
set FLASK_DEBUG=true
d:/song/venvs/jeju/scripts/activate

cmd 파일 설명

명령어를 화면에 표기하지 않는다

  • @echo off

d: 드라이브로 이동 (C드라이브에 파일, 가상환경 만들었으면 제외)

  • d:

Flask app이 있는 폴더로 이동

  • cd d:/song/practice/project1/web

Flask app의 이름을 jeju로 사용하겠다 (base folder내의 폴더이름으로)
ex) 저의 경우 app 이름이 jeju이고 base folder인 web아래에 같은 이름으로 폴더 생성
폴더 이름과 app 이름이 반드시 일치해야한다.
d:/song/practice/project1/web/jeju

  • set FLASK_APP=jeju

Flask app동작시 debuging을 해주세요
set FLASK_DEBUG=true

가상환경 작동
d:/song/venvs/jeju/scripts/activate

3. 기본틀 만들어보기

1) __init__.py

[파일명] d:/song/practice/project1/web/jeju/__init__.py

  • 예시
# flask 패키지
from flask import Flask

# app 구동을 위한 부분
# 함수이름(create_app)과 return 부분의 이름은 그대로 사용
# def create_app(): 이 만들고자 하는 app의 실행과정을 설명하는
def create_app():

	# app의 이름 
    # cmd 옵션에서 set FLASK_APP=jeju로 설정하여서 
    # app 이름은 jeju로 설정됨
    app = Flask(__name__)
    
    # 앱이 실행되면 
    # def start()의 내용을 'http://127.0.0.1:5000/' 주소에 나타내주세요!   
    # 즉, http://127.0.0.1:5000 뒷부분의 주소를 결정
    @app.route('/')
    def start():
        return 'Start!'
	
    return app # 변경 불가!

2) 실행 구현 - Flask run

a. cmd 창에서 jeju.cmd 파일을 실행 -> 가상환경 진입 / 폴더 변경
b. flask run -> Flask 실행
c. http://127.0.0.1:5000 주소 실행

ex) cmd 창 예시

C:\Windows\system32>jeju

(jeju) d:\song\practice\project1\web>flask run
 * Serving Flask app 'jeju'
 * Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 127-131-603

4. Flask 구조 만들기

1) 사용구조

web -> base folder
│
├─  jeju 
│	├── static (image, css 와 같은 양식을 담기 위한 폴더)
│   │   ├── bootstrap.min.css
│   │   └── bootstrap.min.js
│	│
│   ├── templates (구현하고자 하는 html)
│   │	├── weather
│   │	│	├── weather.html
│   │	│	├── show_weather.html
│   │	│	└── show_pm.html
│	│
│   ├── views (html 파일 routing과 해당 html에 필요한 정보를 보내는 py파일)
│   │	│	├── info_views.py
│   │	│	├── main.py
│   │	│	└── weather_views.py
│	│
│   ├── __init__.py (flask app - 여기선 jeju에 관한 정보, blueprint 등)
│	│
│   ├── filter.py (프로젝트 내에서 사용하고자 하는 함수들)
│	│
│   ├── models.py (연동 sqlite 데이터 모델)
│	│
├─  migrations (sqlite 연동과 관련된 폴더 - migrate시 자동생성)
│	├── versions
│	│	└── etc....
│	└── etx..
│
├─ config.py (환경설정 파일)
│
├─ jeju.db (db파일)
└── requirements.txt

2) 구조 만들어보기

(1) blueprint

__init__.py에 모든 내역을 관리 할 수 있지만, 효율적인 코드 관리를 위해 사용하는 기능
다양한 views파일을 만들고 각기 다른 화면(html)을 관리하도록 하기 위해 blueprint 기능을 사용
-> __init__.py파일과 다른 view파일들을 연결한다고 생각하면 편할듯


a. blueprint 파일 생성 - views 파일

[파일명] d:/song/practice/project1/web/views/main_views.py 생성

from flask import Blueprint, url_for
from werkzeug.utils import redirect

### main_view.py에 생성하는 route에 대한 정보 작성
# 'main'이라는 묶음으로 사용하고, routing되는 주소의 접두사
# 향후 실제 예를 통해 재설명 예정
bp = Blueprint('main', __name__, url_prefix='/')

### blueprint를 사용하지 않을때는 @app.route('/') 사용
### blueprint를 사용하게 되면 @bp.route('/') 사용
@bp.route('/')
def select1():

	### return 부분 - 해당 파일이 표현할 html을 연결
    # 아래 설명참고
    return redirect(url_for('select1.open_select1'))

✅ return에 필요한 내용

  • redirect - http://127.0.0.1:5000/ 에 접속시 '다른 경로로 재연결'
  • url_for - html로 연결하는 것이 아니라 blueprint로 연결
    -> select1.open_select1 - select1 이라는 blueprint의 open_select1이라는 함수로 연결
  • html로 바로 연결이 팔요할 경우
    ->render_template("weather/show_pm.html")

b. blueprint 적용하기

blueprint를 사용하기 위해서는 base 파일인 __init__.py에 적용하고자 하는 blueprint의 내용을 등록하여하 한다.

App 구동의 가장 기본 설정이 담기는 파일
각 부분의 설명은 코드 참조

[파일명] d:/song/practice/project1/web/jeju/__init__.py 변경

from flask import Flask

def create_app():
    app = Flask(__name__)
    
    # 사용하고자 하는 Blueprint를 불러오고
    from .views import main_views
    # app에 blueprint로 등록한다.    
    app.register_blueprint(main_views.bp)

    return app

✅ app.register_blueprint(블루프린트 내용)
불러오는 파일이름.bp 형태로 작성

4. 에러발생

❓ 위의 순서대로 진행할 경우 에러가 발생한다.(사진 첨부예정)

  • main_views를 통해 http://127.0.0.1:5000/ 로 접속시 select1.open_select1로 redirect 하도록 하였는데 현재 select1라는 blue print를 만들지 않았기 때문에 에러가 발생한다.
  • 다음 글에서 select1_views.py, select1.html를 만들어 연결해주면 해당 에러는 사라질 것이다.

✅ Flask를 진행할때 위와 같은 오류를 상당히 많이 만나게 될 것이다.

  • Flask 구조, 데이터 전송 방식, html 등 다양한 오류가 발생
  • 위와 같은 화면은 열심히 보면, 어떤 부분에서 에러가 발생했고, 이 에러는 어떻게 해결하면 좋은지 힌트를 준다.

✅ 위의 오류 설명

5. 새로운 페이지를 만들때 기억하며 좋은 순서

✅ 새로운 페이지를 구성하기 위해는 3단계를 거처야 한다.

1. 구현하고자 하는 페이지(html) 만들기

2. 해당 페이지를 구동하기 위한 views 파일 만들기

3. __init__.py에 blueprint 기능 추가

✅ 항상 이 순서를 기억
✅ 이 순서에 따라 틀을 먼저 만들고, html파일과 views파일을 수정하는 것이 확인을 위해 편하다.

profile
새로운 길

0개의 댓글