다시 이음

웹 어플리케이션 만들기(기초) 본문

AI 일별 공부 정리

웹 어플리케이션 만들기(기초)

Taeho(Damon) 2021. 9. 30. 00:21

정적 웹 vs 동적 웹

 

정적 웹

정적 웹 페이지는 언제 접속해도 같은 응답을 보내줍니다. 일단 HTML, CSS, JS 파일 등이 서버에 업로드되면 개발자가 수정하기 전까지 매번 같은 파일을 브라우저에 건네줍니다. 즉, 웹 서버가 정적 웹 페이지에 대한 요청을 받은 경우 서버는 추가적인 처리 과정 없이 클라이언트에게 응답을 보냅니다. 예를 들어 회사나 개인의 소개 페이지가 정적 웹 페이지의 좋은 예시입니다. 

 

동적 웹

웹 서버가 동적 웹 페이지에 대한 요청을 받은 경우 서버는 추가적인 처리 과정 이후 클라이언트에게 응답을 보냅니다. 동적 페이지는 방문자와 상호작용하기 때문에 페이지 내용은 그때그때 다릅니다. 댓글, 날씨, 주가 정보 등과 같이 정보 변경이 잦은 곳에 많이 사용됩니다.  예를 들어 다음 뉴스 댓글, 스타벅스 매장 정보, 롭스 상품 검색 결과 등이 해당합니다.

 

 

Django - Full-stack Framework

 

  • 앱이 무겁다.
  • Django는 한 프로젝트 내에 다양한 어플리케이션이 존재 할 수 있습니다. 같은 프로젝트 안에서 여러 어플리케이션이 동시에 사용하는 재사용 가능한 코드를 작성하기도 쉽고, 개별 프로젝트 관리도 편하게 됩니다.
  • 웹앱이나, API 백엔드 만들 때
  •  빠른 개발, 빠른 배포, 빠른 업데이트!

 

Flask - Micro Framework

 

Flask 공식 홈페이지 참고 ( https://flask.palletsprojects.com/en/1.1.x/ )

  • 마이크로프레임워크이고 편하게 확장할 수 있으며, 보다 유연합니다.
  • DB로 이미 생성된 NoSQL을 사용할 때
  • 앱이 너무 크거나 아니면 너무 작거나

 

라우트(route)

 

많은 네트워크로 이루어진 인터넷에서, `목적지 네트워크까지 가는 경로`를 말합니다.

 

비슷한 것으로 라우팅이 있습니다.  라우팅의 경우는 '경로를 탐색하는 것'으로 이해하면 좋습니다.

 

Flask 기초

#flask_folder 생성
#flask_folder 안에 __init__.py를 생성
touch flask_folder/__init__py

#flask 어플리케이션 생성
# __init__.py

from flask import Flask

app = Flask(__name__) # 해당 어플리케이션 이름 지정. 따로 설정이 없다면 상위 폴더인 flask_folder로 지정.

# 라우트 추가하기
@app.route('/')
def index():
    return 'Hello World!'
#메소드 허용
@app.route('/', methods=['POST', 'GET'])# post,get만 허용하고 이외의 메소드는 불가.

#엔드포인트 활용
@app.route('/index/', defaults={ 'num' : 0 }) # /index/라는 엔드포인트
@app.route('/index/<num>') #<num>이라는 엔드포인트를 설정
def index_number(num):
    return 'Welcome to Index %i' % int(num)#어떤 값을 넣는가에 따라 반영
    
#블루프린트 만들기
#해당 블루프린트는 주로 routes라는 폴더를 생성하여 모아서 사용합니다.
#flask_folder/routes/main_routes.py 파일 생성

from flask import Blueprint

bp = Blueprint('user', __name__, url_prefix='/user')

@bp.route('/')
def index():
    return 'User index page'
    
#블루프린트 사용
#__init__.py
from flask import Flask
from flask_folder.routes import main_routes

app = Flask(__name__)
app.register_blueprint(user_routes.bp) # 블루프린트 불러오기

@app.route('/')
def index():
    return 'Hello World!'

 

 

 

Jinja

 

Flask 에서는 HTML 을 편리하게 렌더링하는 함수를 제공을 하기 때문에 쉽게 웹 페이지를 클라이언트에 넘겨줄 수 있습니다.

 

그 역할을 해내는 것이 웹 템플렛 엔진 (Web Template Engine)인 Jinja입니다.

 

어떤 파일, 실재하는 파일에 어떤 변수들을 집어넣어서 약간 변경시켜서 html로 만들어주는 엔진입니다.

 

Jinja 2 는 Flask 설치와 함께 오기 때문에 추가 설치가 따로 필요 없습니다.

 

 

주된 표현식

  • {% ... %} : 구문에 사용이 됩니다 (if, for 등).
  • {{ ... }} : 템플렛 결과 (html) 에 출력할 표현입니다 (변수 등).
  • {# ... #} : 주석 처리할 때 사용됩니다.
@app.route('/')
def index():
    color = 'red'
    count = 10
    return render_template('index.html', fruit_color=color, number=count)
    
#Flask 내에서 라우트를 지정할때 위와 같이 적용이 가능합니다.

공식문서 : https://jinja.palletsprojects.com/en/2.11.x/templates/#variables

 

jinja 상속

{% extends 상속할 html %}
{% block %} ... {% endblock %}

# 상속할 html에서 block을 설정해주면 {% block %}과 {% endblock %} 사이를 제외하고 모든 값이 상속됩니다.

 

jinja 템플릿

 

Flask에서는 보여지는 부분과 처리하는 부분을 나누기 위해 템플릿이라는 기능을 제공합니다.

템플릿에 사용되는 파일들은 `templates` 디렉터리에 저장되며 일반적으로 .html 파일을 사용합니다. 

 

if __name__=="__main__": 조건문이란?

 

 flask를 이용하면 if __name__ == " __main__" : app.run(debug=True)와 같이 매직 메소드 __name__을 사용하여 앱을 실행하는 구문을 만들곤 합니다.

 

 이렇게 설정하는 이유는 해당 모듈이 직접 사용되는가 혹은 import되어 사용되는가를 구분하기 위해서라고 볼 수 있습니다.

 

 __main__은 직접 사용될 때 출력되는 값이고 import되어 사용될 때에는__main__이 출력되지 않습니다.