2025/09/22 Flask -1

김기훈·2025년 9월 22일

TIL

목록 보기
23/191

폴더 기본 구조

main 및 Flask 실행방법

from flask import Flask

app = Flask(__name__)
  • name : 현재 모듈의 이름을 나타냄

라우팅(routing)

  • URL과 특정 함수 간의 매핑을 정의하는 것
    • @app.route() 데코레이터를 사용하여 특정 URL 경로에 대한 요청이 발생했을 때 실행될 함수를 지정
# http://127.0.0.1:5000/hello 로 접속하면 hello() 함수가 실행됨.
                    @app.route("/hello")
                    def hello():
                        return "Hello Flask!"

# 기본 경로에 대한 라우트(127.0.0.1:5000/)
                      @app.route('/')
                      def home():
                          return 'Hello, this is the home page!'

# 다른 경로에 대한 라우트(127.0.0.1:5000/about)
                      @app.route('/about')
                      def about():
                          return 'This is the about page.'

# 127.0.0.1:5000/project
                      @app.route('/project')
                      def project():
                          return 'The project page'
                     
# 동적인 URL 파라미터 사용
                      @app.route('/user/<username>')
                      def show_user_profile(username):
                          return f'User: {username}'

                      # URL에 변수 및 타입 지정
                      @app.route('/post/<int:post_id>')
                      def show_post(post_id):
                          return f'Post ID: {post_id}'

# API END POINT 생성 
# CRUD: Create(POST), Read(GET), Update(UPDATE), Delete(DELETE) -> REST API
# GET: 데이터를 요청할 때
# POST: CREATE. 데이터를 생성할 때
            from flask import jsonify # import Flask 대신 jsonify
            @app.route("/api/v1/feeds", methods=['GET'])
            def get_all_feeds():
                # DB에서 불러온다.
                data = {
                    'status': 'success',
                    'feed': {
                        "feed1": "data",
                        "feed2": "data2"
                    }
                }
                # python -> dict -> json
                return jsonify(data)

# 다양한 HTTP 메소드 지원
                    @app.route('/submit', methods=['POST', 'GET'])
                    def submit():
                        if request.method == 'POST':
                            return 'POST method.'
                        else:
                            return 'GET method.'

라우트 함수의 매개변수

  • () 안에 들어가는 건 "라우트에서 전달받는 값"을 받을 매개변수임.
@app.route("/")
def index():
    return "Hello Flask"
  • () 안에 아무 값도 넣지 않는다면, 실행시에 아무런 인자도 받지 않는다.
@app.route("/hello/<username>")
def hello(username):
    return f"안녕하세요, {username}!"
  • URL에서 변수를 받고 싶다면 () 안에 매개변수 이름을 넣을 수 있다.
    • /hello/kihoon → username="kihoon" 으로 함수 안에 전달됨
    • /hello/tom → username="tom"
@app.route("/user/<int:user_id>")
def user_profile(user_id):
    return f"User ID: {user_id}"
  • /user/10 → user_id = 10 (int로 변환됨)
  • /user/abc → 오류 (int로 변환 불가)

Jinja Template

  • Jinja는 파이썬 기반의 템플릿 엔진으로, 주로 웹 개발 프레임워크인 Django, Flask에서 사용
  • 동적으로 데이터를 렌더링하여 HTML, XML, 또는 기타 마크업 언어로 출력하는 데 사용

문법적 특징

    1. 변수 출력 : {{ ... }}
                          <p>{{ variable_name }}</p>
    1. 제어 구조 : {% ... %}
    • 조건문 , 반복문 등의 제어 구조를 표현할 때 사용
1. 조건문
                          {% if user %}
                            <p>Hello, {{ user.name }}!</p>
                          {% else %}
                            <p>Hello, Guest!</p>
                          {% endif %}

2. 반복문
                          <ul>
                          {% for item in item_list %}
                            <li>{{ item }}</li>
                          {% endfor %}
                          </ul>


알면 좋은것

1. 튜플
# app.py
                  from flask import Flask, render_template

                  app = Flask(__name__)

                  @app.route("/")
                  def index():
                      users = [
                          ("user1", "홍길동"),
                          ("user2", "김철수"),
                          ("user3", "이영희"),
                      ]
                      return render_template("index.html", users=users)
                      # 왼 users : 템플릿(index.html) 안에서 사용할 변수 이름
                      # 오 users : 파이썬 함수 index() 안에서 만든 리스트 객체
                      # 즉, 파이썬에서 만든 데이터를 jinja2 템플릿으로 전달
                      
                      # data=users
                      # {% for username, name in data %}


# index.html

                  <ul>
                      {% for username, name in users %}
                          <li>아이디: {{ username }} / 이름: {{ name }}</li>
                      {% endfor %}
                  </ul>
                  --------------------------------------------------------
                  <ul>
                  {% for u in users %}
                      <li>아이디: {{ u[0] }} / 이름: {{ u[1] }}</li>
                  {% endfor %}
                  </ul>

2. 딕셔너리
# app.py
                    @app.route("/")
                    def index():
                        users = [
                            {"username": "user1", "name": "홍길동"},
                            {"username": "user2", "name": "김철수"},
                            {"username": "user3", "name": "이영희"},
                        ]
                        return render_template("index.html", users=users)

# index.html
          <ul>
              {% for user in users %}
                  <li>아이디: {{ user.username }} / 이름: {{ user.name }}</li>
              {% endfor %}
          </ul>
          ------------------------------------------------------------------
          <ul>
              {% for user in users %}
                  <li>아이디: {{ user["username"] }} / 이름: {{ user["name"] }}</li>
              {% endfor %}
          </ul>

요청 데이터 받기 (request)

request는 클라이언트(브라우저) → 서버(Flask 앱) 로 들어오는 모든 요청 데이터를 담고 있는 객체

  • HTML 폼에서 입력한 값, 주소(URL)에 붙은 값, 헤더, 쿠키 등등을 Flask가 request라는 객체로 모아서 줌
# URL 쿼리스트링 (GET 방식)
## 주소창에 ? 뒤에 붙는 값들 → request.args로 가져옴.
                  from flask import Flask, request

                  @app.route("/search")
                  def search():
                      keyword = request.args.get("word")
                      # 여러 값이 들어올 수 있음 → request.args.getlist("word")
                      return f"검색어: {keyword}"
                      # /search?word=python  검색어: python 출력

# 폼 데이터 (POST 방식)
## HTML 폼에서 method="POST" 로 보낸 값 → request.form에서 가져옴.
            @app.route("/login", methods=["GET", "POST"])
            def login():
                if request.method == "POST":
                    username = request.form["username"]
                    password = request.form["password"]
                    return f"로그인 성공: {username}"
                return '''
                    <form method="post">
                        <input name="username" placeholder="아이디">
                        <input name="password" type="password" placeholder="비밀번호">
                        <button type="submit">로그인</button>
                    </form>
                '''

디버그 모드

  • app.run(debug=True) : 코드 바꾸면 자동으로 서버 재시작 + 에러 메시지 자세히 확인 가능.
    • 단, 실제 배포할 때에는 꼭 꺼야함
profile
안녕하세요.

0개의 댓글