ΠΠ΅Π»Π°Π΅ΠΌ Π°Π½ΠΊΠ΅ΡΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ Π²ΠΈΠ΄ΠΆΠ΅ΡΠ°ΠΌΠΈ, Π·Π°ΡΠΈΡΠ°Π΅ΠΌ ΡΠΎΡΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ°ΠΏΡΠΈ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π½Π° email.
β Π§Π°ΡΡΡ 3
ΠΡΠ½ΠΎΠ²Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠΎΡΠΌΠ°ΠΌΠΈ
ΠΠ±Π·ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°
ΠΠ½ΠΊΠ΅ΡΠ° ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠ° β ΡΠΎΡΠΌΠ° Ρ Π²ΡΠΏΠ°Π΄Π°ΡΡΠΈΠΌ ΡΠΏΠΈΡΠΊΠΎΠΌ, ΡΠ΅ΠΊΠ±ΠΎΠΊΡΠ°ΠΌΠΈ, ΡΠ°Π΄ΠΈΠΎΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ, ΠΏΠΎΠ»Π΅ΠΌ Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΡΠ΅Π·ΡΠΌΠ΅ ΠΈ ΠΊΠ°ΠΏΡΠ΅ΠΉ. ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ:
- ΠΠ°ΡΡΠΎΠΌΠ½ΡΠΉ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ β Π²ΡΠ΅ ΠΏΠΎΠ»Ρ Π°Π½ΠΊΠ΅ΡΡ Π²ΡΠ²ΠΎΠ΄ΡΡΡΡ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π²ΡΠΏΠ°Π΄Π°ΡΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠ°, ΡΠ°Π΄ΠΈΠΎΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈ ΡΠ΅ΠΊΠ±ΠΎΠΊΡΠΎΠ².
- ΠΠ°ΡΡΠΎΠΌΠ½Π°Ρ ΠΊΠ°ΠΏΡΠ° ΠΈ Π΅Π΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π±Π΅Π· ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΡΡΠ°Π½ΠΈΡΡ.
- ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ (Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ°ΠΉΠ» ΡΠ΅Π·ΡΠΌΠ΅) Π½Π° Π½ΡΠΆΠ½ΡΠΉ email.
ΠΠΎΠ΄Π΅Π»ΠΈ
Π’ΡΠΈ ΠΏΠΎΠ»Ρ Π² ΡΠΎΡΠΌΠ΅ β Β«ΠΠ°ΠΊΠ°Π½ΡΠΈΡΒ», Β«Π‘Π΅ΡΡΠΈΡΠΈΠΊΠ°ΡΡΒ» ΠΈ Β«ΠΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠΏΡΡΒ» β ΠΈΠΌΠ΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΠΎΡΠ²Π΅ΡΠΎΠ².
1. Π‘Π΅ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ, ΠΈΠ»ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ β Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΠΎΡΠ²Π΅ΡΠΎΠ² Π² Π±Π°Π·Π΅ ΠΈ ΠΈΡ Π²ΡΠ²ΠΎΠ΄Π° Π² Π²ΠΈΠ΄Π΅ ΡΠ΅ΠΊΠ±ΠΎΠΊΡΠΎΠ² ΠΏΡΠΈΠ½ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ»Π΅ ΠΈ ΡΠ²ΡΠ·Ρ ManyToManyField:
2. ΠΠ°ΠΊΠ°Π½ΡΠΈΠΈ Π²ΡΠ²ΠΎΠ΄ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ ΡΠ°ΡΠΊΡΡΠ²Π°ΡΡΠ΅Π³ΠΎΡΡ ΡΠΏΠΈΡΠΊΠ°. Π ΠΠ ΡΠ°ΠΊΠΈΠ΅ Π·Π°ΠΏΠΈΡΠΈ Ρ ΡΠ°Π½ΡΡ Π² Π²ΠΈΠ΄Π΅ choices, ΠΊΠΎΡΠΎΡΡΠ΅, Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΡΠ΅ΠΆΠ΅ΠΉ:
3. ΠΠΎΠΌΠΌΠ΅ΡΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠΏΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° ΠΎΡΠ²Π΅ΡΠ° β Π»ΠΈΠ±ΠΎ ΠΎΠ½ Π΅ΡΡΡ, Π»ΠΈΠ±ΠΎ Π΅Π³ΠΎ Π½Π΅Ρ. ΠΠΎΡΡΠΎΠΌΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΠΈΡ choices ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ BooleanField:
4. ΠΠ»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΡΠ΅Π·ΡΠΌΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠΎΠ»Π΅ FileField. Django Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΡΠ°ΠΉΠ»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π² ΠΏΠΎΠ΄Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ media:
5. ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎ ΡΠ΅Π±Π΅ ΠΌΠΎΠ΄Π΅Π»Ρ Application, Π±ΡΠ΄Π΅Ρ ΡΠΊΠ°Π·Π°Π½Π° Π² email'e:
Π€ΠΎΡΠΌΠ°
Π ΡΠΎΡΠΌΠ΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π²ΡΠ΅ ΠΏΠΎΠ»Ρ ΠΌΠΎΠ΄Π΅Π»ΠΈ Application, ΠΏΠ»ΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ»Π΅ Π΄Π»Ρ ΠΊΠ°ΠΏΡΠΈ (ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎ ΠΊΠ°ΠΏΡΠ΅ Π½ΠΈΠΆΠ΅). ΠΠ΄Π΅ΡΡ ΠΆΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΏΠΎΠ»Ρ Β«ΠΠΎΠ·ΡΠ°ΡΡΒ», Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Π²Π°Π»ΠΈΠ΄Π°ΡΠΎΡ FileExtensionValidator Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ ΡΠΎΡΠΌΠ°ΡΠΎΠ² ΡΠ°ΠΉΠ»Π° ΡΠ΅Π·ΡΠΌΠ΅:
Π ΠΊΠ»Π°ΡΡΠ΅ Meta ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΡΠΈΠΏ Π²ΠΈΠ΄ΠΆΠ΅ΡΠΎΠ² ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ empty_label Π΄Π»Ρ Π²ΡΠΏΠ°Π΄Π°ΡΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠ°. ΠΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ, Π² Π²Π΅ΡΡ Π½Π΅ΠΌ ΠΏΠΎΠ»Π΅ ΡΠΏΠΈΡΠΊΠ° Π±ΡΠ΄Π΅Ρ Π²ΡΠ²Π΅Π΄Π΅Π½ ΠΏΡΠ½ΠΊΡΠΈΡ --------.
ΠΠ»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠ΅ΠΊΡΡΠ° ΠΏΠ»Π΅ΠΉΡΡ ΠΎΠ»Π΄Π΅ΡΠΎΠ², ΡΡΠΈΠ»Ρ form control ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π²ΡΡΠΎΡΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΡ ΠΏΠΎΠ»Π΅ΠΉ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½ΡΠΆΠ½ΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ²:
ΠΠ΅ΡΠΎΠ΄ get_message ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ ΡΠΎΡΠΌΡ, Π° send ΠΎΡΡΡΠ»Π°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ (Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ°ΠΉΠ» ΡΠ΅Π·ΡΠΌΠ΅) Π½Π° Π½ΡΠΆΠ½ΡΠΉ email (ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ ΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ ΠΏΠΎΡΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° Π½ΠΈΠΆΠ΅):
ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ
ΠΠ° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠΎΡΠΌΡ, ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ Π² ΠΠ ΠΈ Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π° ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π½Π° email ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ApplicationView:
Π€ΡΠ½ΠΊΡΠΈΡ refresh_captcha (ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΡΠΎ ΡΠΊΡΠΈΠΏΡΠΎΠΌ captcha.js) ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΏΡΠΈ:
ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ SuccessView Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΡΡΠΏΠ΅ΡΠ½ΠΎΠΌ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ :
ΠΠ°ΠΊ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠ°ΠΏΡΡ Π² Django-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ
Π‘Π°ΠΌΡΠ΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠ΅ ΡΠ΅ΡΠ²ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠ°ΠΏΡΠΈ β Google reCaptcha ΠΈ hCaptcha. Π 2022 Π³ΠΎΠ΄Ρ ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ ΡΠ΅ΡΠ²ΠΈΡ Yandex SmartCaptcha. Π£ ΠΊΠ°ΠΏΡΠΈ Π―Π½Π΄Π΅ΠΊΡΠ° ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ β ΠΎΠ½Π° Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π° ΡΠΎΡΡΠΈΠΉΡΠΊΠΈΡ ΡΠ°ΠΉΡΠ°Ρ . ΠΠΎ, ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ reCaptcha ΠΈ hCaptcha, Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ SmartCaptcha Π³ΠΎΡΠ°Π·Π΄ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅, Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π°ΡΡ ΠΎΠ± Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° ΡΠ°ΠΉΡΠ΅.
ΠΡΡΡΠ°Ρ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° ΠΊΠ°ΠΏΡΠ΅, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΠΈ ΠΊΡΠ΄Π°-ΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ β Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½Π°Ρ ΠΊΠ°ΠΏΡΠ°. Π’Π°ΠΊΠ°Ρ ΠΊΠ°ΠΏΡΠ° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΡΠΌΠΎ Π² Django-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΠ±ΠΎΡΠΎΠΌ Π΄Π°Π½Π½ΡΡ β ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Π²Π΅ΡΡΠΈ ΠΊΠΎΠ΄ Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ. Π‘Π°ΠΌΠ°Ρ ΡΠ΄ΠΎΠ±Π½Π°Ρ ΠΈ Π³ΠΈΠ±ΠΊΠ°Ρ ΠΊΠ°ΠΏΡΠ° Π΄Π»Ρ Django β django-simple-captcha.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈ ΠΊΠ°ΡΡΠΎΠΌΠΈΠ·Π°ΡΠΈΡ django-simple-captcha
ΠΠΎΠ΄ΡΠ»Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
ΠΠ°ΠΆΠ½ΠΎ!
ΠΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ django-simple-captcha Π½ΡΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ ΠΠ: python manage.py migrate, Π° Π·Π°ΡΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΌΠ°ΡΡΡΡΡ path('captcha/', include('captcha.urls')) Π² config/urls.py.
ΠΠ½Π΅ΡΠ½ΠΈΠΉ Π²ΠΈΠ΄ ΠΈ ΡΠΈΠΏ Π·Π°Π΄Π°Ρ ΠΊΠ°ΠΏΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡΡ ΠΊΠ°ΠΊ ΡΠ³ΠΎΠ΄Π½ΠΎ. ΠΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΊΠ°ΠΏΡΠΈ Π΄Π΅Π»Π°ΡΡΡΡ Π² settings.py. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΊΠ°ΠΏΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge' ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ:
ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ ΡΠ»ΠΎΠ²Π° ΠΈΠ· ΡΠ»ΠΎΠ²Π°ΡΡ: CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.word_challenge'
ΠΠ»ΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡ ΠΏΡΠΎΡΡΡΠ΅ Π·Π°Π΄Π°ΡΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge' :
Π django-simple-captcha Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π²ΡΠ΅: ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈ ΡΠ²Π΅Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΠΎΡΡΡ ΡΡΠΌΠ° ΠΈ ΡΡΠ΅ΠΏΠ΅Π½Ρ ΠΈΡΠΊΠ°ΠΆΠ΅Π½ΠΈΡ. ΠΠΌΠ΅ΡΡΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΉ ΠΊΠ°ΠΏΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ±ΡΠ°ΡΡ Π°ΡΠ΄ΠΈΠΎ. Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ ΡΡΡΡΠΊΠΎΡΠ·ΡΡΠ½ΡΠ΅ ΡΠ»ΠΎΠ²Π° ΠΈΠ· Π·Π°ΡΠ°Π½Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π² settings.py Π²ΡΠ³Π»ΡΠ΄ΡΡ ΡΠ°ΠΊ:
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΏΡΠΈ Π±Π΅Π· ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΡΡΠ°Π½ΠΈΡΡ
ΠΠ°ΠΏΡΠ° ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π·Π°Π±ΠΎΡΠΈΡΡΠΎΠΉ β Ρ ΠΎΡΡ Π² Π½Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΡΡΠΊΠΎΡΠ·ΡΡΠ½ΡΠ΅ ΡΠ»ΠΎΠ²Π°, ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈΡ ΡΠ΅Π°Π»ΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ. ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΠΈ ΡΠ»ΡΡΡΠ°ΡΡ Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ β ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΏΡΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π»Ρ Π±ΠΎΡΠΎΠ². ΠΠΎ Π΄Π»Ρ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΊΠ°ΠΏΡΠΈ Π±Π΅Π· ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠΎΡΠΌΡ. ΠΠ° ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ, ΠΏΠΎΠΌΠΈΠΌΠΎ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ refresh_captcha, ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΡΠΊΡΠΈΠΏΡ captcha.js, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΠΉ Π² ΡΠ°Π±Π»ΠΎΠ½Π΅ base.html, ΠΌΠ°ΡΡΡΡΡ path('captcha/refresh/', refresh_captcha, name='refresh_captcha') ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠ° Ρ id="refresh-captcha".
ΠΠ°ΠΊ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ email ΠΈΠ· Django-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΠ»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΈΠΌΠ΅ΠΉΠ»ΠΎΠ² ΠΈΠ· Django Π½Π°Π΄ΠΎ Π»ΠΈΠ±ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΏΠΎΡΡΠΎΠ²ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ (ΡΡΠΎ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ), Π»ΠΈΠ±ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π»ΡΠ±ΡΠΌ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌ ΡΠ΅ΡΠ²ΠΈΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ SMTP Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’Π°ΠΊΠΎΠΉ Π΄ΠΎΡΡΡΠΏ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π―Π½Π΄Π΅ΠΊΡ.
ΠΠ°ΠΊ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΠ°ΡΠΎΠ»Ρ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
Π£ΡΠ΅ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ Π°ΠΊΠΊΠ°ΡΠ½ΡΠ° Π½Π΅Π»ΡΠ·Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΈΠΌΠ΅ΠΉΠ»ΠΎΠ² ΠΈΠ· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊ ΠΏΠΎΡΡΠΎΠ²ΠΎΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΡ, Π½Π°Π΄ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠΎΠ»Ρ.
ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° ΡΠ΅ΡΡΠ΅ΡΠ΅Π½ΠΊΡ ΠΈ Π²ΡΠ±Π΅ΡΠΈΡΠ΅ ΠΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ:
Π Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ Π½Π°ΠΆΠΌΠΈΡΠ΅ Π½Π° ΠΠΎΡΡΠΎΠ²ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΎΡΠΌΠ΅ΡΡΡΠ΅ IMAP:
ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² ΠΠ°ΡΠΎΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π·Π°ΡΠ΅ΠΌ Π² ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ:
Π Π² ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΠ°ΡΠΎΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΠ°ΡΠΎΠ»Ρ Π΄Π»Ρ ΠΏΠΎΡΡΡ:
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ΅ Π½ΡΠΆΠ½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π² settings.py:
- RECIPIENT_ADDRESS = 'admin@gmail.com' β ΡΡΠΎ Π°Π΄ΡΠ΅Ρ, Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄ΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΠ΄ΡΠ΅ΡΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ, Π² Π²ΠΈΠ΄Π΅ ΡΠΏΠΈΡΠΊΠ°.
- EMAIL_HOST = 'smtp.yandex.ru'
- EMAIL_PORT = 465
- EMAIL_USE_SSL = True
- DEFAULT_FROM_EMAIL = 'sender@yandex.ru' β Π°Π΄ΡΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ ΡΠΊΠ°Π·Π°Π½ Π² ΠΏΠΎΠ»Π΅ "ΠΎΡ ΠΊΠΎΠ³ΠΎ".
- EMAIL_HOST_USER = 'yandex_user@yandex.ru' β Π°Π΄ΡΠ΅Ρ, Π² ΡΡΠ΅ΡΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²Ρ ΡΠΎΠ·Π΄Π°Π»ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
- EMAIL_HOST_PASSWORD = 'yourownpasswordhere' β ΡΠΎΡ ΡΠ°ΠΌΡΠΉ ΠΏΠ°ΡΠΎΠ»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
- EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
ΠΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΌ EmailMessage ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ send Π² ΡΠΎΡΠΌΠ΅ ApplicationForm. ΠΠΈΡΡΠΌΠ° Π±ΡΠ΄ΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ Ρ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΠΌΠΈ ΡΠ΅Π·ΡΠΌΠ΅:
Π¨Π°Π±Π»ΠΎΠ½Ρ ΠΈ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΡΠΎΡΠΌΡ
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ 3 ΡΠ°Π±Π»ΠΎΠ½Π°:
ΠΠ°ΡΡΠΎΠΌΠ½ΡΠΉ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΡΠΎΡΠΌΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ application.html. ΠΠ»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΡΠ΅ΠΊΠ±ΠΎΠΊΡΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΈΠΊΠ» ΠΈ ΡΡΠ΅ΡΡΠΈΠΊ forloop.counter, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ:
ΠΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ Π²ΡΠΏΠ°Π΄Π°ΡΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΎΠ±Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΊΠΎΡΡΠ΅ΠΆΠ°:
ΠΡΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π΄ΠΈΠΎΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΡΡΠ΅ΠΆΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ value, Π²ΡΠΎΡΠΎΠ΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ label:
ΠΠΎΠ΄Π²Π΅Π΄Π΅ΠΌ ΠΈΡΠΎΠ³ΠΈ
Π Ρ ΠΎΠ΄Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΌΡ Π½Π°ΡΡΠΈΠ»ΠΈΡΡ:
- ΠΠ°ΡΡΠΎΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ ΠΊΠ°ΠΏΡΡ Π±Π΅Π· ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΡΡΠ°Π½ΠΈΡΡ.
- Π Π΅Π½Π΄Π΅ΡΠΈΡΡ ΡΠ»ΠΎΠΆΠ½ΡΠ΅ Π²ΠΈΠ΄ΠΆΠ΅ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ HTML/CSS ΡΡΠΈΠ»Π΅ΠΉ.
- ΠΡΠΏΡΠ°Π²Π»ΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ· Django-ΡΠΎΡΠΌΡ Π½Π° ΠΈΠΌΠ΅ΠΉΠ» β Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΡΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡ Π½Π° Π²Π°ΠΊΠ°Π½ΡΠΈΠΈ, Π½ΠΎΠ²ΠΎΡΡΠΈ ΠΈ Ρ.ΠΏ.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΡΠ°ΡΡΠ΅ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ°Π±Π»ΠΎΠ½Π°ΠΌΠΈ. ΠΠ΅ΡΡ ΠΊΠΎΠ΄ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° β Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ.
***
Π‘ΠΎΠ΄Π΅ΡΠΆΠ°Π½ΠΈΠ΅ ΠΊΡΡΡΠ°
- ΠΡΠΎΠ΅ΠΊΡ 3: Π‘Π»ΠΎΠΆΠ½Π°Ρ ΡΠΎΡΠΌΠ° Ρ ΠΊΠ°ΡΡΠΎΠΌΠ½ΠΎΠΉ ΠΊΠ°ΠΏΡΠ΅ΠΉ