рдорд╛рдЗрдХреНрд░реЛрд╕реНрдХреЛрдк рдХреЗ рддрд╣рдд Django

рдЕрдЧрд░ рдЕрд░реНрдЯрд┐рдУрдо рдорд╛рд▓реЗрд╢реЗрд╡ ( рдкреНрд░реВрдлрд┐рдЯ404 ) рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╡реЗ рдПрдХ рдлрд┐рд▓реНрдо рдмрдирд╛рдПрдВрдЧреЗ, рддреЛ рдирд┐рд░реНрджреЗрд╢рдХ рдХреНрд╡реЗрдВрдЯрд┐рди рдЯрд╛рд░рдирдЯрд┐рдиреЛ рд╣реЛрдВрдЧреЗ - рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдлрд┐рд▓реНрдо рдмрдирд╛рдИ рд╣реИ рдЬреЛ рдЬрд╛рдВрдЧреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╡рд╣ рджреВрд╕рд░реА рд╢реВрдЯрд┐рдВрдЧ рднреА рдХрд░реЗрдВрдЧреЗред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрддрд┐рдо рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП HTTP рдЕрдиреБрд░реЛрдз рдХреЗ рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯ рд╕реЗ Django рдЖрдВрддрд░рд┐рдХ рддрдВрддреНрд░ рдХреЗ рдЬреАрд╡рди рд╕реЗ рд╕рднреА рд╡рд┐рд╡рд░рдгред рдкрд╛рд░реНрд╕рд░ рд░реВрдкреЛрдВ рдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк, SQL рдХрд╛ рдПрдХреНрд╢рди-рдкреИрдХреНрдб рд╕рдВрдХрд▓рди, HTML рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рднрд╛рд╡ред рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХреМрди рдФрд░ рдХреИрд╕реЗ рдХрд░ рд░рд╣рд╛ рд╣реИ? рдпрд╣ рд╕рдм WSGI рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХрд╛рд▓рд╛рдиреБрдХреНрд░рдорд┐рдХ рдХреНрд░рдо рдореЗрдВ рд╣реИред рджреЗрд╢ рдХреЗ рд╕рднреА рд╕реНрдХреНрд░реАрдиреЛрдВ рдкрд░ - рдбрд┐рдХреЛрдбрд┐рдВрдЧ "Django рдЕрдВрдбрд░ рдорд╛рдЗрдХреНрд░реЛрд╕реНрдХреЛрдк"ред



рд╕реНрдкреАрдХрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ: рдПрд░реАрдЯреЛрдо рдорд╛рд▓рд┐рд╢реЗрд╡ рд╕реВрдЦреА рдкрд╛рдпрдерди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рдВрд╕реНрдерд╛рдкрдХ рдФрд░ Django рдЪреИрдирд▓ рд╕рдВрд╕реНрдХрд░рдг 1.0 рдХреЗ рдореБрдЦреНрдп рдбреЗрд╡рд▓рдкрд░ рд╣реИрдВред рд╡рд╣ 5 рд╕рд╛рд▓ рд╕реЗ рдкрд╛рдпрдерди рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЙрд╕рдиреЗ рдирд┐рдЬрд╝рдиреА рдиреЛрд╡рдЧреЛрд░реЛрдб рдореЗрдВ рдкрд╛рдпрдерди рд░реИрдиреНрдЯрд╕ рдХреА рдмреИрдардХреЛрдВ рдХреЛ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХреА рд╣реИред PROOFIT404 рдЙрдкрдирд╛рдо рдХреЗ рддрд╣рдд Artyom рдЖрдкрд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ ред


рдПрдХ рдмрд╛рд░, рд╣рдордиреЗ Django рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ред рддрдм рд╡рд╣ рдбрд░рд╛рд╡рдиреА рдФрд░ рдЙрджрд╛рд╕ рд▓рдЧ рд░рд╣реА рдереАред



рдЙрдиреНрд╣реЛрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ self_check рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╣рдордиреЗ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛, рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдЕрдм рдЖрдк рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдм рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ django-admin runserver ред

 $ django-admin runserver Performing system checksтАж System check identified no issues (0 silenced). You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate1 to apply them. August 21, 2018 - 15:50:53 Django version 2.1, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/Quit the server with CONTROL-C. 

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдЬрд╛рджреВ рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдХреЛрдб рдЬреЛ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рд╕рд╛рдЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рд╕реНрдерд╛рдкрдирд╛


django-admin рд╕рд┐рд╕реНрдЯрдо рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдЬрдм рд╣рдо Django рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдЗрдк, рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ ред

 $ pip install Django # setup.py from setuptools import find_packages, setup setup( name='Django', entry_points={ 'console_scripts': [ 'django-admin = django.core.management:execute_from_command_line' ] }, ) 

