00. Intro

1. Python

기술이 발전함에 따라 Python, Java 등 프로그래밍 언어가 발달했다. 그 중 Python을 배우는 이유에 대해 말하려한다. (우리가 앞으로 Python을 이용하여 웹 개발을 할 예정이기 때문에!)

  • Python으로 할 수 있는 것
  1. 업무 자동화 : Excel, PPT
  2. 크롤링 (Crawling) + 인터넷을 이용한 자동화
  3. 서비스 구현 (백엔드 서버)
  4. 데이터 분석 : pandas
  5. 머신러닝
  • Python 장점
  1. 배우기 쉽다.
  2. 다양한 라이브러리를 활용할 수 있다.

2. Python 문법 정리

  • Python 자료형
    • 숫자형(int, float) : 123
    • 문자형(str) : "123"
    • 리스트형(list) : [1, 2, 3]
    • 불형(boolen) : True, False
    • 튜플형(tuple) : (1, 2, 3)
    • 딕셔너리형(dict) : ("Key": "Value", ...)
    • 집합형(set) : set([1, 2, 3])

  • Python 제어문
    • 조건문 if, elif, else

      if 조건문:
      				실행할 코드 ( if 조건문이 참일 때)
      elif 조건문:
      				실행할 코드 ( elif 조건문이 참일 때)
      else: # 있어도 되고 없어도 된다.
      				실행할 코드 (모든 if, elif 조건문이 거짓일 때)
      • 비교 연산자
        • ==
        • !=
        • <, >, <=, >=
      • and, or
    • 반복문 for, while

      • for
      # 1
      for i in range(1000):
        print(i) # 0~999까지
      
      # 2
      cities = ["seoul", "daejeon", "daegu", "busan"] # 대괄호 []
      for city in cities:
        print(city) # seoul, daejeon ...
        if city == "seoul":
        print("")
      
      # 3
      for data in datas:
      • while
      # 1
      while 조건문:
        실행할 문장
        
      # 2
      i=0
      while i < 10:
        i += 1
      
      # 조건문이 참인 경우에 문장이 반복되서 실행
      # continue : 반복되는 문장에서 건너 뛰고 싶을 때
      # break : 반복을 멈추고 싶을 때

  • Python 함수, class
    • 함수 (def)
      : 반복적으로 생성되는 코드들을 재활용하여 사용하고 싶을 때 사용한다.
      def 함수명(매개변수):
        실행할 문장
        
      함수명(인수)
      def Name(name):
        return name
        
      Name()
    • class
      : 데이터 저장이 가능한 하나의 틀이다.
      class FishBread:
        name = "팥붕어빵"
        def redbean_bread(self):
          print("이 붕어빵은 " + self.name + " 입니다.")
        
        def black_bread(self):
          print("이 붕어빵은 " + self.name + " 입니다.")
        
      FishBread.redbean_bread()
      FishBread.black_bread()
        
      a = FishBread() # 클래스 호출
      type(a) # 클래스
      a.redbean_bread() # 클래스 내 함수(메소드)에 접근
      a.black_bread("블랙")
      a.name # 클래스 내 변수(속성)에 접근

  • Python 내장 함수, 외장 함수 (import)
    • 내장 함수
      : Built-in Functions - Python 3.12.1 documentation
    • 외장 함수
      : import 문을 통해 외부의 라이브러리에서 가져온 함수
      ex) bs4, celenium
      # (1) random
      random.random() # 0~1.0 사이의 실수 중에서 난수(무작위로 추출된 숫자)값 리턴
      random.randint(1, 10) # 1~10 사이의 정수 중에서 난수값 리턴
      
      a = [1,2,3,4,5]
      random.choice(a) # list 값 중 무작위로 하나를 선택하여 리턴
      random.shuffle(a) # list를 무작위로 섞는다.
      
      # (2) sys: 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 도와주는 라이브러리
      sys.argv # 파이썬 실행시 파일 뒤에 붙여준 어떠한 값들이 리스트의 값으로 추가됨.
      sys.exit() # 프로그램을 종료시키고 싶은 곳에서 사용
      sys.path # 파이썬 라이브러리들이 설치되어 있는 위치
      sys.version # 파이썬 버전
      
      # (3) os: 시스템(OS)의 환경변수, 파일경로 등의 값을 제어할 떄 사용
      os.environ
      os.getcwd() # cwd => current working directory
      os.chdir("경로") # 현재 디렉토리 위치 변경
      os.mkdir("new_folder") # 폴더생성
      os.rename("new_folder", "old_folder")
      os.rmdir("new_folder")

  • 클래스 (Class)
    : 파이썬은 객체지향 프로그래밍 (OOP, Object Oriented Programming)을 지원한다. 그리고 객체지향 프로그래밍의 가장 기본 단위가 클래스다. 하나의 틀과 같은 역할을 하며, 데이터 저장도 가능하다.
    ex) 붕어빵을 만들어 내는 틀 - 팥을 넣으면 팥붕어빵, 슈크림 넣으면 슈크림 붕어빵, 피자 재료를 넣으면 피자 붕어빵
    *함수가 특정 기능을 수행하는 일련의 코드블록을 나타내는데, 클래스는 함수보다는 더 큰 개념. 함수가 여러개 모아놓은 것.

    • class 정의

      class FishBread:
        def redbean_bread(self):
      	print("이 붕어빵은 " + self.name + " 입니다.")
      
        def sucream_bread(self):
      	print("이 붕어빵은 " + self.name + " 입니다.")
    • class 호출

      a = FishBread() # 클래스 호출
      type(a) # 클래스
      
      a.redbean_bread() # 클래스 내 함수(메소드)에 접근
      a.name # 클래스 내 변수(속성)에 접근
    • class 만들기 예제

      class FishBread:
      # 생성자 => 클래스가 호출될 때 가장 먼저 실행되는 메소드
        def __init__(self, name, ingredient, price):
      	self.name = name
      	self.ingredient = ingredient
      	self.price = price
          # self는 데이터를 저장할 수 있게 도와주는 공간.
      
        def bread(self):
      	print("이 붕어빵의 이름은 {}이고, {}이 들어가있습니다. 가격은 {} 입니다.".format(self.name, self.ingredient, self.price))
          
      redbean_bread = FishBread("팥붕어빵", "팥", 500)
      redbean_bread.bread()
      print(redbean_bread.name)
      print(redbean_bread.ingredient)
      print(str(redbean_bread.price))
          
      cream_bread = FishBread("슈크림 붕어빵", "크림", 700)
      cream_bread.bread()
          
      pizza_bread = FishBread("피자 붕어빵", "피자", 1000)
      pizza_bread.bread()

  • module (모듈)
    : 변수, 함수, 클래스 등을 모아 놓은 파일

    • module 사용 방법
      - 함수 정의
        ```py
        # (1) info.py 파이썬 파일 생성하고 함수를 정의
        def name(name):
          print("my name is " + name)
          
        def age(age):
          print("I'm {} years old".format(age))
        
        # (2) chapter8.py 파일로 다시 돌아와서 위 파일을 import
        import info
        
        info.name("inseop")
        info.age(30)
        ```
        
      - 변수 정의
        ```py
        # (1) info.py에 변수 정의
        person = {
          "name": "inseop",
          "age": 30,
          "city": "seoul"
        }
        
        # (2) chapter8.py에서 변수 정의
        import info
        
        name = info.person["name"]
        print(name)
        
        age = info.person["age"]
        print(age)
        
        city = info.person["city"]
        print(city)
        
        # (3) 모듈 이름을 붙이지 않고 모듈 함수 바로 호출
        from 모듈이름 import 함수이름 (또는 *)
        
        from info import name, age
        from info import *
        ```

  • Package (패키지 = 라이브러리)
    : 모듈들의 집합 → 여러 모듈들이 하나의 상위 폴더에 모여 있는 것

    변수 → 함수 → 클래스 → 모듈 → 라이브러리


01. Flask 서버 구축을 귀한 개발 환경 설정

Python 사용을 좀 더 편리하게 도와줄 툴 2가지를 사용한다.

  1. Anaconda - 필수
  2. Visual Studio Code (VSC)

두 가지 프로그램을 설치하고 난 뒤 Flask 프로젝트를 위한 세팅을 진행한다.

1. 프로젝트 폴더 생성

터미널에서 아래 코드를 작성하여 프로젝트용 폴더를 생성한 뒤 해당 폴더로 이동한다.

> mkdir (원하는 폴더 이름) # 폴더 생성 (Make Directory)
> cd (생성한 폴더 이름) #폴더 이동 (Change Directory)

2. 가상 환경 (Virtual Environment)

우리는 프로젝트를 하는 동안 가상 환경을 이용할 거기 때문에 가상 환경에 대한 세팅을 해야한다.

# 1. jango - poetry
> poetry init
> poetry add flask

# 2. conda
> conda create -n test_env python=3.10

# 3. venv (기본)
python3.10 -m venv .venv
source .venv/bin/activate
cd .\venv\Scripts\activate

가상 환경에 대한 모듈은 몇 가지 있는데 우리는 파이썬 기본 내장 모듈인 venv 모듈을 사용할 것이다. 기본적으로 .venv로 폴더명을 만들어 사용하게 된다.

그리고 Window의 경우 Ctrl+Shift+p / MAC의 경우 Command+Shift+p를 누른 후 Python interptreter를 검색하여 Python 3.12.1('.venv\Scripts\python.exe)를 선택한다. (MAC의 경우 .venv/bin/python)

그리고 가상 환경을 만든 후에는 가상 환경을 활성화 시켜줘야 하는데⭐ 그 이유는 해당 프로젝트에서 사용할 모듈을 가상 환경에 설치해야되기 때문이다.

# MAC
> source .venv/bin/activate
# Window
> cd .\.venv\Scripts\activate

3. Flask 모듈 설치

가상 환경을 활성화 한 뒤 Flask 모듈을 설치해 줄 것이다.

> pip install flask

설치가 완료되면 Lib 폴더에 flask 관련 폴더들이 생성된 것을 확인 할 수 있다.

4. app.py 생성

생성한 부모 폴더에서 app.py 파일을 생성해준다.

from flask import Flask

app = Flask(__name__)

여기서, __name__이란 건 파이썬에서 내장된 특별한 변수로, 현재 모듈의 이름을 나타낸다. 이 변수는 파이썬 스크립트가 직접 실행되는 경우와 모듈로 임포트되는 경우에 서로 다른 값을 가진다.

  1. 직접 실행되는 스크립트의 경우
if __name__ == "__main__":
    # 이 부분은 스크립트가 직접 실행될 때만 실행됨
    # 주로 스크립트의 진입점(main)으로 사용

이렇게 사용하는 이유는 다른 모듈에서 이 스크립트를 임포트할 때 해당 블록이 실행되지 않도록 하기 위함이다. 즉, 다른 모듈에서 이 스크립트를 임포트하면 __name__은 모듈의 이름이 되어 위 조건이 거짓이 되어 해당 블록이 실행되지 않는다.

  1. 모듈로 임포트 되는 경우
# 다른 모듈에서 임포트되면 __name__은 모듈의 이름이 됨

test.py
print(f"test.py __name__ : {__name__}")
# test.py __name__ : __main__

app.py
import test
print(f"app.py __name__ : {__name__}")

# test.py __name__ : test
# app.py __name__ : __main__

__name__ 변수를 이용하여 모듈이 어떻게 사용되고 있는지에 따라 특정 코드 블록이 실행되도록 할 수 있다. 이는 모듈의 테스트 코드를 작성하거나 모듈을 스크립트로 실행할 때 특정 동작을 수행할 때 유용하다.

5. Flask 실행

> python -m flask
or
> flask run
or
> flask --app app.py --debug run

flask를 통해 나의 컴퓨터를 서버로 만들었다.
127.0.0.1: localhost라고도 부르며, 내 컴퓨터를 가리킨다.

만약에 flask의 host와 port를 지정해주고 싶다면 아래 코드를 app.py에 작성하여 실행한다. (기본적으로 5000port를 사용하고, 해당 5000 port를 이미 사용중일 때 사용.)

from flask import Flask

app = Flask(__name__)

host='127.0.0.1'
port='8000'

if __name__ == "__main__":
	app.run(host=host, port=port)
  • flask 애플리케이션을 가동하는 방법의 차이
    1. 직접 실행하는 방법
      python your_app.py
      이 명령어를 사용하면 your_app.py 파일에 있는 Flask 애플리케이션이 직접 실행된다. 이 경우, Flask는 내장 웹 서버를 사용하여 애플리케이션을 가동한다.
    2. flask run 명령어 사용
      flask run
      이 명령어를 사용하면 Flask 내장 서버가 아닌 Werkzeug 서버를 사용하여 애플리케이션을 가동한다. 이 방법은 개발 서버를 띄우는 데 유용하며, 개발 중에 코드 변경을 감지하고 자동으로 서버를 다시 시작하는 기능을 제공한다. 또한, 디버그 모드와 다양한 설정 옵션을 사용할 수 있다.
    즉, python your_app.py로 직접 실행하는 것은 간단한 경우에 사용하고, flask run 명령어는 개발 서버를 띄울 때 사용하는 것이 편리하다. 개발 환경에서는 주로 flask run 명령어를 사용하며, 배포 환경에서는 보통 외부 웹 서버 (예: Gunicorn, uWSGI, Nginx) 와 함께 사용된다.

02. Flask란?

1. Flask

Flask는 Django처럼 정해진 틀이 아니라 필요한 모듈들을 불러와 자유롭게 개발 가능한 자유도가 높은 웹 서비스 개발을 위한 파이썬 웹 마이크로 프레임워크이다. (확장성이 좋다고도 할 수 있다.) 그래서 가볍고 간결하여 python 파일 하나로 서버 생성이 가능하다. 그리고 python처럼 쉬워 처음 python으로 백엔드 서비스를 구축하는 경우 객체 지향에 대한 이해, Django의 구조적 염격함 등으로 진입장벽이 있는 것에 비해 사용하기 쉽다.

2. Full-stack Framework VS. Micro Framework

  1. Full-stack Framework (풀스택 프레임워크)
  • 풀스텍 프레임워크는 전체적인 애플리케이션의 개발에 필요한 모든 것을 포괄적으로 제공하는 프레임워크이다.

  • 주로 백엔드 및 프론트엔드 개발에 필요한 도구, 라이브러리, 패턴 등을 포함한다.

  • 특징

    1. 기능의 포괄성
      : 데이터베이스 처리, 서버 구축, 사용자 인터페이스 등 모든 기능을 하나의 프레임워크에서 다룬다.
    2. 내부 일관성
      : 일관된 코드 구조 및 설계 원칙을 따르므로 프로젝트의 일관성을 유지하기 쉽다.
  • 대표적인 풀스텍 프레임워크
    : Java Spring, Python Django, Ruby on Rails 등

    • Java Spring
      • 스프링은 자바 기반의 오픈 소스 프레임워크로, 엔터프라이즈급 애플리케이션 개발을 위한 다양한 모듈을 제공한다.
      • 대표적인 모듈로 Spring MVC (웹 애플리케이션 개발), Spring Boot (마이크로서비스 개발), Spring Data (데이터 액세스), Spring Security (보안) 등이 있다.
      • 장점
        : 강력한 의존성 주입 (DI)과 제어 역전(IoC) 기능으로 모듈 간의 결합도를 낮추어 유지보수성을 높인다.
        방대한 커뮤니티와 생태계로 빠른 문제 해결과 다양한 기능 확장이 가능하다.
      • 단점
        : 초기 학습 곡선이 높을 수 있다.
    • Python Django
      • Django는 Python 기반의 웹 프레임워크로 고수준의 웹 개발을 위한 기능을 포괄적으로 제공한다.
      • 대표적인 모듈로 ORM(객체 관계 매핑), MTV(Model-Template-View) 아키텍쳐, Django REST framework(RESTful API 개발)등이 있다.
      • 장점
        : 기본적인 기능들이 이미 내장되어 있어 빠르게 개발을 시작할 수 있다.
        강력한 ORM 기능으로 데이터베이스 작업이 편리하다.
      • 단점
        : 설정이 자동으로 이루어지기 때문에 초보자에게는 이해햐기 어려울 수 있다.
    • Ruby on Rails
      • Rails는 Ruby 언어를 기반으로 하는 웹 애플리케이션 프레임워크로, 간결한 코드와 개발자 편의성을 강조한다.
      • 대표적인 모듈로는 MVC 아키텍처, ActiveRecord(ORM), Action Pack(웹 요청 처리) 등이 있다.
      • 장점
        : 간결하고 직관적인 코드 작성이 가능하며, 개발 생산성이 높다.
        동적 언어인 Ruby의 특징을 살려 유연한 프로그래밍이 가능하다.
      • 단점
        : 대규모 애플리케이션에는 부적합할 수 있다.
  1. Micro Framework (마이크로 프레임워크)
  • 마이크로 프레임워크는 작고 경량화된 프레임워크로 필요한 부분만을 담당하고 있다.

  • 주로 특정 기능에 중점을 두고, 개발자가 필요한 도구 및 라이브러리를 선택적으로 추가하여 사용한다.

  • 특징:

    1. 경량성
      : 필요한 부분만을 다루기 때문에 더 가벼우며, 프로젝트에 필요한 기능을 선택적으로 확장할 수 있다.
    2. 유연성
      : 다양한 도구 및 라이브러리를 조합하여 사용할 수 있어 개발자가 자유롭게 확장할 수 있다.
    3. 학습 곡선의 낮음
      : 더 적은 규모의 코드와 단순한 구조로 인해 학습이 빠르게 이루어진다.
  • 특정 기능에 초점을 맞추고 필요한 부분만을 다룬다.

  • 작은 규모와 유연성을 유지하기 위해 상대적으로 자유로운 코드 구조를 가진다.

  • 선택적으로 필요한 부분을 확장하여 사용하기 때문에 더 유연하게 확장할 수 있다.

  • 대표적인 마이크로 프레임워크
    : Flask (Python), Express.js (JavaScript - Node.js)

    • Flask (Python)
      • 가볍고 간단한 웹 애플리케이션을 빠르게 개발할 수 있는 마이크로 프레임워크이다.
      • 확장성이 좋고, 필요한 기능들을 선택적으로 추가할 수 있다.
      • 장점
        :간결한 코드 작성이 가능하며, 빠른 학습 곡선을 갖고 있다.
        확장성이 뛰어나 필요한 기능을 선택적으로 추가 가능하다.
      • 단점
        : 대규모 및 복잡한 애플리케이션에는 부적합하다.
    • Express.js (JavaScript - Node.js)
      • Node.js를 기반으로 하는 가벼운 웹 애플리케이션을 구축하기 위한 마이크로 프레임워크이다.
      • 장점
        : 비동기 프로그래밍에 강점을 갖고 있고, 높은 확장성을 가지고 있다.
      • 단점
        : 오버헤드가 존재하여 Express 자체는 매우 가볍지만, 복잡한 애플리케이션을 구축하기 위해서는 여러 추가 모듈과 미들웨어를 선택하고 구성해야하는 단점이 있다.
        또한, Express는 구조에 대해 엄격한 규칙을 제시하지 않기 때문에, 프로젝트가 커질수록 구조적인 일관성을 유지하는 것이 어려울 수 있다.

03. Route (라우팅)

라우팅은 URL과 특정 함수 간의 매핑을 정의하는 것이다. app.route() 데코레이터를 사용하여 특정 URL 경로에 대한 요청이 발생했을 때 실행될 함수를 지정한다.

  • app.py

    from flask import Flask
    
    app = Flask(__name__)
  • 라우트 방법

    # 1. 기본 경로에 대한 라우트
    @app.route('/')
    def home():
      return 'Hello, this is the home page!'
      
    # 2. 다른 경로에 대한 라우트
    # 127.0.0.1:5000/about
    @app.route('/about')
    def about():
      return 'This is the about page.'
      
    # 3. 127.0.0.1:5000/project
    @app.route('/project')
    def project():
      return 'The project page'
  • URL에 따른 라우트 방법

    # 1. 동적인 URL 파라미터 사용
    @app.route('/user/<username>')
    def show_user_profile(username):
      return f'User: {username}'
      
    # URL에 변수 및 타입 지정
    @app.route('/post/<int:post_id>')		# 숫자로만 받기 위해선 int type 지정 필요.
    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
    @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.'
  • 요청 보내기

    • request.json 사용하기
      : JSON 형태의 데이터를 보낼 경우 (content-typeapplication/json인 경우), request.json 또는 request.get_json()을 사용한다. 이는 파이썬 딕셔너리 형태로 JSON 데이터를 자동으로 파싱해준다.

      • 요청을 보내는 곳

        @app.route('/test')
        def user_profile():
          url = 'http://localhost:5000/submit'
          data = {'key1': 'value1', 'key2': 'value2'}
          response = requests.post(url, data=data)
          return response
      • 요청을 받는 곳

        @app.route('/submit', methods=['POST'])
        def submit():
          data = request.json
          key1 = data.get('key1')
          key2 = data.get('key2')
          return f'Received: key1={key1}, key2={key2}'
        

04. Jinja (Template Engine)

1. Jinja란?

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

2. Jinja 문법적 특징

  1. 변수 출력
  • {{ ... }}
    : 이 구문은 변수의 값을 출력할 때 사용된다. 템플릿에 전달된 변수나 표현식의 결과를 렌더링할 수 있다.
    <p>{{ variable_name }}</p>
  1. 제어 구조
  • {%...%}
    : 이 구문은 조건문, 반복문 등의 제어 구조를 표현할 때 사용된다.
    • 조건문
      {% if user %}
        <p>Hello, {{ user.name }}!</p>
      {% else %}
        <p>Hello, Guest!</p>
      {% endif %}
    • 반복문
      <ul>
      {% for item in item_list %}
        <li>{{ item }}</li>
      {% endfor %}
      </ul>

3. 예제

app.py 파일을 아래 코드로 작성하면 된다.

  • app.py 파일
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    # 템플릿에 전달할 데이터
    data = {
        'title': 'Flask Jinja Template',
        'user': '본인 이름',
        'is_admin': True,
        'item_list': ['Item 1', 'Item 2', 'Item 3']
    }

    # render_template을 사용하여 템플릿 파일을 렌더링
    return render_template('index.html', data=data)

if __name__ == '__main__':
    app.run(debug=True)
  • render_template
    : Flask는 템플릿을 찾기 위해 templates 폴더를 기본적으로 사용한다.

이전에 사용하던 app.py 파일은 다른 폴더에 넣어놓고 현재 app.py파일을 넣는다. 아래 만들 index.html파일은 같은 폴더 내에 templates라는 폴더에 넣어야한다.⭐(매우중요)

  • index.html
<!DOCTYPE html>
<html land='en'>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>{{ data.title }}</title>
  </head>
  <body>
    <h1>Hello, {{ data.user }}!</h1>

    {% if data.is_admin %}
      <p>You have admin privileges.</p>
    {% else %}
      <p>You do not have admin privileges.</p>
    {% endif %}

    <ul>
      {% for item in data.item_list %}
      <li>{{ item }}</li>
      {% endfor %}
    </ul>
  </body>
</html>
  • 이 템플릿은 변수(title, user, is_admin, items)과 제어 구조(if, for)를 사용하여 동적인 HTML을 생성한다.

05. 실습

※ Flask와 Jinja 템플릿을 사용한 사용자 목록 웹 페이지

위에서 배운 내용을 바탕으로 Flask와 render_template를 사용하여 app.py 파일과 index.html 파일을 각자 만들고 Jinja 템플릿을 사용하여 사용자 목록을 HTML로 렌더링하려한다.

index.html에서 각 사용자의 이름과 사용자 직업 이름을 목록 형태로 표시하고 Flask를 실행한다 다음 브라우저에서 해당 서버 주소로 접속하여 결과를 확인한다.

(1) app.py 파일

from flask import Flask, render_template

app = Flask(__name__)
@app.route('/')
def index():
  users = [
    {'username': 'traveler', 'name': 'Alex'},
    {'username': 'photographer', 'name': 'Sam'},
    {'username': 'gourmet', 'name': 'Chris'}
  ]
  return render_template('index.html', users=users)
  if __name__ == '__main__':
    app.run(debug=True)

(2) templates\index.html 파일

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>User List</title>
  </head>
	<body>
 	  <h1>User List</h1>
    <ul>
      {% for user in users %}
        <li>{{ user.name }} ({{ user.username }})</li>
      {% endfor %}
    </ul>
  </body>
</html>

[1일차 후기]

서버를 다룬다는 것은 참 재밌당 히힛


[참고 자료]

  • [오즈스쿨 스타트업 웹 개발 초격차캠프 백엔드 Flask 강의]
profile
백엔드 코린이😁

0개의 댓글