일부 모델 변경에 따라 이메일을 보내는 관리자 패널을 통해 신호를 생성하는 기능을 제공하는 Django 응용 프로그램.
응용 프로그램을 사용하면 자신의 제약 조건과 이메일 템플릿을 설정할 수 있으며 최소한의 구성으로이를 달성하는 것을 목표로합니다.
관리자는 신호/이메일 자체를 설정할 수 있습니다
관리자 사용자가 데이터베이스에서 무언가가 발생할 때 이메일을 보내도록 요청한 경우 어떻게해야합니까? 개발자는 새로운 신호를 만들고, 제약 조건을 설정하고, 이메일 템플릿을 만들고, 모든 것을 함께 조각하고, 단위 테스트를 만들고 배포합니다. 특히 다양한 변화를 위해 설정할 여러 신호가있을 때 비교적 단순하지만 여전히 시간이 많이 걸립니다. 이것은 빠르게 매우 긴 과정이됩니다.
이 응용 프로그램은 관리자가 기능을 요청하고 배포를 기다리지 않고 이러한 신호 자체를 만들 수있는 방법을 제공함으로써이를 해결하는 것을 목표로합니다. 이것은 관리자에게 압력을 완화하면서 관리자에게 신속하게 결과를 얻을 수있는 능력을 제공하는 좋은 방법입니다.
관리자는 매개 변수를 위해 어떤 필드를 입력 할 것인지 어떻게 알 수 있습니까? 응용 프로그램은 저장하기 전에 양식을 확인하지만 필드에 대한 자동 완성도 제공합니다.
이메일 템플릿을 신속하게 프로토 타이핑하고 테스트합니다
일부 더 큰 팀을위한 템플릿을 작성하고 테스트하는 것은 시간이 많이 걸리는 프로세스가 될 수 있습니다. 어떤 이유로 든 화면을 볼 수없고 템플릿을 테스트 할 수 있도록 테스트 환경에 배포하는 사람의 요청이 요청한 경우 특히 그렇습니다.
그런 다음 과정이 약간 지루해 질 수 있습니다. 테스트 할 코드를 배포하고, 검토하고, 코드를 조정하고, 재배치하고, 프로세스를 몇 번 반복 해야하는 시나리오에 본 적이 있습니까?
이 응용 프로그램은 관리자가 풍부한 텍스트 편집기를 사용하여 HTML 컨텐츠 자체를 만들 수있는 방법을 제공함으로써이를 해결하는 것을 목표로합니다. 이를 통해 관리자는 이메일 컨텐츠를 빠르게 프로토 타입하고 테스트 할 수 있습니다. 준비가되면 "소스 코드 표시"를 클릭하고 그 달콤한 소스 코드를 보내는 것입니다.
새 주문이 웹 사이트에 배치 될 때마다 특정 팀에 알리고 싶다고 상상해 봅시다.
다음 신호를 설정하여 시작합니다. 
이 스크린 샷에서 우리는 몇 가지를 발견했습니다.
모델은 "sample_app | order"로 설정되었습니다. 이 예제에서는 주문 모델을 만들었으며 ( example/sample_app/models.py 에서 찾을 수 있음) 저장을 게시 할 신호 유형을 설정했습니다.
즉, 주문 모델에 게시물 저장 신호를 작성하고 있음을 의미합니다.
이 예에서는 일반 텍스트 및 HTML 컨텐츠 필드에 대한 값을 입력했습니다. 템플릿과 마찬가지로 곱슬 괄호를 사용하여 컨텍스트를 위해 자리 표시자를 추가 할 수 있습니다.
우리는 이것을 다음과 같은 방식으로 사용했습니다.
Order ID: {{ instance.id }}
Customer Name {{ instance.customer.id }}
Customer Email {{ instance.customer.email }} 이 신호는 Order 모델과 관련이 있으므로 instance 단일 Order 인스턴스를 나타냅니다.
이메일이 전송되면 자리 표시자는 실제 컨텍스트 값으로 대체됩니다.
사용 가능한 유일한 컨텍스트는 instance 이므로 instance 객체를 통해 다른 컨텍스트에 액세스 할 수 있어야합니다.
이것은 템플릿 컨텍스트를 제공하는 한 가지 방법입니다. 원하는 경우 템플릿 파일의 경로 인 템플릿 필드에 대한 값을 제공 할 수 있습니다.
또한 메일 링리스트를 new_order_mailing_list 로 설정했음을 알 수 있습니다. 주문 모델에는 이메일 목록을 반환하는 해당 new_order_mailing_list 메소드가 있습니다. 즉,이 특정 이메일은 Order.new_order_mailing_list 로 반환 된 이메일로 전송됩니다. 다양한 이메일 목록이 포함 된 다양한 방법을 만들어 다른 메일 링리스트를 효과적으로 만들 수 있습니다. 또는 메일 링리스트에 Comma 분리 이메일 목록 만 사용할 수 있습니다.
제약 조건을 추가하기 전에 신호를 저장하려고합니다. 따라서 자동 완성 기능이 우리를 도울 수 있으므로 신호 제한을 쉽게 설정할 수 있습니다. 신호 저장과 신호 제약 조건 설정 사이의 시간이 걱정된다면 언제나 활성 플래그를 미리 False로 설정할 수 있습니다. 이렇게하면 이메일이 전송되는 것을 방지 할 수 있습니다.
이제 신호의 제약 조건을 설정할 수 있습니다. 우리는 두 가지 제약 조건을 만들 것입니다.
created == True ).customer.id > 10). 
post_save 신호를 작성할 때의 일반적인 점검은 인스턴스가 새 인스턴스라는 것입니다. 이는 매개 변수를 작성하여 created 하고 "True"와 비교하여 수행 할 수 있습니다.
우리의 주문 모델에는 customer 모델의 외국 키 인 customer 분야가 있습니다. customer 객체를 통과하여 고객의 id 얻을 수 있습니다. 그런 다음 customer.id > 10 확인할 수 있습니다.
이 앱에는 편리한 자동 완성 기능이있어 모델 필드 및 캐시 된 속성을 통과하는 데 도움이됩니다. 액세스 할 수없는 매개 변수를 거부 할 수있는 유효성 검사가 있으므로 실수를 저지르는 것에 대해 걱정하지 마십시오.
이 신호를 저장하면 이제 주문이 새 인스턴스이고 고객 ID가 10보다 큰 경우에만 신호가 전송되도록합니다.
응용 프로그램을 설치하려면 다음 명령을 실행하십시오.
pip install django-email-signals
PIP 설치 명령은 대부분의 사람들에게 필요한 모든 것이지만, 후드를보고 무슨 일이 일어나고 있는지보고 싶다면 소스 디렉토리를 복제 할 수 있습니다.
git clone https://github.com/Salaah01/django-email-signals.git
1. INSTALLED_APPS 에 추가 i. settings.py 파일의 INSTALLED_APPS 에 tinymce 추가를 추가하십시오.
INSTALLED_APPS = [
' app_1 `,
' app_2 `,
'...' ,
'tinymce' ,
] II. settings.py 파일의 INSTALLED_APPS 에 email_signals 추가하십시오. 이 애플리케이션을 사용하여 신호를 생성하려는 모델이 포함 된 앱 후에 추가해야합니다.
INSTALLED_APPS = [
' app_1 `,
' app_2 `,
'...' ,
'tinymce' ,
' email_signals `
]2. 마이그레이션을 실행하고 정적을 수집하십시오
python manage.py migrate
python manage.py collectstatic
3. URL을 업데이트 (선택 사항) urls.py 파일 업데이트 : 다음을 포함하십시오.
from django . urls import include
url_patterns = [
path ( 'email-signals/' , include ( 'email_signals.urls' )),
path ( 'tinymce/' , include ( 'tinymce.urls' )),
]성가신 스누퍼의 삶을 더 어렵게 만들기 위해 URL을 추측하기 어려운 것으로 바꾸는 것이 좋습니다. 응용 프로그램 경로는 모두 사용자가 링크에 액세스 할 수 있도록 직원이되어야합니다.
이 단계는 선택 사항이지만 관리자 영역의 제약 조건을 훨씬 쉽게 설정할 수 있으므로 수행하는 것이 좋습니다. 제약 조건을 구축 할 때 옵션이있는 드롭 다운을 제공하려면 URL이 필요합니다.
4. 기본 이메일 추가 (선택 사항) EMAIL_SIGNAL_DEFAULT_SENDER 설정에 추가하십시오. 예 : EMAIL_SIGNAL_DEFAULT_SENDER = '[email protected] 정의하는 모든 신호에 대해 발신자 이메일을 명시 적으로 지정하지 않으려면 프로젝트 settings.py 에서 EMAIL_SIGNAL_DEFAULT_SENDER 설정할 수 있습니다.
5. 신호를 올리려는 모델에 모델 믹스 인을 추가하려면 다음 믹스 인을 모델에 email_signals.models.EmailSignalMixin 으로 추가해야합니다.
예 : 다음 모델이 있다고 가정 해 봅시다.
from django . db import models
class Customer ( models . Model ):
name = models . CharField ( max_length = 200 , null = True )
email = models . CharField ( max_length = 200 )이 모델을 다음으로 변경해야합니다.
from email_signals . models import EmailSignalMixin
class Customer ( models . Model , EmailSignalMixin ):
name = models . CharField ( max_length = 200 , null = True )
email = models . CharField ( max_length = 200 )6. 수신자 추가 데이터 변경에 따라 다른 사람들에게 이메일을 보내고 싶을 수도 있습니다. 다양한 가능한 메일 링리스트를 모델 자체로 설정하여이를 용이하게합니다. 이것은 먼저 보여주기가 더 쉽습니다.
from email_signals . models import EmailSignalMixin
class Customer ( models . Model , EmailSignalMixin ):
name = models . CharField ( max_length = 200 , null = True )
email = models . CharField ( max_length = 200 )
def customer_emails ( self ):
"""Recipient is the customer."""
return [ self . email ]
def management_mailing_list ( self ):
"""Recipient list includes management."""
return [ '[email protected]' , '[email protected]' ] 우리는 customer_emails 및 management_mailing_list 라는 두 가지 기능을 만들었습니다. 나중에 신호를 설정하면 각 신호에 사용할 메일 링리스트를 설정하라는 요청을받습니다. 여기에서는 기능 이름``customer_emails or management_mailing_list '를 입력 할 수 있습니다.
따라서 모델 내에서 다른 메일 링리스트를 설정할 수 있습니다.
설정이 완료되었으므로 관리자를 통해 (또는 데이터베이스를 직접 업데이트하여) 신호를 추가 할 수 있습니다.
LocalHost에서 사이트를 실행하고 있다고 상상할 수 있으므로 http : // localhost : 8000/admin/로 탐색하여 관리자 패널을 찾을 수 있습니다. 그런 다음 http : // localhost : 8000/admin/email_signals/signal/로 탐색하여 신호에 액세스 할 수 있습니다. 우리는 신호를 추가하는 것으로 시작합니다. "신호 추가"를 클릭하여 시작하십시오.
현명한 사람이 나에게 무언가를 알지 못하고 영원히 바보 같은 느낌보다 잠시 바보 같은 소리를내는 것이 낫다고 가르쳐주었습니다. 따라서 그 정맥에서는 분명해 보일지 모르지만, 우리는 양식의 옵션을 살펴보고 각 옵션이 무엇을 담당하는지 논의 할 것입니다.
| 필드 레이블 | 필드 이름 | 설명 |
|---|---|---|
| 이름 | 이름 | 다른 레코드와 쉽게 구별 할 수 있도록 신호의 이름. |
| 설명 | 설명 | (선택 사항) 신호에 대한 설명. |
| 모델 (표) | content_type | 이 신호와 관련된 모델의 드롭 다운에서 선택하십시오. |
| 일반 텍스트 내용 | plain_message | (선택 사항) 보낼 평범한 텍스트 이메일. |
| HTML 컨텐츠 | html_message | (선택 사항) html 이메일을 보내십시오. |
| 주제 | 주제 | 이메일 주제 |
| 이메일에서 | From_Email | (선택 사항) 이메일 발신자. settings.EMAIL_SIGNAL_DEFAULT_SENDER 로 기본값. |
| 메일 링리스트 | mailing_list | 입력 한 텍스트가있는 수신자 목록은 이름이 같은 모델 클래스에서 호출 된 메소드에 해당합니다. 예 : customer_mails 입력하면 모델 클래스에서 이메일 모음을 반환하는 customer_mails 라는 메소드가 있어야합니다. 또는 이것은 쉼표로 구분 된 이메일 목록 일 수 있습니다. EG : [email protected],[email protected] 은이 이메일을 두 이메일로 전송합니다. |
| 주형 | 주형 | (선택 사항) 템플릿에서 템플릿에서 이메일을 렌더링하려는 경우 템플릿으로가는 경로. 이것은 Django의 템플릿 로더를 사용하므로 여기에 제공하는 값은 settings.TEMPLATES[i]['DIRS'] 와 관련이 있어야합니다. |
| 신호 유형 | 신호 _type | 이 기록에 대한 신호 유형. |
| 활동적인 | 활동적인 | 이 신호를 켜고 끄는 스위치. |
신호 제약 이 인라인 모델은 사례별로 신호를 제기 해야하는지 여부를 결정하는 일부 제약 조건을 설정할 수있는 곳입니다.
| 필드 레이블 | 필드 이름 | 설명 |
|---|---|---|
| 매개 변수 1 | param_1 | 제약 조건을 테스트 할 때 사용할 첫 번째 매개 변수입니다. 이 매개 변수는 신호 kwargs 또는 모델 인스턴스에 존재해야합니다. |
| 비교 | 비교 | 매개 변수를 비교하는 방법을 정의하십시오. EG : 파라미터 1은 매개 변수 2 보다 큽니다 . |
| 매개 변수 1 | param_1 | (선택 사항) 제약 조건을 테스트 할 때 사용할 두 번째 매개 변수. 이 매개 변수는 제약 조건이 합리적 일 때 비어있을 수 있습니다. 예를 들어, 제약 조건이 "true"인 경우 매개 변수 2가 필요하지 않지만 제약 조건이 "보다 크다"는 경우 매개 변수 2가 필요합니다. 파라미터 2는 또한 'a', '1', '1.1'과 같은 원시 유형 일 수 있습니다. 응용 프로그램은 문자열을 가능하다면 숫자로 변환하려고 시도합니다. |
매개 변수는 매개 변수 1과 2 모두 객체 내에서 깊은 곳을 검색 할 수 있습니다. 다음 구조를 가지고 있으며 신호가 CustomerOrder 주문 인스턴스를 받았다고 가정 해 봅시다.
ClassDiagram
사용자 <| -- 고객
고객 <| - 고객 주문
클래스 사용자 {
ID
First_name
성
이메일
}
클래스 고객 {
ID
사용자
fav_language
}
클래스 고객 주문 {
ID
고객
Order_id
총
}
CustomerOrder 인스턴스 (이 변수 order 라고 부르면)가 주어지면 제약 조건에서 다음을 설정할 수 있습니다.
| 틀 | 매개 변수 1 | 비교 | 매개 변수 2 |
|---|---|---|---|
| 1 | 'customer.user.id' | 더 큽니다 | '5' |
| 2 | 'customer.user.first_name' | 동일합니다 | 'customer.user.last_name' |
제약 조건 1은 다음을 확인합니다.
order . customer . user . id > 5마찬가지로 제약 조건 2는 다음을 확인합니다.
order . customer . user . first_name == order . customer . user . last_name모든 제약 조건이 충족 될 때만 이메일이 전송됩니다.
이 저장소에는 예제 프로젝트가 함께 제공됩니다. 이 응용 프로그램을 직접 테스트하는 것을 선호하는 경우 저장소 복제를 권장합니다.
example 로 탐색하고 Django 프로젝트를 실행합니다.
제안이나 개선 사항이 있으시면 언제든지 문제를 열거 나 요청을 받으십시오.
코드를 기여하려면 다음 단계를 따르십시오.
npm install 실행npm start . 이것은 변경 사항을 관찰하고 파일을 다시 컴파일합니다. 그렇지 않으면 npm run build 실행하여 파일을 한 번 컴파일하십시오.기여할 때 변경 사항에 대한 테스트와 모든 테스트가 통과되었는지 확인하십시오 (테스트 참조). 또한 코드가 올바르게 형식화되고 코드가 줄어든지 확인하십시오.
우리는 black 과 flake8 사용하여 코드를 형식화하고 보풀합니다. make 를 한 경우 다음을 실행하여 코드를 형식화하고 보풀을 묶을 수 있습니다.
make format
make lint또는 다음 명령을 실행할 수 있습니다.
black email_signals
flake8 --exclude=migrations email_signals 이 저장소는 tox 사용하여 여러 버전의 Python 및 Django에 대해 테스트를 실행합니다. make 설치 한 경우 make tox 실행하여 테스트를 실행할 수 있습니다. 그렇지 않으면 저장소의 루트에서 tox -s 실행하여 테스트를 실행할 수 있습니다.
현재 Python 버전에 대한 테스트를 실행하려면 tox -e py 또는 python3 runtests.py 실행할 수 있습니다.