π ΠΠ°ΠΊ ΠΎΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Django: ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΡΠΎΠ²Π΅ΡΡ ΠΈ ΡΡΡΠΊΠΈ
Π§ΡΠΎΠ±Ρ ΠΎΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π² Django, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ ΠΈ ΠΆΡΡΠ½Π°Π»Ρ.
ΠΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΡΡΠΎΠ±Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ "Page not found" (Π‘ΡΡΠ°Π½ΠΈΡΠ° Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°):
try:
# ΠΠ°Ρ ΠΊΠΎΠ΄ Django
except Http404:
# ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅ "Π‘ΡΡΠ°Π½ΠΈΡΠ° Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°"
# ΠΠ΄Π΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΈΠ»ΠΈ Π²Π΅ΡΠ½ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΎΡΠ²Π΅Ρ
...
Π’Π°ΠΊΠΆΠ΅, Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ ΠΈ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡΡ , Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΆΡΡΠ½Π°Π»Ρ Π² Django. Π ΡΠ°ΠΉΠ»Π΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° (settings.py) ΡΠΊΠ°ΠΆΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
'file': {
'class': 'logging.FileHandler',
'filename': 'logfile.log',
},
},
'root': {
'handlers': ['console', 'file'],
'level': 'DEBUG',
},
}
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Django Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π²ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΡ Π² ΡΠ°ΠΉΠ» "logfile.log".
ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ logging
Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ:
import logging
ΠΠ΅ΡΠ°Π»ΡΠ½ΡΠΉ ΠΎΡΠ²Π΅Ρ
ΠΠ°ΠΊ ΠΎΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Django
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Django ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΊΠΎΠ³Π΄Π° ΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ ΠΎΠ± ΠΎΡΠ»Π°Π΄ΠΊΠ΅ ΠΈ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ. Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠΉ ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΌΠΎΠ³ΡΡ Π²Π°ΠΌ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΎΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΈ ΠΈΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π² Π²Π°ΡΠ΅ΠΌ Django-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.
1. ΠΠΎΠ³ΠΈ
ΠΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π°ΠΆΠ½ΡΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠΌ ΠΏΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Django ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ logging
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π»ΠΎΠ³ΠΎΠ² Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠ°ΠΉΠ»Ρ, ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΠΈΠ»ΠΈ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
. ΠΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΠΎΠ³ΠΈ Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΡΠ΅ΠΊΠ° Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅.
ΠΡΠΈΠΌΠ΅Ρ:
import logging
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π»ΠΎΠ³Π³Π΅Ρ
logger = logging.getLogger(__name__)
def my_function():
try:
# ΠΠ°Ρ ΠΊΠΎΠ΄
except Exception as e:
# ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π² Π»ΠΎΠ³
logger.error('ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°: %s', str(e))
2. ΠΡΠ»Π°Π΄ΡΠΈΠΊ
Π Django Π²ΡΡΡΠΎΠ΅Π½ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ°Π³ Π·Π° ΡΠ°Π³ΠΎΠΌ ΠΊΠΎΠ΄ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ Π΄Π»Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π²Π½Π΅ΡΡΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π²Π°ΡΠ΅Π³ΠΎ Django-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
# ΠΠΊΠ»ΡΡΠ°Π΅ΠΌ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ
DEBUG = True
# Π£ΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π°Π΄ΡΠ΅ΡΠ° IP, Ρ ΠΊΠΎΡΠΎΡΡΡ
ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΡ
INTERNAL_IPS = ['127.0.0.1']
# Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΏΡΡΡ ΠΊ Django ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΡ
DEBUG_TOOLBAR_PANELS = [
'debug_toolbar.panels.versions.VersionsPanel',
'debug_toolbar.panels.timer.TimerPanel',
'debug_toolbar.panels.settings.SettingsPanel',
'debug_toolbar.panels.headers.HeadersPanel',
'debug_toolbar.panels.request.RequestPanel',
'debug_toolbar.panels.sql.SQLPanel',
'debug_toolbar.panels.staticfiles.StaticFilesPanel',
'debug_toolbar.panels.templates.TemplatesPanel',
'debug_toolbar.panels.cache.CachePanel',
'debug_toolbar.panels.signals.SignalsPanel',
'debug_toolbar.panels.logging.LoggingPanel',
'debug_toolbar.panels.redirects.RedirectsPanel',
]
# ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ°
INSTALLED_APPS += ['debug_toolbar']
ΠΠΎΡΠ»Π΅ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ ΡΡΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΠΈΠ΄Π΅ΡΡ ΠΏΠ°Π½Π΅Π»Ρ ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ° Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΈ Π΄ΠΎΡΡΡΠΏΠ΅ Ρ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π°Π΄ΡΠ΅ΡΠΎΠ² IP.
3. ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
Django ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π°ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΈΠΏΠΎΠ² ΠΎΡΠΈΠ±ΠΎΠΊ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΠ° ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ Π²Π½ΡΡΡΠΈ Π²Π°ΡΠ΅Π³ΠΎ Django-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠΈΠΌΠ΅Ρ:
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse
def my_view(request):
try:
# ΠΠ°Ρ ΠΊΠΎΠ΄
except PermissionDenied:
# ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΠΎΡΠΈΠ±ΠΊΡ PermissionDenied
return HttpResponse('Π£ Π²Π°Ρ Π½Π΅Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ', status=403)
except Exception as e:
# ΠΠ±ΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΡΠΈΠ±ΠΎΠΊ
return HttpResponse('ΠΡΠΎΠΈΠ·ΠΎΡΠ»Π° ΠΎΡΠΈΠ±ΠΊΠ°: %s' % str(e), status=500)
4. Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π°ΡΠ΅Π³ΠΎ Django-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ Π²Π°ΠΌ Π²ΡΡΠ²ΠΈΡΡ ΠΈ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π΄ΠΎ ΠΈΡ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΡ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ½. Django ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Π΄Π»Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ΅ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π°ΠΌ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π°ΡΠΏΠ΅ΠΊΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ.
ΠΡΠΈΠΌΠ΅Ρ:
from django.test import TestCase
class MyViewTest(TestCase):
def test_my_view(self):
response = self.client.get('/my-view/')
self.assertEqual(response.status_code, 200)
# ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π·Π΄Π΅ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ
5. ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Django ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π½Π½ΡΠΌ ΡΠ΅ΡΡΡΡΠΎΠΌ ΠΏΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠ΅ ΠΈ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ. ΠΠ½Π° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ Π°ΡΠΏΠ΅ΠΊΡΠ°Ρ Django, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ, ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΠΊΠ»Π°ΡΡΠΎΠ², Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Django, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅ ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ Π΅Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ.
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΊΠ°ΡΡ ΠΎΡΠ²Π΅ΡΡ Π½Π° ΡΠ²ΠΎΠΈ Π²ΠΎΠΏΡΠΎΡΡ Π² ΠΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅ ΠΈΠ»ΠΈ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ Π·Π° ΠΏΠΎΠΌΠΎΡΡΡ ΠΊ ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²Π°ΠΌ ΠΈ ΡΠ΅ΡΡΡΡΠ°ΠΌ Django.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΡΠ»Π°Π΄ΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ Π² Django ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ, Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠ² Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ ΠΈ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ, ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Django Π΄Π»Ρ ΠΏΠΎΠ²ΡΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π½Π° ΠΎΡΠΈΠ±ΠΊΠΈ.
ΠΠ°Π΄Π΅ΡΡΡ, ΡΡΠ° ΡΡΠ°ΡΡΡ ΠΏΠΎΠΌΠΎΠ³Π»Π° Π²Π°ΠΌ Π»ΡΡΡΠ΅ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ ΠΎΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π² Django ΠΈ ΡΡΠ°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ. Π£Π΄Π°ΡΠΈ Π²Π°ΠΌ Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ!