Flask는 메시지 배포 메커니즘인 신호 기능을 제공합니다. 후크와 유사합니다. 신호 기능을 사용하면 프로그램 결합을 줄이고 복잡한 비즈니스 모델을 분해할 수 있습니다. 예를 들어 제품 데이터를 업데이트한 후 신호를 보낼 수 있습니다. 제품 데이터를 처리해야 하는 기능이 있는 경우 신호를 캡처하여 처리할 수 있습니다. 예를 들어 제품 캐시를 생성하거나 검색 색인을 업데이트해야 하는 경우 등이 있습니다.
신호 정의
플라스크 신호 기능은 Blinker 모듈을 사용하므로 Blinker 모듈을 먼저 설치해야 합니다
pip install blinker
신호 정의:
from blinker import Namespace product_saved = Namespace()
Flask에서 패키지한 단일 객체를 사용할 수도 있습니다:
from flask.singles import Namespace
신호 보내기
신호를 보내려면 앱 인스턴스 방법이 필요합니다. 예는 다음과 같습니다.
product_saved.send(app, product=product)
앱에서 나중에 전달할 매개변수를 추가할 수 있지만, 이름=값 형식이어야 합니다. 단일 변수 이름을 사용하는 것은 지원되지 않습니다.
신호 수신
신호를 수신하려면 connect_via 데코레이터 함수를 사용할 수 있습니다:
@product_saved.connect_via(app) def updateCache(app, product): print(product)
Flask에는 다음과 같은 핵심 신호가 있습니다.
1.flask.template_rendered
이 신호는 템플릿이 성공적으로 렌더링된 후에 전송됩니다. 신호에 의해 전달된 템플릿은 템플릿의 인스턴스이고 컨텍스트는 사전인 환경 개체입니다.
구독 예:
def log_template_renders(sender, template, context, **extra): sender.logger.debug('Rendering template "%s" with context %s', template.name or 'string template', context) from flask import template_rendered template_rendered.connect(log_template_renders, app)
2.flask.request_started
이 신호는 다음에서 전송됩니다. 요청 시작 전, 요청 환경 설정 후. 요청 컨텍스트가 이미 바인딩되어 있으므로 구독자는 요청에 대한 작업을 수행하기 위한 요청과 같은 표준 글로벌 프록시를 사용할 수 있습니다.
구독 예:
def log_request(sender, **extra): sender.logger.debug('Request context is set up') from flask import request_started request_started.connect(log_request, app) flask.request_finished
이 신호는 클라이언트에 응답을 보내기 전에 전송됩니다. 신호에 의해 전달된 응답이 전송될 응답입니다.
구독 예:
def log_response(sender, response, **extra): sender.logger.debug('Request context is about to close down. ' 'Response: %s', response) from flask import request_finished request_finished.connect(log_response, app) flask.got_request_exception
이 신호는 요청 중에 예외가 발생할 때 전송됩니다. 표준 예외 처리보다 먼저 전송됩니다. 디버깅 모드에서는 예외 처리가 없지만 예외가 발생할 때도 이 신호가 전송됩니다. 신호에 의해 전달된 예외는 예외 개체입니다.
구독 예:
def log_exception(sender, exception, **extra): sender.logger.debug('Got exception during processing: %s', exception) from flask import got_request_exception got_request_exception.connect(log_exception, app) flask.request_tearing_down
이 신호는 예외 발생 여부에 관계없이 요청이 충돌할 때 전송됩니다. 현재 이 신호를 수신하는 함수는 일반 크래시 핸들러 이후에 호출되지만 사용할 수 있는 것은 없습니다.
구독 예:
def close_db_connection(sender, **extra): session.close()from flask import appcontext_tearing_down request_tearing_down.connect(close_db_connection, app)
Flask 버전 0.9에서는 EXC 키워드 인수(있는 경우)도 전달합니다. 이 매개변수는 충돌을 일으킨 예외에 대한 참조입니다.
3.flask.appcontext_tearing_down
애플리케이션 환경이 충돌할 때 이 신호를 보냅니다. 이 신호는 예외로 인해 충돌이 발생한 경우에도 항상 전송됩니다. 이 신호를 수신하는 함수는 일반 크래시 핸들러 이후에 호출되지만 이 신호에 응답할 수는 없습니다.
구독 예:
def close_db_connection(sender, **extra): session.close()from flask import request_tearing_down appcontext_tearing_down.connect(close_db_connection, app)
exc 키워드 인수(있는 경우)도 전달합니다. 이 매개변수는 충돌을 일으킨 예외에 대한 참조입니다.
4.flask.appcontext_pushed
애플리케이션의 컨텍스트가 푸시되면 애플리케이션이 이 신호를 보냅니다. 이 신호는 일반적으로 단위 테스트에서 일시적으로 정보를 연결하는 데 사용됩니다. 예를 들어 g 객체의 기존 리소스를 변경하는 데 사용할 수 있습니다.
사용 예:
from contextlib import contextmanagerfrom flask import appcontext_pushed @contextmanagerdef user_set(app, user): def handler(sender, **kwargs): g.user = user with appcontext_pushed.connected_to(handler, app): yield
테스트 코드에 다음과 같이 작성하세요.
def test_user_me(self): with user_set(app, 'john'): c = app.test_client() resp = c.get('/users/me') assert resp.data == 'username=john' New in version 0.10.
5.appcontext_popped
애플리케이션의 컨텍스트가 팝되면 애플리케이션이 이 신호를 보냅니다. 이 신호는 일반적으로 appcontext_tearing_down 신호로 작성됩니다.
6.flask.message_flashed
이 신호는 애플리케이션이 메시지를 플래시할 때 발생합니다. message` 매개변수는 메시지 내용이고, 카테고리 매개변수는 메시지 카테고리입니다.
구독 예시:
recorded = []def record(sender, message, category, **extra): recorded.append((message, category)) from flask import message_flashed message_flashed.connect(record, app)
요약
시그널은 당신을 순간적으로 안전하게 지켜줄 수 있습니다. 그들에게. 예를 들어 이러한 임시 구독은 테스트에 유용합니다. 신호를 사용할 때 신호 구독자(수신자)에서 예외가 발생하지 않도록 하십시오. 예외로 인해 프로그램이 중단될 수 있기 때문입니다.
Python Flask 프레임워크의 신호 신호 메커니즘과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!