플라스크를 이용한 웹 개발

JOOYEUN SEO·2024년 10월 10일

100 Days of Python

목록 보기
54/76
post-thumbnail

❖ 백엔드 웹 개발

Full Stack = Front-End + Back-End

  • 프론트엔드
    • 사용자에게 정보를 보여주기만 한다
    • 언어 : HTML, CSS, JavaScript
    • 프레임워크 : Angular, Rreact
  • 백엔드
    • 비즈니스 로직이나 각종 연산 등의 작업 수행
    • 언어 : JavaScript, Java, Python, Ruby
    • 프레임워크 : Node, Flask(초보 개발자, 소규모 프로젝트), Django(대규모 사업 프로젝트)

💡 백엔드의 요소 3가지를 통해 작동 방식이 결정됨

  • Client
    • 브라우저를 이용하는 사용자
    • 🪑 레스토랑에서 테이블 구역(브라우저)에 앉는 손님
    • 손님이 서버(주방)에 원하는 요리(특정 데이터)를 요청
  • Server
    • 24시간 인터넷에 연결되어 요청을 받을 준비가 되어 있는 컴퓨터
    • 🍳 레스토랑의 주방
    • 주방에서는 식료품실(데이터베이스)에서 알맞은 재료를 가져와 요리(HTML/CSS/JS 파일로 렌더링)
  • Database
    • 사이트의 모든 정보를 담아두는 곳
    • 🥩 레스토랑의 식료품실

❖ 플라스크로 기본 웹 서버 만들기

Flask : 가장 유명한 파이썬 기반 웹 프레임워크

💡 Library vs Framework
공통점: 직접 작성하지 않은 각종 코드의 묶음으로, 각종 기능이 필요할 때 사용 가능한 툴
차이점:

  • 라이브러리
    • 특정 작업 시에 사용자가 호출해야 함
  • 프레임워크
    • 코드를 프레임워크 규칙에 맞게 정의해야 함
    • 특정 기능을 실행할 때 프레임워크가 코드를 호출

가장 간단한 양식으로 웹 서버 생성하기

  • 파일명은 프레임워크나 라이브러리 이름과 겹치지 않도록 지어야 오류가 발생하지 않음
  • 플라스크 문서의 A Minimal Application에서 기본 양식 붙여넣기
  • flask 모듈 다운 : 파이참 프로젝트에서 터미널pip install Flask 입력
    (pip은 pypi로부터 파이썬 패키지를 설치하는 명령어)

⌨️ hello.py

from flask import Flask

app = Flask(__name__)	# 플라스크 클래스로 애플리케이션 생성 후 초기화

@app.route("/")			# 사용자가 URL 끝에 / 를 붙여 홈페이지로 접속할 때 작동
def hello_world():
    return "<p>Hello, World!</p>"

파일 작성 후 터미널에서 명령어 입력

  • 플라스크에 서버가 담긴 파일명을 알려주고 해당 파일에 플라스크 앱을 서비스하는 것
  • 이 서버는 개발용으로만 사용해야 한다는 경고 등장(상용화하려면 다른 절차가 필요)
  • 개인 컴퓨터로 서비스하는 사이트의 로컬 주소 링크를 클릭하면 웹사이트 확인 가능
  • ctrl + c로 서버를 직접 꺼야 한다

html 파일을 작성하지 않아도 자동으로 만들어짐

❖ 터미널 명령어 사용하기

◇ 명령 프롬프트, zsh 터미널

Terminal
= command line (명령어를 한 줄씩 입력해 컴퓨터를 제어)
= Shell

🥜 운영체제(OS)가 견과류라면

  • Kernel : 알맹이, 하드웨어와 상호작용하는 실제 프로그램(OS의 핵심부)
  • Shell : 겉껍질, 알맹이와 더불어 하드웨어와 소통하기 위한 사용자 인터페이스
    • GUI : 파일탐색기나 파인더를 이용해 파일에 접근
    • CLI : 커널과 상호작용하는 또 다른 방식으로, 더 강력한 제어권 보유
      (맥의 경우 bash 셸, zsh 셸이 존재 → 더 많은 기능을 제공하고 편리한 zsh 셸이 기본으로 설정됨)

< 기본 명령어 >

키워드의미역할
pwdprint working directory현재 내 위치를 파일 경로로 출력
lslist현재 작업 디렉토리에 있는 파일과 폴더를 전부 나열
cd 폴더명
cd ..
change directory해당 디렉토리로 이동(현 위치에서 접근 가능해야 함)
한 단계 상위 폴더로 이동
mkdir 폴더명make directory해당 이름으로 새 폴더(디렉토리) 생성
touch 파일명.확장자해당 이름으로 새 파일 생성
rmremove해당 파일 삭제(ls로 먼저 파일이 있는지 확인하기)
rm -rfremove recursively, forcibly해당 폴더와 그 안의 내용 모두 삭제(삭제할 폴더 밖에서 실행)

TIP: 폴더명 등을 입력할 때 앞의 몇 글자만 입력하고 Tap 키 누르기

  • 해당하는 이름이 하나뿐일 경우 바로 자동입력
  • 해당하는 이름이 여러가지 있을 경우 선택지 제공(선택지가 하나만 남을 때까지 계속 시도하기)

