>백엔드 개발 >파이썬 튜토리얼 >Python의 Flask 프레임워크의 신호 메커니즘

Python의 Flask 프레임워크의 신호 메커니즘

高洛峰
高洛峰원래의
2017-03-03 13:27:161402검색

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 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.