entry_points setuptools рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд╛рд░реНрдп execute_from_command_line рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП execute_from_command_line рдХрд░рддрд╛ execute_from_command_line рдлрд╝рдВрдХреНрд╢рдиред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП Django рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рд╣реИред

рдмреВрдЯрд╕реНрдЯреНрд░реИрдк


рдПрдХ рдлрдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдмреВрдЯрд╕реНрдЯреНрд░реИрдк , рдЬрд┐рд╕реЗ рджреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

 # django.core.management django.setup(). 

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ


рдкрд╣рд▓рд╛ рдХреЙрдиреНрдлрд┐рдЧ рд░реАрдбрд┐рдВрдЧ рд╣реИ :

 import django.conf.global_settings import_module(os.environ["DJANGO_SETTINGS_MODULE"]) 

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ global_settings , рдлрд┐рд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗ рд╣рдо global_settings рд╕рд╛рде рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд▓рд┐рдЦрд╛ рдерд╛ред рдЗрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдПрдХ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬреЛ рдХреЛрдИ рднреА Django рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо "рд╣реИрд▓реЛ, рджреБрдирд┐рдпрд╛" рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ INSTALLED_APPS - рдЬрд╣рд╛рдВ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рдРрдкреНрд╕ рдЖрдмрд╛рдж рдХрд░реЗрдВ


рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рдпреЗ рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ, рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкреИрдХреЗрдЬ, рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдмрдирд╛рддреЗ рд╣реИрдВ, рд╣рдо рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЕрдЦрдВрдбрддрд╛ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлреНрд░реЗрдорд╡рд░реНрдХ рд░рди рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рд╣реИ, рд╕рднреА рд╡рд┐рджреЗрд╢реА рдХреБрдВрдЬреА рдореМрдЬреВрджрд╛ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рдпрд╣ рд╣реИ рдХрд┐ рдирд▓ рдлрд╝реАрд▓реНрдб рдХреЛ рдмреВрд▓рд┐рдпрдирдлрд╝рд┐рд▓реНрдб рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди NullBooleanField рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 for entry in settings.INSTALLED_APPS: cfg = AppConfig.create(entry) cfg.import_models() 

рдпрд╣ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП, рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдкреИрдирд▓ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП - рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд┐рдП рдмрд┐рдирд╛, рдХреБрдЫ рд╕реБрдкрд░ рдЬрдЯрд┐рд▓ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдирд╛ рдиреНрдпреВрдирддрдо рд╢реБрджреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рд╣реИред рдЗрд╕ рд╕реНрддрд░ рдкрд░, Django рдХреЛ рдЕрднреА рддрдХ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, runserver рдпрд╛ shell рд╕реЗ migrate рдХреЛ рднреЗрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдлрд┐рд░ рд╣рдо рдЦреБрдж рдХреЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рддрд░реНрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред

рдкреНрд░рдмрдВрдзрди рдХреА рдХрдорд╛рди


 # django.core.management subcommand = sys.argv[1] app_name = find(pkgutils.iter_modules(settings.INSTALLED_APPS)) module = import_module( '%s.management.commands.%s' % (app_name, subcommand) ) cmd = module.Command() cmd.run_from_argv(self.argv) 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд░рдирд╕реНрд╡рд░ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд django.core.management.commands.runserver рдореЙрдбреНрдпреВрд▓ рд╣реЛрдЧрд╛ред рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрдиреНрд╡реЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛, рдЧреНрд▓реЛрдмрд▓ рдХреНрд▓рд╛рд╕ Command рдХреЛ рдЕрдВрджрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, Command рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ: " рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдкрд╛рдпрд╛, рдпрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╛рд╕ рд╣реЛ рдЧрдпрд╛, рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░реЗрдВ ред"

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рд░рдирд╕рд░реНрд╡рд░ рдореЙрдбреНрдпреВрд▓ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ Django "regexp рдФрд░ рд╕реНрдЯрд┐рдХ" рд╕реЗ рдмрдирд╛ рд╣реИ , рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдЖрдЬ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛:

 # django.core.management.commands.runserver naiveip_re = re.compile(r"""^(?: (?P<addr> (?P<ipv4>\d{1,3}(?:\.\d{1,3}){3}) | # IPv4 address (?P<ipv6>\[[a-fA-F0-9:]+\]) | # IPv6 address (?P<fqdn>[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*) # FQDN ):)?(?P<port>\d+)$""", re.X) 

рдЖрджреЗрд╢


рдбреЗрдврд╝ рд╕реНрдХреНрд░реАрди рдиреАрдЪреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ - рдЕрдВрдд рдореЗрдВ рд╣рдо рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣рдорд╛рд░реА рдЯреАрдо рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдЖрддреЗ рд╣реИрдВред

 # django.core.management.commands.runserver class Command(BaseCommand): def handle(self, *args, **options): httpd = WSGIServer(*args, **options) handler = WSGIHandler() httpd.set_app(handler) httpd.serve_forever() 

BaseCommand рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдПрдХ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк *args рдФрд░ **options рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ **options рд╣реИрдВред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ WSGI рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ WSGI рд╕рд░реНрд╡рд░ рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ WSGIHandler рд╕реНрдерд╛рдкрд┐рдд рд╣реИ - рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ God Object Django рд╣реИ ред рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдкрд░ рд╕рд░реНрд╡рд░ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ - set application рдорд╛рдзреНрдпрдо рд╕реЗ set application рдФрд░ рдХрд╣рддрд╛ рд╣реИ: "рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдореЗрдВ рд╕реНрдкрд┐рди рдХрд░реЗрдВ, рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред"

рд╣рдореЗрд╢рд╛ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдПрдХ рдЗрд╡реЗрдВрдЯ рд▓реВрдк рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЬреЛ рдЙрд╕реЗ рдЯрд╛рд╕реНрдХ рджреЗрддрд╛ рд╣реИред

WSGI рд╕рд░реНрд╡рд░


WSGIHandler рдХреНрдпрд╛ рд╣реИ? WSGI рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдиреНрдпреВрдирддрдо рд╕реНрддрд░ рдХреЗ рдЕрдореВрд░реНрдд рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рджрд┐рдЦрддрд╛ рд╣реИред

WSGI рд╣реИрдВрдбрд▓рд░


 # django.core.handlers.wsgi class WSGIHandler: def __call__(self, environ, start_response): signals.request_started.send() request = WSGIRequest(environ) response = self.get_response(request) start_response(response.status, response.headers) return response 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ call рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рд╡рд╣ рдЕрдкрдиреЗ рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣реЗрдбрд░ рдХреЛ рдмрд╛рдЗрдЯреНрд╕ рдФрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓-рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдиреБрд░реЛрдз рдХреА <body> рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рд░реНрд╡рд░ рд╕реНрд╡рдпрдВ рднреА рдХреЙрд▓рдмреИрдХ start_response рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдПрдХ рдмрдВрдбрд▓ рдореЗрдВ response.headers , рд╣реЗрдбрд░ рдФрд░ рдЙрд╕рдХреЗ рд╣реЗрдбрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдерд┐рддрд┐ рднреЗрдЬ рд╕рдХреЗрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдмреЙрдбреА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХ рдЬрдирд░реЗрдЯрд░ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдУрд╡рд░рд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

WSGI рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рд╕рднреА рд╕рд░реНрд╡рд░ - Gunicorn, uWSGI, рд╡реЗрдЯреНрд░реЗрд╕, рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рдирд┐рдореЗрдп рд╣реИрдВред рдЕрдм рд╣рдо рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░реНрд╡рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рд╕рд░реНрд╡рд░ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрддрд╛ рд╣реИ рдХрд┐ Django рдореЗрдВ рдпрд╣ рдПрдирд╕рд╛рдЗрдЯ рдФрд░ рдХреЙрд▓рдмреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд╕реНрддрдХ рджреЗрддрд╛ рд╣реИред

рдИрд╢реНрд╡рд░ рд╡рд╕реНрддреБ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИ?


Django рдХреЗ рдЕрдВрджрд░ рдЗрд╕ рдЧреНрд▓реЛрдмрд▓ рдЧреЙрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?

  • рдЕрдиреБрд░реЛрдзред
  • MIDDLEWARESред
  • рджреЗрдЦрдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдЕрдиреБрд░реЛрдз
  • рджреГрд╢реНрдп - рдЕрдВрджрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдкреНрд░рд╕рдВрд╕реНрдХрд░рдгред
  • рдлрд╛рд░реНрдо - рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
  • ORMред
  • рдЦрд╛рдХрд╛ред
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ред

Django рд╕реЗ рд╣рдо рдЬреЛ рднреА рдорд╢реАрдирд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡рд╣ рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рднреАрддрд░ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдкреВрд░реЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдлреИрд▓реА рд╣реБрдИ рд╣реИред

рдкреНрд░рд╛рд░реНрдердирд╛


рд╣рдо рдбрдмреНрд▓реНрдпреВрдПрд╕рдЬреАрдЖрдИ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ, рдЬреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд╕реНрддреБ рдореЗрдВ рдПрдХ рд╕рд░рд▓ рд╢рдмреНрджрдХреЛрд╖ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЬрд┐рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВред рдХреБрдХреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдореИрдВ рдпрд╣ рднреА рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдХреНрдпрд╛ рднрдВрдбрд╛рд░рдг рдЕрд╡рдзрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реЗрдВред

 # django.core.handlers.wsgi class WSGIRequest(HttpRequest): @cached_property def GET(self): return QueryDict(self.environ['QUERY_STRING']) @property def POST(self): self._load_post_and_files() return self._post @cached_property def COOKIES(self): return parse_cookie(self.environ['HTTP_COOKIE']) 

рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкрд╛рд░реНрд╕рд░реНрд╕, рд╕рд╛рде рд╣реА рд╕рд╛рде POST рдЕрдиреБрд░реЛрдз рдХреЗ рд╢рд░реАрд░ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ: рдЪрд╛рд╣реЗ рд╡рд╣ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реЛ рдпрд╛ рдбрд┐рд╕реНрдХ рдкрд░ рднрдВрдбрд╛рд░рдг рдореЗрдВ рдЕрд╕реНрдерд╛рдпреАред рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдВрджрд░ рд╕рдм рдХреБрдЫ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Django рдореЗрдВ рдЕрдиреБрд░реЛрдз рднреА рдПрдХ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдмрд┐рдЪреМрд▓рд┐рдпреЛрдВ рдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рддреНрд░, рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рднреА рдПрдХ рдИрд╢реНрд╡рд░ рд╡рд╕реНрддреБ рд╣реИ, рд▓реЗрдХрд┐рди рдЫреЛрдЯрд╛ рд╣реИред

рдЖрдЧреЗ рдЕрдиреБрд░реЛрдз рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдорд┐рд▓рддрд╛ рд╣реИред

Middlewares


рдорд┐рдбрд┐рд▓рд╡реЗрдпрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИ рдЬреЛ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреА рддрд░рд╣ рд▓рдкреЗрдЯрддрд╛ рд╣реИред рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдХреЙрд▓ рд╡рд┐рдзрд┐ рдореЗрдВ рд╣рдо рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддреЗ рд╣реИрдВ рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдкрдЯреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдорд┐рдбрд┐рд▓рд╡реЗрдпрд░ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

рд╕реЗрдЯрд┐рдВрдЧ


 # settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', ] 

рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ


 class Middleware: def __init__(self, get_response=None): self.get_response = get_response def __call__(self, request): return self.get_response(request) 

Django рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдмрд┐рдЪреМрд▓рд┐рдпреЗ рдПрдХ рддрд░рд╣ рдХреЗ рдвреЗрд░ рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:

 # django.core.handlers.base def load_middleware(self): handler = convert_exception_to_response(self._get_response) for middleware_path in reversed(settings.MIDDLEWARE): middleware = import_string(middleware_path) instance = middleware(handler) handler = convert_exception_to_response(instance) self._middleware_chain = handler 

рд▓рд╛рдЧреВ рдХрд░реЗрдВ


 def get_response(self, request): set_urlconf(settings.ROOT_URLCONF) response = self._middleware_chain(request) return response 

рд╣рдо рдкреНрд░рд╛рд░рдВрднрд┐рдХ get_response рдлрд╝рдВрдХреНрд╢рди get_response рд╣реИрдВ, рдЗрд╕реЗ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, permission error рдФрд░ рд╕рд╣реА HTTP рдХреЛрдб рдореЗрдВ not found error ред рд╣рдо рд╕реВрдЪреА рд╕реЗ рд╣реА рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВред рдмрд┐рдЪреМрд▓рд┐рдпреЛрдВ рдХрд╛ рдвреЗрд░ рдмрдврд╝рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓реЗ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рднреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЗ рдПрдХ рд╣реА рдвреЗрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдХреЗрд╡рд▓ рдХреЗрдВрджреНрд░реАрдп рд░реВрдк рд╕реЗред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордиреЗ рдФрд░ рд░реИрдкрд░ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рдм рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рд╣реИред

рд╣рдо рдмрд┐рдЪреМрд▓рд┐рдпреЛрдВ рдХреЗ 7 рд╣рд▓рдХреЛрдВ рд╕реЗ рдЧреБрдЬрд░реЗ, рд╣рдорд╛рд░рд╛ рдЕрдиреБрд░реЛрдз рдмрдЪ рдЧрдпрд╛ рдФрд░ рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд░реВрдЯрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред

рд░реВрдЯрд┐рдВрдЧ


рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред рдФрд░ рдпрд╣ рд╣рд▓ рд╣реИ:

  • url рдкрд░ рдЖрдзрд╛рд░рд┐рдд;
  • WSGI рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ, рдЬрд╣рд╛рдБ request.path_info рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

 # django.core.handlers.base def _get_response(self, request): resolver = get_resolver() view, args, kwargs = resolver.resolve(request.path_info) response = view(request, *args, **kwargs) return response 

рдпреВрдЖрд░рдПрд▓


рд╣рдо рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд░реЛрдз url рдХреЛ рдЦрд┐рд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╣ рд╕реНрд╡рдпрдВ рд╣реА рд╡реНрдпреВ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рдП, рдФрд░ рдЙрд╕реА url рд╕реЗ рд╣рдореЗрдВ рд╡рд╣ рддрд░реНрдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреЗ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рджреГрд╢реНрдп рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред рддрдм get_response рдХреЙрд▓ рд╡реНрдпреВ, рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рддрд╛ рд╣реИред

 # urls.py urlpatterns = [ path('articles/2003/', views.special_case_2003), path('articles/<int:year>/', views.year_archive), path('articles/<int:year>/<int:month>/', views.month_archive) ] 

рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░


рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рджрд┐рдЦрддрд╛ рд╣реИ:

 # django.urls.resolvers _PATH_RE = re.compile( r'<(?:(?P<converter>[^>:]+):)?(?P<parameter>\w+)>' ) def resolve(self, path): for pattern in self.url_patterns: match = pattern.search(path) if match: return ResolverMatch( self.resolve(match[0]) ) raise Resolver404({'path': path}) 

рдпрд╣ рднреА regexp рд╣реИ, рд▓реЗрдХрд┐рди рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╣реИред рдпрд╣ url рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП рджреЗрдЦрддрд╛ рд╣реИ: рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдкреЛрд╕реНрдЯ, рдмреНрд▓реЙрдЧ, рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдирд╡рд░реНрдЯрд░ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрд╖ рдЬрд┐рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд░реНрдХ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИред

рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓реНрдк рд╡рд┐рдзрд┐ рдХреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рд╣рдореЗрд╢рд╛ рдЙрди рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреА рд╣реИ рдЬрд┐рдирдХреЗ рд╕рд╛рде рджреГрд╢реНрдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖ рдФрд░ рд╣рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ url рдирд╣реАрдВ рдорд┐рд▓рд╛, рддреЛ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓реАред

рдлрд┐рд░ рд╣рдо рдЕрдВрдд рдореЗрдВ рджреЗрдЦрдиреЗ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ - рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рдЬреЛ рдХреЛрдб рд▓рд┐рдЦрд╛ рдерд╛ред

рд░рд╛рдп


рдЕрдкрдиреЗ рд╕рд░рд▓рддрдо рдирд┐рд░реВрдкрдг рдореЗрдВ, рдпрд╣ рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЕрдиреБрд░реЛрдз рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрдВрджрд░ рд╣рдо рддрд╛рд░реНрдХрд┐рдХ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ: "рдпрджрд┐, рдХрд┐рд╕реА рджрд┐рди," - рддреЛ рдХрдИ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпред Django рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдЖрдзрд╛рд░рд┐рдд рджреГрд╢реНрдп рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдк рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рднреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рд╕рд╣реА рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 # django.views.generic.edit class ContactView(FormView): template_name = 'contact.html' form_class = ContactForm success_url = '/thanks/' 

рд╡рд┐рдзрд┐ рдлреНрд▓реЛрдЪрд╛рд░реНрдЯ


 self.dispatch() self.post() self.get_form() self.form_valid() self.render_to_response() 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреА dispatch рд╡рд┐рдзрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп url рдореИрдкрд┐рдВрдЧ рдореЗрдВ рд╣реИред HTTP рд╡рд░реНрдм рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдбрд┐рд╕реНрдкреИрдЪ рд╕рдордЭрддреА рд╣реИ рдХрд┐ рдХрд┐рд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ: POST рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдпрд╛ рдерд╛ рдФрд░ рд╣рдо рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдлреЙрд░реНрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рддреБрд░рдВрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдпрджрд┐ рдлреЙрд░реНрдо рд╡реИрдз рд╣реИ, рддреЛ рдЗрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рджрд┐рдЦрд╛рдПрдВред рдпрд╣ рд╕рдм рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдорд┐рд╢реНрд░рдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдмрдирд╛рддреЗ рд╣реИрдВред

рдкреНрд░рдкрддреНрд░


рдлреЙрд░реНрдо рдХреЛ рд╕реЙрдХреЗрдЯ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ Django рджреГрд╢реНрдп рдореЗрдВ рд╣реЛ - рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛ WSGI- рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рдлреЙрд░реНрдо-рдбреЗрдЯрд╛ рдПрдХ рдмрд╛рдЗрдЯ рд╕реНрдЯреНрд░реАрдо рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд╣рдо рдЗрди рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдкрддреНрд░рд╛рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рдПрдХ рдлрд╝реАрд▓реНрдб рд╣реИ, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рддреЛ рдлрд┐рд░ рд╕реЗ рдХреБрдЫ рдлрд╝реАрд▓реНрдб - рд╕рдм рдХреБрдЫ рдорд┐рд╢реНрд░рд┐рдд рд╣реИред

 Content-Type: multipart/form-data;boundary="boundary" --boundary name="field1" value1 --boundary name="field2"; value2 

рдкрд╛рд░реНрд╕рд░


рдкрд╛рд░реНрд╕рд░ рдореЗрдВ 3 рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВред

рдмрдВрдХ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реАрдбрд┐рдВрдЧ рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдЪрдВрдХ рдЗрдЯрд░реЗрдЯрд░ рдПрдХ рдЗрдЯрд░реЗрдЯрд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ boundaries рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддрд╛ boundaries ред рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреБрдЫ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕реАрдорд╛ рд╣реЛрдЧреАред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдкрд╛рд░реНрд╕рд░ рдХреЗ рдЕрдВрджрд░ рдХрдиреЗрдХреНрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рди рд╣реЛ, рд╕реЙрдХреЗрдЯ рд╕реЗ рдкрдврд╝реЗрдВ рдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рддрд░реНрдХ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рди рдкрдврд╝реЗрдВред

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЬрдирд░реЗрдЯрд░ LazyStream рдореЗрдВ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, рдЬреЛ рдлрд┐рд░ рд╕реЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реАрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рдеред рддреЛ рдкрд╛рд░реНрд╕рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╛рдЗрдЯ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдирд╕реЗ рдПрдХ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдлрд╝реАрд▓реНрдб рдФрд░ рдбреЗрдЯрд╛ рд╣рдореЗрд╢рд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд░рд╣реЗрдВрдЧреЗ ред рдпрджрд┐ рд╣рдореЗрдВ рдЖрдИрдПрд╕рдУ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдорд┐рд▓рд╛ рд╣реИ, рддреЛ Django рдлреЙрд░реНрдо (рдЬрд┐рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛), рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкред

 # django.http.multipartparser self._post = QueryDict(mutable=True) stream = LazyStream(ChunkIter(self._input_data)) for field, data in Parser(stream): self._post.append(field, force_text(data)) 

рдЖрдЧреЗ рдлреЙрд░реНрдо, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЦреБрдж рдХреЛ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ Django ORM рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

ORM


ORM рдХреЗ рд▓рд┐рдП рдРрд╕реЗ DSL рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рдЧрднрдЧ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 # models.py Entry.objects.exclude( pub_date__gt=date(2005, 1, 3), headline='Hello', ) 

рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕рдорд╛рди рдПрд╕рдХреНрдпреВрдПрд▓ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 SELECT * WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello') 

рдпрд╣ рдХреИрд╕рд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ?

рдХреНрд╡реЗрд░реАрд╕рдореВрд╣


exclude рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдПрдХ Query рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ SQL рдХреНрд╡реЗрд░реА рдХреЗ рдПрдХ рдЕрд▓рдЧ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдЦреБрдж рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред

рдЬрдм рдкреЗрдбрд╝ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрднрд╛рдЧ рдЕрдкрдиреЗ рдмрдЪреНрдЪреЗ рдХреЗ рдиреЛрдбреНрд╕ рдХреЛ рдкреНрд░рджреВрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдиреЗрд╕реНрдЯреЗрдб рдПрд╕рдХреНрдпреВрдПрд▓ рдХреНрд╡реЗрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдПрд╕рдХреНрдпреВрдПрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдПрдХ рдЕрд▓рдЧ SQL рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдореВрд▓реНрдп-рдорд╛рди рд╕реЗ рдХреА рдЬрд╛рдПрдЧреАред рдПрдХ рд╕рдореВрд╣ рдХреЗ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЛ рдбрд╛рд▓реА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЗ рд▓рд┐рдП рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╡реГрдХреНрд╖ рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рдФрд░ рдЗрдирдХрд╛рд░ рдХрд░рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

 # django.db.models.query sql.Query(Entry).where.add( ~Q( Q(F('pub_date') > date(2005, 1, 3)) & Q(headline='Hello') ) ) 

рд╕рдВрдХрд▓рдХ


 # django.db.models.expressions class Q(tree.Node): AND = 'AND' OR = 'OR' def as_sql(self, compiler, connection): return self.template % self.field.get_lookup('gt') 

рдЙрддреНрдкрд╛рджрди


 >>> Q(headline='Hello') # headline = 'Hello' >>> F('pub_date') # pub_date >>> F('pub_date') > date(2005, 1, 3) # pub_date > '2005-1-3' >>> Q(...) & Q(...) # ... AND ... >>> ~Q(...) # NOT тАж 

рдПрдХ рдЫреЛрдЯрд╛ рд╣реЗрд▓реНрдкрд░-рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬреЗрдХреНрдпреВрдПрд▓ рд╕реЗ MySQL рдмреЛрд▓реА рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рдмреЛрд▓реА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

DB рд░реВрдЯрд┐рдВрдЧ


рдЬрдм рд╣рдо SQL рдХреНрд╡реЗрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореЙрдбрд▓ DB рд░реВрдЯрд┐рдВрдЧ рдкрд░ рджрд╕реНрддрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рдкреВрдЫрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╣реИред 99% рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реЛрдЧрд╛, рд╢реЗрд╖ 1% рдореЗрдВ - рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдкрдирд╛ред

 # django.db.utils class ConnectionRouter: def db_for_read(self, model, **hints): if model._meta.app_label == 'auth': return 'auth_db' 

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд▓рд╛рдпрдмреНрд░реЗрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдЬреИрд╕реЗ рдХрд┐ рдкрд╛рдпрдерди MySQL рдпрд╛ Psycopg2 рд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд░реИрдк рдХрд░рдирд╛, рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ Django рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣рд╛рдБ рдХрд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИ, рд▓реЗрдирджреЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИред

рдХрдиреЗрдХреНрдЯрд┐рдВрдЧ рдкреВрд▓


 # django.db.backends.base.base class BaseDatabaseWrapper: def commit(self): self.validate_thread_sharing() self.validate_no_atomic_block() with self.wrap_database_errors: return self.connection.commit() 

рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдХрдиреЗрдХреНрд╢рди рдореЗрдВ, рд╣рдо рд╕реЙрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрддреЗ рд╣реИрдВ рдЬреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрд░ рджрд╕реНрддрдХ рджреЗ рд░рд╣рд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓рд╛рдпрдмреНрд░реЗрд░реА рдХреЗ рд░реИрдкрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╡ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрдврд╝реЗрдВрдЧреЗ, рдФрд░ Django рдкрд╛рдпрдерди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЗрд╕ рдбреЗрдЯрд╛ рд╕реЗ рдореЙрдбрд▓ рдЙрджрд╛рд╣рд░рдг рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдирд╣реАрдВ рд╣реИред

рд╣рдордиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрд╛, рдХреБрдЫ рдкрдврд╝рд╛, рдФрд░ HTML рдкреГрд╖реНрда рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Django рдореЗрдВ рдПрдХ рд╕рдореБрджрд╛рдп-рдирд╛рдкрд╕рдВрдж рдЯреЗрдореНрдкрд▓реЗрдЯ рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреА рддрд░рд╣ рдХреБрдЫ рджрд┐рдЦрддреА рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ HTML рдлрд╝рд╛рдЗрд▓ рдореЗрдВред

рдЦрд╛рдХрд╛


 from django.template.loader import render_to_string render_to_string('my_template.html', {'entries': ...}) 

рдХреЛрдб


 <ul> {% for entry in entries %} <li>{{ entry.name }}</li> {% endfor %} </ul> 

рдкрд╛рд░реНрд╕рд░


 # django.template.base BLOCK_TAG_START = '{%' BLOCK_TAG_END = '%}' VARIABLE_TAG_START = '{{' VARIABLE_TAG_END = '}}' COMMENT_TAG_START = '{#' COMMENT_TAG_END = '#}' tag_re = (re.compile('(%s.*?%s|%s.*?%s|%s.*?%s)' % (re.escape(BLOCK_TAG_START), re.escape(BLOCK_TAG_END), re.escape(VARIABLE_TAG_START), re.escape(VARIABLE_TAG_END), re.escape(COMMENT_TAG_START), re.escape(COMMENT_TAG_END)))) 

рдЖрд╢реНрдЪрд░реНрдп - рдкреБрди: rexxpред рдХреЗрд╡рд▓ рдЕрдВрдд рдореЗрдВ рдПрдХ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕реВрдЪреА рдмрд╣реБрдд рдиреАрдЪреЗ рдЬрд╛рдПрдЧреАред рдпрд╣ рд╢рд╛рдпрдж рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╕рдмрд╕реЗ рдХрдард┐рди regexp рд╣реИред

lexer


рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИрдВрдбрд▓рд░ рдФрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВред рдПрдХ рд▓реЗрдХреНрд╕рд░ рд╣реИ рдЬреЛ рдкрд╛рда рдХреЛ рдЫреЛрдЯреЗ рдЯреЛрдХрди рдХреА рд╕реВрдЪреА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП regexp рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

 # django.template.base def tokenize(self): for bit in tag_re.split(template_string): lineno += bit.count('\n') yield bit 

рд╣рдо рдЯреЛрдХрди рдХреА рд╕реВрдЪреА рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рддреЗ рд╣реИрдВ, рджреЗрдЦреЛ: тАЬрддреБрдо рдХреМрди рд╣реЛ? рдЖрдкрдХреЛ рдПрдХ рдЯреИрдЧ рдиреЛрдб рдореЗрдВ рд▓рдкреЗрдЯреЗрдВред " рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдпрд╣ рдХреБрдЫ рдХреА рд╢реБрд░реБрдЖрдд рд╣реИ, if рдпрд╛ рдЙрд╕рдХреЗ for , рдЯреИрдЧ рд╣реИрдВрдбрд▓рд░ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВрдбрд▓рд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред рд╣реИрдВрдбрд▓рд░ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд╛рд░реНрд╕рд░ рдмрддрд╛рддрд╛ рд╣реИ: "рдореБрдЭреЗ рд╕рдорд╛рдкрди рдЯреИрдЧ рдХреЗ рдиреАрдЪреЗ рдЯреЛрдХрди рдХреА рдПрдХ рд╕реВрдЪреА рдкрдврд╝реЗрдВред"

рдСрдкрд░реЗрд╢рди рдлрд┐рд░ рд╕реЗ рдкрд╛рд░реНрд╕рд░ рдХреЗ рдкрд╛рд╕ рдЬрд╛рддрд╛ рд╣реИред