◇ 파이참 에뮬레이터 터미널

Emulator

  • 한 시스템에서 다른 시스템을 복제하는 것(애플리케이션 안의 애플리케이션)
  • 파이참에서 명령 프롬프트 또는 zsh 터미널이 내장된 터미널이 존재하는 것
  • 터미널에서 가능한 작업은 파이참 터미널에서도 가능

❖ 파이썬에 내장된 특수 속성

__name__

  • 현재 사용 중인 클래스, 함수, 메소드 등의 이름을 알 수 있는 특수 속성
  • 이 속성을 전달받으면 현재 실행 중인 파일에 애플리케이션 코드가 있는지 확인
    (출력이 __main__ 이면 현재 파일 내에서 코드가 실행 중이라는 뜻)

⌨️ hello.py

from flask import Flask

app = Flask(__name__)
# __name__ 속성의 출력 확인
print(__name__)

@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

if __name__ == "__main__":
    # 터미널에 입력했던 [flask --app hello run] 과 같은 작업
    # Ctrl + c 대신 파일 실행만 멈추면 플라스크 앱 구동도 멈춤
    app.run()
__main__

❖ 파이썬의 일급 객체, 함수

파이썬 함수는 1급 객체(First-class object)

  • 함수를 인자로 전달 가능
  • 다른 함수 안에 중첩 가능
  • 다른 함수의 출력으로 반환 가능
# 인자로 전달할 함수
def add(n1, n2):
    return n1 + n2

def subtract(n1, n2):
    return n1 - n2

def multiply(n1, n2):
    return n1 * n2

def divide(n1, n2):
    return n1 / n2

# 함수를 인자로 전달하기
def calculate(calc_function, n1, n2):   # 함수를 일반 인자처럼 다른 함수에 전달
    return calc_function(n1, n2)        # 나중에 함수를 작동시킬 때 괄호를 붙임

result = calculate(add, 2, 3)
print(result)
5

# 함수를 다른 함수 안에 넣기(중첩 함수)
def outer_function():
    print("I'm outer")

    def nested_function():
        print("I'm inner")

    nested_function()       # 외부 함수 호출

outer_function()            # 외부 함수 안에서 중첩 함수 호출
I'm outer
I'm inner

# 함수의 결과로 다른 함수를 반환
def outer_function():
    print("I'm outer")

    def nested_function():
        print("I'm inner")

    return nested_function          # 괄호를 빼서 비활성화

inner_function = outer_function()   # outer_function()의 출력 할당
inner_function()                    # inner_function()을 따로 실행 가능
I'm outer
I'm inner

❖ 파이썬 데코레이터와 @ Syntax

Python Decorator

  • 클래스나 모듈의 함수(이미 있는 함수)에 다른 기능을 더하는 함수
  • 단순히 다른 함수를 감싸서 추가 기능을 부여하거나 함수를 변형시킴

@

  • 바로 밑에 있는 함수를 데코레이터로 치장한다는 뜻
  • @ 기호를 사용한 구문을 구문적 치장(syntactic sugar)이라고 한다
  • 길고 복잡한 코드 대신 쓸 수 있는 쉽고 간결한 구문
import time

# 간단한 데코레이터 함수
def delay_decorator(function):
    def wrapper_function():
        # 함수가 작동되기 전에 할 작업
        time.sleep(2)
        # 함수 작동
        function()
        function()
        # 함수 실행 후에 할 작업
    return wrapper_function


# @ syntactic sugar를 사용한 구문
@delay_decorator
def say_hello():
    print("Hello")

@delay_decorator
def say_bye():
    print("Bye")

say_hello()
say_bye()

# @ syntactic sugar를 사용하지 않은 구문(데코레이터를 바로 호출하여 함수명 넘기기)
def say_greeting():
    print("How are you?")

decorated_function = delay_decorator(say_greeting)
decorated_function()
Hello
Hello
Bye
Bye

How are you?
How are you?

💯 coding exercises

Python Decorators
함수가 실행되는 데 걸리는 시간을 측정하는 자체 데코레이터 함수

  • time.time() : 1970년 1월 1일 00:00:00부터 현재까지의 시간을 초 단위로 반환
  •  function.__name__ : 해당 함수의 이름을 얻을 수 있음
import time
current_time = time.time()
print(current_time)

def speed_calc_decorator(function):
  def wrapper_function():
    start_time = time.time()
    function()
    end_time = time.time()
    print(f"{function.__name__} run speed: {end_time - start_time}s")
  return wrapper_function

@speed_calc_decorator
def fast_function():
  for i in range(1000000):
    i * i

@speed_calc_decorator
def slow_function():
  for i in range(10000000):
    i * i

fast_function()
slow_function()
1728564493.691
fast_function run speed: 0.1400001049041748s
slow_function run speed: 1.6480000019073486s




▷ Angela Yu, [Python 부트캠프 : 100개의 프로젝트로 Python 개발 완전 정복], Udemy, https://www.udemy.com/course/best-100-days-python/?couponCode=ST3MT72524

0개의 댓글