แอปพลิเคชัน 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 ด้วยการสร้างวิธีการต่าง ๆ ที่มีรายการอีเมลที่แตกต่างกันเรามีวิธีการสร้างรายชื่อผู้รับจดหมายที่แตกต่างกันอย่างมีประสิทธิภาพ อีกทางเลือกหนึ่งเราสามารถใช้รายการอีเมลคั่นด้วยเครื่องหมายจุลภาคสำหรับรายชื่อผู้รับจดหมาย
ก่อนที่เราจะเริ่มเพิ่มข้อ จำกัด ใด ๆ เราจะบันทึกสัญญาณ สิ่งนี้จะทำให้ข้อ จำกัด ของสัญญาณการตั้งค่าง่ายขึ้นเนื่องจากจะช่วยให้คุณสมบัติการเติมข้อความอัตโนมัติช่วยเราได้ หากคุณกังวลเกี่ยวกับเวลาระหว่างการบันทึกสัญญาณและการตั้งค่าข้อ จำกัด ของสัญญาณคุณสามารถตั้งค่าสถานะ ที่ใช้งาน ได้เป็นเท็จก่อน สิ่งนี้จะป้องกันไม่ให้อีเมลใด ๆ ถูกส่ง
ตอนนี้เราสามารถตั้งค่าข้อ จำกัด สำหรับสัญญาณ เราจะสร้างข้อ จำกัด สองข้อ:
created == True )customer.id > 10) 
การตรวจสอบทั่วไปอย่างหนึ่งเมื่อสร้างสัญญาณ post_save คือการตรวจสอบคืออินสแตนซ์เป็นอินสแตนซ์ใหม่ สิ่งนี้สามารถทำได้โดยการตั้งค่าพารามิเตอร์ให้ created และการเปรียบเทียบกับ "เป็นจริง"
รูปแบบการสั่งซื้อของเรามีฟิลด์ customer ซึ่งเป็นคีย์ต่างประเทศสำหรับโมเดล customer เราสามารถข้ามผ่านวัตถุ customer เพื่อรับ id ของลูกค้า จากนั้นเราสามารถตรวจสอบได้ว่า customer.id > 10
แอพนี้มีคุณสมบัติการเติมข้อความอัตโนมัติที่มีประโยชน์ซึ่งจะช่วยให้คุณข้ามผ่านฟิลด์โมเดลและคุณสมบัติที่แคชใด ๆ ไม่ต้องกังวลเกี่ยวกับการทำผิดพลาดใด ๆ เนื่องจากมีการตรวจสอบความถูกต้องในการปฏิเสธพารามิเตอร์ใด ๆ ที่ไม่สามารถเข้าถึงได้
การบันทึกสัญญาณนี้จะตรวจสอบให้แน่ใจว่าสัญญาณจะถูกส่งเฉพาะเมื่อคำสั่งซื้อเป็นอินสแตนซ์ใหม่และรหัสลูกค้ามากกว่า 10
ในการติดตั้งแอปพลิเคชันให้เรียกใช้คำสั่งต่อไปนี้:
pip install django-email-signals
คำสั่ง PIP Install จะเป็นสิ่งที่จำเป็นสำหรับคนส่วนใหญ่ แต่ถ้าคุณต้องการดูภายใต้ประทุนและดูว่าเกิดอะไรขึ้นคุณสามารถโคลนไดเรกทอรีต้นฉบับได้:
git clone https://github.com/Salaah01/django-email-signals.git
1. เพิ่มใน INSTALLED_APPS i เพิ่มเพิ่ม tinymce ลงในไฟล์ INSTALLED_APPS ของคุณในไฟล์ settings.py ของคุณ
INSTALLED_APPS = [
' app_1 `,
' app_2 `,
'...' ,
'tinymce' ,
] ii. เพิ่ม email_signals ใน INSTALLED_APPS ของคุณในไฟล์ settings.py ของคุณ สิ่งนี้ควรเพิ่มหลังจากแอพใด ๆ ที่มีโมเดลที่คุณต้องการสร้างสัญญาณโดยใช้แอปพลิเคชันนี้
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] หากคุณไม่ต้องการระบุอีเมลผู้ส่งอย่างชัดเจนสำหรับทุกสัญญาณที่คุณกำหนดคุณสามารถตั้งค่า EMAIL_SIGNAL_DEFAULT_SENDER ใน settings.py โครงการของคุณ
5. เพิ่มโมเดล mixin ในรุ่นที่คุณต้องการเพิ่มสัญญาณคุณจะต้องเพิ่ม mixin ต่อไปนี้เป็นการพึ่งพาโมเดล: 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 เพื่อส่ง |
| เรื่อง | เรื่อง | วิชาอีเมล |
| จากอีเมล | จาก _EMAIL | (ไม่บังคับ) ผู้ส่งอีเมล ค่าเริ่มต้นถึง settings.EMAIL_SIGNAL_DEFAULT_SENDER EMAIL_SIGNAL_DEFAULT_SENDER |
| รายชื่อผู้รับจดหมาย | mailing_list | รายการผู้รับที่ข้อความที่คุณป้อนสอดคล้องกับวิธีการที่เรียกว่าในคลาสโมเดลที่มีชื่อเดียวกัน เช่น: หากคุณป้อน customer_mails จะต้องมีวิธีที่เรียกว่า customer_mails ที่ส่งคืนคอลเลกชันของอีเมลในคลาสรุ่น หรือนี่อาจเป็นรายการอีเมลคั่นด้วยเครื่องหมายจุลภาค เช่น: [email protected],[email protected] จะส่งอีเมลไปยังอีเมลทั้งสองนี้ |
| เทมเพลต | เทมเพลต | (ไม่บังคับ) เส้นทางไปยังเทมเพลตหากคุณต้องการแสดงอีเมลจากเทมเพลต สิ่งนี้ใช้ตัวโหลดเทมเพลตของ Django ดังนั้นค่าที่คุณให้ไว้ที่นี่ควรสัมพันธ์กับ settings.TEMPLATES[i]['DIRS'] |
| ประเภทสัญญาณ | signal_type | ประเภทของสัญญาณที่จะเพิ่มสำหรับบันทึกนี้ |
| คล่องแคล่ว | คล่องแคล่ว | สวิตช์เพื่อเปิดและปิดสัญญาณนี้ |
ข้อ จำกัด ของสัญญาณ โมเดลอินไลน์นี้เป็นที่ที่คุณสามารถกำหนดข้อ จำกัด บางอย่างซึ่งจะพิจารณาว่าควรยกสัญญาณเป็นกรณี ๆ ไปหรือไม่
| ฉลาก | ชื่อฟิลด์ | คำอธิบาย |
|---|---|---|
| พารามิเตอร์ 1 | param_1 | พารามิเตอร์แรกที่ใช้เมื่อทดสอบข้อ จำกัด พารามิเตอร์นี้จะต้องมีอยู่ในสัญญาณ kwargs หรืออินสแตนซ์รุ่น |
| การเปรียบเทียบ | การเปรียบเทียบ | กำหนดวิธีการเปรียบเทียบพารามิเตอร์ เช่น: พารามิเตอร์ 1 มากกว่า พารามิเตอร์ 2 |
| พารามิเตอร์ 1 | param_1 | (ไม่บังคับ) พารามิเตอร์ที่สองที่จะใช้เมื่อทดสอบข้อ จำกัด พารามิเตอร์นี้สามารถว่างเปล่าเมื่อข้อ จำกัด เป็นสิ่งที่สมเหตุสมผล ตัวอย่างเช่นหากข้อ จำกัด คือ "เป็นจริง" ไม่จำเป็นต้องใช้พารามิเตอร์ 2 แต่ถ้าข้อ จำกัด คือ "มากกว่า" จำเป็นต้องใช้พารามิเตอร์ 2 พารามิเตอร์ 2 ยังสามารถเป็นประเภทดั้งเดิมเช่น 'A', '1', '1.1' แอปพลิเคชันจะพยายามแปลงสตริงเป็นตัวเลขหากทำได้ |
พารามิเตอร์มีความลึก ทั้งพารามิเตอร์ 1 และ 2 อนุญาตให้คุณค้นหาลึกเข้าไปในวัตถุ สมมติว่าเรามีโครงสร้างและสัญญาณต่อไปนี้ได้รับอินสแตนซ์ CustomerOrder
ชั้นเรียน
ผู้ใช้ <| -- ลูกค้า
ลูกค้า <| - การสั่งซื้อลูกค้า
ผู้ใช้คลาส {
รหัสประจำตัว
first_name
last_name
อีเมล
-
ลูกค้าชั้นเรียน {
รหัสประจำตัว
ผู้ใช้
fav_language
-
คลาสลูกค้าสั่ง {
รหัสประจำตัว
ลูกค้า
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 เพื่อเริ่มต้นเซิร์ฟเวอร์ WebPack Dev สิ่งนี้จะดูการเปลี่ยนแปลงและคอมไพล์ไฟล์ใหม่ มิฉะนั้นเรียกใช้การเรียกใช้ 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