soominkim Study
article thumbnail
Published 2023. 7. 14. 11:36
[Flask] 템플릿 접근 Python/Flask
728x90

 

❕HTTP 메소드

Flask에서는 URL접근에 대하여 기본적으로 GET 방식으로 제공합니다. 하지만  route() 데코레이터에 methods 인자를 제공하면 다른 방식으로 변경할 수 있습니다.

@app.route('/login', methods=['GET','POST'])
def login():
	if request.method	==	'POST':
    	do_the_login()
    else:
    	show_the_login_form()
  • GET -  브라우저가 어떤 페이지에 저장된 정보를 단지 얻기 위해 서버에 요청하고 서버는 그 정보를 보냅니다.
  • HEAD - 브라우저가 어떤 페이지에 저장된 내용이 아닌 헤더라 불리는 정보를 요청합니다. GET요청을 받은 것  처럼 처리하나, 실제 내용이 전달되지는 않습니다. Flask에서는 Werkzeug 라이브러리들이 이러한 처리를 진행합니다.
  • POST - 브라우저는 서버에게 새로운 정보를 전송하도록 특정 URL에 요청하고 그 정보가 오직 한번만 저장되는 것을 보장합니다.
  • PUT - POST와 유사하지만 서버가 오래된 값들을 한번 이상 덮어쓰면서 여러번 실행할 수 있습니다.
  • DELETE - 주어진 위치에 있는 정보를 제거합니다.
  • OPTIONS - 클라이언트에게 요청하는 URL이 어떤 메소드를 지원하는지 알려줍니다.

❕정적파일

동적인 웹 어플리케이션은 정적 파일을 필요로 합니다. 그것들은 보통 HTML, CSS, JS파일을 말합니다.

Flask에서 이러한 정적 파일을 이용하려면 static 이라는 폴더를 생성하면 됩니다.

url_for('static',	filename='style.css')

위의 코드는 static 폴더에 위치한 style.css 파일을 찾아 웹 어플리케이션에 적용시키는 것입니다. 그런 이유로 style.css의 이름을 가진 CSS파일의 경로는 static/style.css가 됩니다.

 

❕템플릿 보여주기

Python에서 HTML을 생성하는 것은 그다지 좋은 일은 아닙니다. 어플리케이션의 보안을 위해 동적으로 변화되는 값에 대해 이스케이핑을 직접 작성해야하기 때문입니다. 하지만, Flask는 Jinja2를 템플릿엔진으로 구성하여 자동으로 HTML을 이스케이핑 합니다. 이러한 작업을 위해서는 render_template() 메소드를 사용해야 합니다.

from flask import Flask, render_template

@app.route('/')
def index(name=None):
	return render_template('index.html', name=name)

물론 템플릿 안에서도 request 객체에 접근할 수 있습니다.

<!doctype html>
<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello World!</h1>
{% endif %}

Jinja의 가장 강력한 부분은 템플릿의 상속 기능입니다. 템플릿 상속은 사이트에 대한 모든 일반적인 요소들을 포함한 기본 스켈레톤(skeleton) 템플릿을 생성하도록 하고 자식 템플릿은 기본 템플릿을 오버라이드(override)할 수 있는 block을 정의하면 됩니다.

 

먼저 HTML 스켈레톤 문서를 정의합니다.

<!doctype html>
<html>
  <head>
    {% block head %}
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
    <title>{% block title %}{% endblock %} - My Webpage</title>
    {% endblock %}
  </head>
<body>
  <div id="content">{% block content %}{% endblock %}</div>
  <div id="footer">
    {% block footer %}
    &copy; Copyright 2010 by <a href="http://domain.invalid/">you</a>.
    {% endblock %}
  </div>
</body>

스켈레톤 문서에서는 블록을 이제 자식 템플릿에서 정의합니다.

{% extends "layout.html" %}
{% block title %}Index{% endblock %}
{% block head %}
  {{ super() }}
  <style type="text/css">
    .important { color: #336699; }
  </style>
{% endblock %}
{% block content %}
  <h1>Index</h1>
  <p class="important">
    Welcome on my awesome homepage.
{% endblock %}

자식 템플릿에서의 핵심은 {% extends %} 태그입니다. 이 태그는 템플릿 엔진에게 이 템플릿이 다른 템플릿을 확장(extends)한다는 것을 알려줍니다. 그래서 템플릿 시스템이 이 템플릿 엔진을 검증할 때, 가장 먼저 부모 템플릿을 찾을 수 있게 합니다. 만약 부모 템플릿에 정의된 블럭의 내용을 보여주려면 {{ super() }}  태그를 사용하면 됩니다. 

728x90
profile

soominkim Study

@soominkim

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그