рдиреЛрдб, рдЯреИрдЧ рдФрд░ рдкрд╛рд░реНрд╕рд░ рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЪреАрдЬреЗрдВ рд╣реИрдВ, рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдЖрдорддреМрд░ рдкрд░ рдЯреИрдЧ рджреНрд╡рд╛рд░рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддреА рд╣реИред

рдкрд╛рд░реНрд╕рд░


 def parse(): while tokens: token = tokens.pop() if token.startswith(BLOCK_TAG_START): yield TagNode(token) elif token.startswith(VARIABLE_TAG_START): ... 

рдЯреИрдЧ рд╣реИрдВрдбрд▓рд░ рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЛрдб рджреЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реВрдк рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП render рд╡рд┐рдзрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

рдкрд╛рд╢ рдХреЗ рд▓рд┐рдП


 # django.template.defaulttags @register.tag('for') def do_for(parser, token): args = token.split_contents() body = parser.parse(until=['endfor']) return ForNode(args, body) 

рдиреЛрдб рдХреЗ рд▓рд┐рдП


 class ForNode(Node): def render(self, context): with context.push(): for i in self.args: yield self.body.render(context) 

render рд╡рд┐рдзрд┐ рдПрдХ рд░реЗрдВрдбрд░ рдЯреНрд░реА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдКрдкрд░реА рдиреЛрдб рдПрдХ рдмреЗрдЯреА рдиреЛрдб рдкрд░ рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЙрд╕реЗ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреА рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдХреБрдЫ рдЪрд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ context рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ context - рдЗрд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рд╣рдо рдПрдХ рдЯреИрдЧ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдЧреБрдВрдЬрд╛рдЗрд╢ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХрд╛ рдПрдХ рдвреЗрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ context рд╕реНрд╡рдпрдВ рд▓реВрдк рдХреЗ for рдХреБрдЫ рдЕрдиреНрдп рдЯреИрдЧ рдХреЛ рдмрджрд▓ for рд╣реИ, рддреЛ рдЬрдм рд╣рдо рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ рддреЛ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВрдЧреЗред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рд╕рдм рдХреБрдЫ рд╡реИрд╢реНрд╡рд┐рдХ рд╣реИ, рддреЛ рдХрд╛рдо рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛


рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдПрдЪрдЯреАрдЯреАрдкреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рд▓рд╛рдЗрди рдорд┐рд▓реА:

рдирдорд╕реНрддреЗ рд╡рд┐рд╢реНрд╡!

рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓рд╛рдЗрди рджреЗ рд╕рдХрддреЗ рд╣реИрдВред

  • рдЗрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреГрд╢реНрдп рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░реЗрдВред
  • рд╕реВрдЪрд┐рдпреЛрдВ рдордзреНрдпрд╡рд╛рд░ рджреЗрдЦреЗрдВред
  • Middlewares рдЗрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд, рдкреВрд░рдХ рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛рддрд╛ рд╣реИред
  • WSGIHandler рдХреЗ рдЕрдВрджрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛрдиреЗ рд▓рдЧрддреА рд╣реИ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕реЙрдХреЗрдЯ рдХреЛ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИред

рд╕рднреА рдкреНрд░рд╕рд┐рджреНрдз рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдЬреЛ рдХрд┐ Django рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдереЗ, рдЬреИрд╕реЗ рдХрд┐ Bitbucket рдпрд╛ Instagram, рдиреЗ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬреЛ рдХрд┐ рд╣рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛ред

рдпрд╣ рд╕рдм, рдФрд░ рдореЙрд╕реНрдХреЛ рдкрд╛рдпрдерди рдХреЙрдиреНрдл ++ рдореЗрдВ рдПрдХ рдкреНрд░рд╕реНрддреБрддрд┐, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдХрд┐рд╕реА рднреА рдЬрд╛рджреВ рдореЗрдВ, рд░реЗрдЧреЗрдХреНрд╕рдк рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рдЦрд╛рдирд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

5 рдЕрдкреНрд░реИрд▓ рдХреЛ рдЖрд░реНрдЯреАрдо рдорд╛рд▓рд┐рд╢реЗрд╡ рдФрд░ 23 рдЕрдиреНрдп рдорд╣рд╛рди рд╡рдХреНрддрд╛ рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдорд╛рд╕реНрдХреЛ рдкрд╛рдпрдерди рдХреЙрдиреНрдл ++ рд╕рдореНрдореЗрд▓рди рдореЗрдВ рдкрд╛рдпрдерди рд╡рд┐рд╖рдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдФрд░ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рднреЛрдЬрди рджреЗрдВрдЧреЗред рдЕрдиреБрд╕реВрдЪреА рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ рдФрд░ рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдЕрдиреБрднрд╡ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВред

Source: https://habr.com/ru/post/hi433482/


All Articles