
https://www.site.com + /입력 = url을 기반으로 특정한 무언가를 렌더링<변수명> 으로 URL에 변수 섹션을 추가할 수 있음 (한 URL에 여러 개 적용 가능)<converter:변수명>으로 URL을 지정한 데이터 유형으로 변환할 수 있음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)하면 자동 리로더가 서버를 다시 로드…
# 서버를 연 상태에서 코드 변경
@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)
실행은 정상적으로 되지만 '/이름' 을 입력하는 순간 플라스크 디버그 뷰 페이지가 나타남
터미널의 디버거 핀 코드를 입력
문제 해결에 도움을 받을 수 있음
가장 간단한 방법이지만 문자열을 이용하여 모든 것을 추가해야 하므로 편집하기 힘듦
❗️속성이나 스타일 요소 추가 시 문자열과 다른 따옴표로 넣기
…
@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>")
…
…
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!"
…
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)
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)
🔍 유의 사항
- 🗂️ Day12 프로젝트: 숫자맞추기 게임의 웹사이트 버전
- 0에서 9 사이의 숫자를 맞추는 게임(숫자를 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)