본문 바로가기

About/Flask

(17)
[Backend] 백엔드 API 패턴 - 레이어드 아키텍처 패턴(layered architecture) 개발 단계에서 좋은 코드의 구조를 생각하는 것은 쉽지 않습니다. 코드 아키텍처를 구상할 때는 확장성(extensibility), 재사용성(reusability), 유지 보수 가능성(maintainabiliy), 가독성(readability)와 같은 요소들을 염두해야합니다. 다행히도 코드의 구조를 어떻게 구성하고 관리해야 하는지는 이미 많이 다루어졌으며, 그에 관한 정성이나 패턴은 많이 나와있습니다. 그 중에서 백엔드 API 코드에 가장 널리 적용되는 패턴 중 하나는 레이어드 아키텍처 패턴입니다. Multi-tier 아키텍처 패턴이라고도 하는 레이어드 아키텍처는 코드를 논리적인 부분 혹은 역할에 따라 독립된 모듈로 나누어서 구성하는 패턴입니다. 그리고 각 모듈이 서로의 의존도에 따라 층층히 쌓듯이 연결되어..
[Flask] JWT access token 인증(로그인 토큰 인증) Access Token을 생성하는 방법은 여러 가지가 있는데, 가장 널리 사용되는 기술은 중 하나가 바로 JWT(JSON Web Tokens)입니다. JSON Web Token은 이름 그대로 JSON 데이터를 token으로 변환하는 방식입니다. Flask에서 이를 이용하여 웹 토큰 인증을 하는 것을 다루어 보겠습니다. 예제에서는 PyJWT 1.4.0 버전과 bcrypt 3.2.0 버전을 이용합니다. pip3 install PyJWT==1.4.0 pip3 install bcrypt==3.2.0 Access Token 인증 과정은 다음과 같습니다. 1. 토큰 생성 2. 토큰 사용 예시 코드 로그인 시 인증 확인 후 Access 토큰 생성 (Flask router) @bp.route('/login', meth..
[RabbitMQ] Python에서 Pika를 이용한 RabbitMQ 사용 (Topic Queue) RabbitMQ는 AMQP(Advanced Message Queuing Protocol)을 구현되었습니다. (https://www.amqp.org/) AMQP는 queue, exchange, binding 이라는 세 개의 개념으로 구성됩니다. - queue는 메시지를 보관하고 소비자가 메시지를 선택하기를 기다립니다. - exchange는 게시자가 새 메시지를 추가하기 위한 진입점 - binding은 메시지가 exchange로 queue로 라우팅되는 방법을 정의합니다. RabbitMQ 실행 docker를 이용해서 Rabbitmq를 실행해보자(rabbitmq 3.8) 1 docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.8-..
[Flask] 비동기 호출(태스크 큐, 토픽 큐, RabbitMQ) 비동기 호출 마이크로서비스 아키텍처에서 비동기 호출은 하나의 애플리케이션 안에서 처리했던 작업들이 여러 개의 마이크로서비스로 분리되면서 중심 역할을 담당한다. 비동기 호출은 마이크로서비스 앱 안의 분리된 스레드나 프로세스처럼 단순하게 동작할 수 있다. 즉, 동시에 일어나는 HTTP 요청/응답을 간섭하지 않고 작업을 처리한다. 하지만 동일한 파이썬 프로세스에서 직접 모든 것을 처리하는 것은 좋지 않다. 프로세스가 종료되거나 재시작되면 어떻게 해야하며, 서비스를 확장하는 경우에는 문제가 생길 수 있다. 이 방식보다는 다른 프로그램에 메시지를 보내서 처리하는 것이 더욱 안정적이다. 이를 통해 마이크로서비스가 본연의 목적, 즉 클라이언트에 응답을 보내는 것에 집중하게 할 수 있다,. 태스크 큐 Celery 워커..
[Flask] Session 객체를 이용한 동기식 호출 Session 객체 생성 Flask Application 객체의 extensions에는 애플리케이션의 특정 상태 등을 저장할 수 있습니다. 다음 코드는 Session 객체를 저장하는 용도로 사용합니다. extensions를 먼저 등록한 다음 Session을 추가합니다. #flask_session.py from requests import Session def setup_connector(app, name='default', **options): if not hasattr(app, 'extensions'): app.extensions = {} if 'connectors' not in app.extensions: app.extensions['connectors'] = {} session = Session()..
[Flask] Flask-SQLAlchemy 사용해보기 Flask-SQLAlchemy는 Flask의 확장 모듈로 데이터베이스 ORM입니다.(Object Relational Mapping) https://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/ Quickstart — Flask-SQLAlchemy Documentation (2.x) Quickstart Flask-SQLAlchemy is fun to use, incredibly easy for basic applications, and readily extends for larger applications. For the complete guide, checkout the API documentation on the SQLAlchemy class. In..
[Flask] 에러 처리 (사용자 정의 에러 핸들러, JSON 에러 핸들러) 사용자 정의 처리 핸들러 HTML 웹 어플리케이션에서는 404, 50x 에러가 발생하면 보통 특정 HTML 페이지를 보여준다. 플라스크는 자동으로 이렇게 동작하지만, 마이크로서비스에서는 클라이언트에 보내는 응답을 좀 더 조정할 필요가 있다. 이 때 유용한 기능이 사용자 정의 에러 핸들러(custum error handler)이다. JSON을 사용하여 마이크로서비스를 구현할 때는 클라이언트에 보내는 모든 동작을 JSON 포맷으로 맞추는 것이 관례이다. 마이크로서비스를 사용하는 클라이언트는 모든 응답을 파싱할 필요가 있기 때문이다. 플라스크는 app의 에러 처리를 조정할 수 있는 여러 함수를 제공한다. 첫 번째는 @app.route 처럼 동작하는 @app.errorhandler 데코레이터다. 이 데코레이터는..
[Flask] Jinja2 템플릿을 이용한 이메일 생성 플라스크는 텍스트 기반의 문서를 다루기 위해 Jinja라는 템플릿 엔진을 포함한다. 플라스크가 Jinja와 통합한 주된 이유는 HTML 문서를 생성하기 위해서이다. render_template() 같은 함수는 Jinja 템플릿과 주어진 테스트를 사용해 응답을 만든다. Jinja는 꼭 HTML 이나 다른 태그 기반의 문서만 사용할 수 있는 것은 아니고, 텍스트 기반이라면 어떤 문서도 만들 수 있다. 다음은 이메일 템플릿의 예시이다. Date: {{date}} From: {{from}} Subject: {{subject}} To: {{to}} Content-Type: text/plain Hello {{name}}, We have received your payment! Below is the list of ..
[Python] Flask Signal (Blinker) 시그널 플라스크는 시그널(signal) 라이브러리인 Blinker 를 통합한다. 이 라이브러리는 특정 이벤트를 '구독' 했다가 이벤트가 발생했을 때 필요한 함수를 실행한다. 여기서 말하는 이벤트는 고유한 이름표를 갖고 blinker.signal 클래스를 통해 생성된 인스턴스이다. 플라스크 0.12는 요청을 처리하는 과정 중 중요한 순간마다 총 10개의 시그널을 발생시킨다. (시그널은 다음 사이트 참고) 시그널은 connect 함수를 사용해서 특정 이벤트를 등록할 수 있다. 시그널은 코드가 시그널의 send 함수를 호출하면 트리거된다. send 함수는 추가적인 인수를 받아서 모든 등록된 함수에 데이터를 전달한다. 다음 예제에서는 request_finished 시그널에 finished 함수를 등록한다. 우선..
[Python] Flask 전역 공간 (Flask.g) 전역 공간 flask.g 변수에는 모든 전역 정보가 포함돼있고, 원하는 어떤 속성이든 여기에 설정할 수 있다. 플라스크에서 @app.before_request 데코레이터는 요청이 만들어지고 뷰에 전달하기 직전에 호출할 함수가 있을 때 사용한다. before_request 를 사용하는 일반적인 경우는 전역 공간에 값을 저장할 때 이다. before_request 를 사용하면 컨텍스트 안에서 요청되는 모든 함수는 g 변수를 사용해서 데이터를 얻을 수 있다. 다음 예시를 보자 from flask import Flask, jsonify, g, request app = Flask(__name__) @app.before_request def authenticate(): # request.authorization u..