플라스크로 HTML 렌더링, URL 파싱

JOOYEUN SEO·2024년 10월 11일

100 Days of Python

목록 보기
55/76
post-thumbnail

❖ 플라스크 URL 경로

  • URL 파싱 = 사용자가 URL에 입력한 내용을 이해하는 것
  • https://www.site.com + /입력 = url을 기반으로 특정한 무언가를 렌더링
    • 홈 라우트(route) : 메인 URL + /
    • 다른 라우트(route) : 메인 URL + /입력
  • <변수명> 으로 URL에 변수 섹션을 추가할 수 있음 (한 URL에 여러 개 적용 가능)
  • <converter:변수명>으로 URL을 지정한 데이터 유형으로 변환할 수 있음
    • string : / 를 제외한 모든 텍스트를 수락 (디폴트 값)
    • int : 양의 int형을 수락
    • float : 양의 float형을 수락
    • path : string과 같으나 / 도 수락
    • uuid : UUID strings를 수락
from flask import Flask

app = Flask(__name__)

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

# 함수가 데코레이터를 통과할 때 변수값을 받아 사용 가능하게 됨
@app.route("/username/<name>/<int:number>")
def greet(name, number):
    return f"Hello {name}, you are {number} years old!"

if __name__ == "__main__":
    app.run()

❖ 플라스크 디버그 모드

  • 원하는 대로 끄고 켤 수 있는 기능으로, 켜면 디버거를 활성화시킴
  • 파일을 편집하고 저장(command + S)하면 자동 리로더가 서버를 다시 로드
    (off일 때는 코드를 변경할 때마다 서버를 끄고 다시 켜야 적용됨)
  • 이슈가 발생할 경우 캐치하여 알려주는 역할 수행
# 서버를 연 상태에서 코드 변경
@app.route("/<name>")
def greet(name):
    return f"Hello {name}!"

# 디버그 속성을 True로 변경하여 켜기(디폴트 값은 False)
if __name__ == "__main__":
    app.run(debug=True)

…

@app.route("/<name>")
def greet(name):
    return f"Hello {name + 12}!"  # 이슈 발생

# 디버그 속성을 True로 변경하여 켜기(디폴트 값은 False)
if __name__ == "__main__":
    app.run(debug=True)

실행은 정상적으로 되지만 '/이름' 을 입력하는 순간 플라스크 디버그 뷰 페이지가 나타남

터미널의 디버거 핀 코드를 입력

문제 해결에 도움을 받을 수 있음

❖ HTML 요소 렌더링

◇ 플라스크가 html을 리턴으로 받아들이는 방법

가장 간단한 방법이지만 문자열을 이용하여 모든 것을 추가해야 하므로 편집하기 힘듦
❗️속성이나 스타일 요소 추가 시 문자열과 다른 따옴표로 넣기

…
@app.route("/")
def hello_world():
    return ("<h1 style='text-align: center'>Hello, World!</h1>"
            "<p>This is a paragraph.</p>"
            "<img src='https://i.giphy.com/이하생략.gif' width=300>")

◇ 파이썬 데코레이터로 HTML 태그를 스타일하는 방법

def make_bold(function):
    def wrapper():
        return "<b>" + function() + "</b>"
    return wrapper

def make_emphasis(function):
    def wrapper():
        return "<em>" + function() + "</em>"
    return wrapper

def make_underlined(function):
    def wrapper():
        return "<u>" + function() + "</u>"
    return wrapper


@app.route("/bye")
@make_bold
@make_emphasis
@make_underlined
def bye():
    return "Bye!"

❖ *args, **kwargs를 활용한 고급 데코레이터

Day27 ❖ 고급 파이썬 인수 사용하기 참고

class User:
    def __init__(self, name):
        self.name = name
        self.is_logged_in = False	# 사용자가 로그인 상태인지 확인

# 데코레이터
def is_authenticated_decorator(function):
    def wrapper(*args, **kwargs):
        if args[0].is_logged_in == True:
            function(args[0])
    return wrapper

@is_authenticated_decorator
def create_blog_post(user):			# user는 위치가 0인 위치 인자
    print(f"This is {user.name}'s new blog post.")

new_user = User("jy")
new_user.is_logged_in = True		# 로그인을 해야 블로그 포스트 작성 가능
create_blog_post(new_user)
This is jy's new blog post.

💯 coding exercises

Advanced Decorators
호출된 함수의 이름, 주어진 인수, 마지막으로 반환된 출력을 출력하는 데코레이터 생성

def logging_decorator(fn):
  def wrapper(*args):
    print(f"You called {fn.__name__}{args}")
    result = fn(args[0], args[1], args[2])
    print(f"It returned: {result}")
  return wrapper

@logging_decorator
def a_function(a, b, c):
  return a * b * c

a_function(1, 2, 3)
You called a_function(1, 2, 3)
It returned: 6

🗂️ Day55 프로젝트: URL 숫자 업다운 게임

🔍 유의 사항

⌨️ server.py

from flask import Flask
import random

ANSWER = random.randint(0, 9)

app = Flask(__name__)

@app.route("/")
def home():
    return ("<h1>Guess a number between 0 and 9</h1>"
            "<img src='https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExeG15NXJodXVvc2ppdDd0NW1iMGYzeXl1Z3BlNHp3OTd4eTZyMDJhaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3o7aCSPqXE5C6T8tBC/giphy.gif'>")

@app.route("/<int:guess>")
def number_page(guess):
    if guess > 10 or guess < 1:
        return ("<h1>please type a number between 1 to 10</h1>"
                "<img src='https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExeWI3dGt1NWJiczliNGN5eHExeWR6ZTkycDUxd291NTNjbmx0eDhjayZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/nR4L10XlJcSeQ/giphy.gif'>")
    elif guess > ANSWER:
        return ("<h1>Too high, try again!</h1>"
                "<img src='https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZXdjdDdqbzRtcXd3aGozaHgzNzc3M214ODZmbHA1cnhyYng4NW1mNyZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/XyJ5bNle0Gp0IOb8Cp/giphy.gif'>")
    elif guess < ANSWER:
        return ("<h1>Too low, try again!</h1>"
                "<img src='https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExYnBmOHNsN2syYnc3NzRmeHp6cjhrbHF0OGMzdnNoMDdoNjkxMDRnbSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/w0GhdlgNX8pby/giphy.gif'>")
    else:
        return ("<h1>You found me!</h1>"
                "<img src='https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZzUxM2MxMTRsYm0xMnd2bXEyNzY1dTd5a3E3c3l1dGV1ZzRzYWNkaiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/IUm2IUJcZqKZnfWDDo/giphy.gif'>")

if __name__ == "__main__":
    app.run(debug=True)




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

0개의 댓글