{"id":339514,"date":"2022-10-11T03:00:10","date_gmt":"2022-10-11T03:00:10","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=339514"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=339514","title":{"rendered":"<span>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Django<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0412 \u0445\u043e\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043b\u0435\u0442 \u043c\u043e\u0435\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 Django \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u043d\u043e \u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435.<\/p>\n<p><a href=\"#arch\" rel=\"noopener noreferrer nofollow\">\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u0445\u0435\u043c\u0443(\u043f.8), \u043a\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0445\u0435\u043c\u0430 \u0431\u0435\u0437 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439.<\/a><\/p>\n<h3>1. Poetry &#8212; \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438<\/h3>\n<pre><code class=\"bash\">$ poetry new maindir $ tree maindir maindir\/ \u251c\u2500\u2500 maindir \u2502\u00a0\u00a0 \u2514\u2500\u2500 init.py \u251c\u2500\u2500 pyproject.toml \u251c\u2500\u2500 README.rst \u2514\u2500\u2500 tests \u251c\u2500\u2500 init.py \u2514\u2500\u2500 test_maindir.py<\/code><\/pre>\n<p>&#171;Maindir&#187; \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0430 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<h3>2. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 Django<\/h3>\n<pre><code class=\"bash\">$ poetry shell $ poetry add django<\/code><\/pre>\n<h3>3. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Django<\/h3>\n<h4>3.1 \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e maindir to src<\/h4>\n<pre><code class=\"bash\">$ cd maindir ~\/maindir $ mv maindir src $ cd src<\/code><\/pre>\n<h4>3.2 \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 Django \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043f\u043a\u0438 src<\/h4>\n<pre><code class=\"django\">~\/maindir\/src $ django-admin startproject config .<\/code><\/pre>\n<h4>3.3 \u0423\u0434\u0430\u043b\u044f\u0435\u043c tests\/ \u0438 README.rst<\/h4>\n<p>\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<pre><code class=\"bash\">$tree maindir maindir\/ \u251c\u2500\u2500 poetry.lock \u251c\u2500\u2500 pyproject.toml \u2514\u2500\u2500 src \u251c\u2500\u2500 config \u2502\u00a0\u00a0 \u251c\u2500\u2500 asgi.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 init.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 settings.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 urls.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 wsgi.py \u251c\u2500\u2500 init.py \u2514\u2500\u2500 manage.py<\/code><\/pre>\n<h3>4. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Git<\/h3>\n<pre><code class=\"bash\">$ git init $ touch .gitignore $ touch README.md<\/code><\/pre>\n<h3>5. \u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433<\/h3>\n<pre><code>maindir\/ \u251c\u2500\u2500 .git \u2502\u00a0\u00a0 \u251c\u2500\u2500 ... \u251c\u2500\u2500 .gitignore \u251c\u2500\u2500 poetry.lock \u251c\u2500\u2500 pyproject.toml \u251c\u2500\u2500 README.md \u2514\u2500\u2500 src \u251c\u2500\u2500 config \u2502\u00a0\u00a0 \u251c\u2500\u2500 asgi.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 init.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 settings.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 urls.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 wsgi.py \u251c\u2500\u2500 init.py \u2514\u2500\u2500 manage.py<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 Django \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 src.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0441 <strong><em>src\/<\/em><\/strong>, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <em>maindir): <\/em>\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, .gitignore, Dockerfile, deploy\/, setup.cfg, poetry.lock \u0438 \u0442.\u0434.<\/p>\n<h3>6. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 PyCharm<\/h3>\n<p><em>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 PyCharm, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/em><\/p>\n<p>6.1 \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432 PyCharm \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <em>maindir<br \/><\/em>6.2 \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435. <br \/>    6.2.1 \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0445\u043e\u0434\u0438\u043c File\/Settings\/Project: maindir\/Python Interpreter<br \/>    6.2.2 \u0416\u043c\u0435\u043c &#171;add interpreter&#187;, \u0434\u0430\u043b\u0435\u0435 &#171;add local interpreter&#187;, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Poetry Environment, \u0434\u0430\u043b\u0435\u0435 Existing Environment  \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430\u0448\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 \u043f\u0443\u0442\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0432 1-2 \u043f\u0443\u043d\u043a\u0442\u0430\u0445.<br \/>6.3 \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c PyCharm \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c Django (File\/Settings\/Languages &amp; Frameworks)<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4b6\/071\/bf6\/4b6071bf689670e8896751111e687261.png\" alt=\"\" title=\"\" width=\"1109\" height=\"628\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4b6\/071\/bf6\/4b6071bf689670e8896751111e687261.png\"\/><figcaption><\/figcaption><\/figure>\n<p>6.4 \u041f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e  <strong><em>src\/<\/em><\/strong> \u043a\u0430\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u043d\u0443\u044e, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043f\u043e src, \u043d\u0430\u0432\u043e\u0434\u0438\u043c \u0432 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u043e\u043a\u043d\u0435 &#171;Mark Directory as&#187;  \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Sources Root.<\/p>\n<h2>7. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Django<\/h2>\n<h4>7.1 APPS\/<\/h4>\n<pre><code class=\"bash\">~\/maindir\/src $ mkdir apps $ touch apps\/__init__.py<\/code><\/pre>\n<p><em>\u0418\u043b\u0438 \u0432 PyCharm \u043a\u043b\u0438\u043a\u0430\u0435\u0442\u0435 \u043f\u043e src, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0435 New, \u0434\u0430\u043b\u0435\u0435 Python Package.<br \/>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c.<\/em><\/p>\n<p>\u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0432\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f django \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <strong>apps\/<\/strong>.<br \/>\u0427\u0442\u043e\u0431\u044b django \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437 <strong>apps\/<\/strong><em>, <\/em>\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <em>payment<\/em> \u0432\u043d\u0443\u0442\u0440\u0438 <strong>apps\/<\/strong> \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c:<\/p>\n<pre><code class=\"bash\">~\/maindir\/src $ mkdir apps\/payment $ .\/manage.py startapp payment apps\/payment $ tree  \u251c\u2500\u2500 apps \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 payment \u2502\u00a0\u00a0     \u251c\u2500\u2500 admin.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 apps.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 migrations \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 models.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 tests.py \u2502\u00a0\u00a0     \u2514\u2500\u2500 views.py \u251c\u2500\u2500 config ...<\/code><\/pre>\n<p>\u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b apps\/payment\/apps.py \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/157\/5d0\/b28\/1575d0b28968065994656822d8cf47f4.png\" width=\"610\" height=\"209\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/157\/5d0\/b28\/1575d0b28968065994656822d8cf47f4.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 config\/settings.py<\/p>\n<pre><code class=\"python\">...  INSTALLED_APPS = [     'django.contrib.admin',     'django.contrib.auth',     'django.contrib.contenttypes',     'django.contrib.sessions',     'django.contrib.messages',     'django.contrib.staticfiles',     'apps.payment.apps.PaymentConfig' ]  ...<\/code><\/pre>\n<h4>7.2 API\/<\/h4>\n<p>\u0412\u0441\u0435 views.py \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043c\u0435\u043b\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c apps\/payment\/views.py<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 <strong><em>api\/<\/em><\/strong> \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0432\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <strong><em>auth\/<\/em><\/strong> \u0438 <strong>v1\/<\/strong><\/p>\n<p><strong><em>auth\/<\/em><\/strong>  &#8212; \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0435\u043b\u0430\u044e \u0441\u0432\u043e\u044e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u0441\u044f\u043a\u0438\u0435 permissions \u0434\u043b\u044f \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 API \u0438 \u0442.\u0434.<\/p>\n<p><strong>v1\/<\/strong> &#8212; \u0432\u0435\u0440\u0441\u0438\u044f API, \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 (python package, \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 apps), \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f views.py<\/p>\n<h4>7.3 UTILS\/<\/h4>\n<p>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<p>\u0412 \u044d\u0442\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u043e\u0439 \u0438\u043c\u043f\u043e\u0440\u0442 \u0438\u0437  <strong><em>api\/<\/em> <\/strong>\u0438<em> <\/em><strong>apps\/<\/strong>,<strong> <\/strong>\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<h4>7.4 LIBRARY\/<\/h4>\n<p>\u041a\u043e\u0434 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 API, \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0438 \u0442.\u0434.<\/p>\n<p>\u0412 \u044d\u0442\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u043e\u0439 \u0438\u043c\u043f\u043e\u0440\u0442 \u0438\u0437  <strong><em>api\/<\/em> <\/strong>\u0438<em> <\/em><strong>apps\/<\/strong>,<strong> <\/strong>\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u0440\u043e\u043c\u0435 <strong><em>utils\/<\/em><\/strong>.<\/p>\n<h4>7.5 WORKERS\/<\/h4>\n<p>\u0417\u0430\u0434\u0430\u043d\u0438\u044f \u0434\u043b\u044f Celery<\/p>\n<h3>8 \u0418\u0442\u043e\u0433\u043e: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Django<\/h3>\n<p><a class=\"anchor\" name=\"arch\" id=\"arch\"><\/a><\/p>\n<pre><code>\u251c\u2500\u2500 api \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 auth \u2502\u00a0\u00a0 \u2502   \u251c\u2500\u2500 auth.py \u2502\u00a0\u00a0 \u2502   \u2514\u2500\u2500 permissions.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 v1 \u2502\u00a0\u00a0     \u251c\u2500\u2500 payment \u2502\u00a0\u00a0     \u2502    \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0     \u2502    \u2514\u2500\u2500 views.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0     \u2514\u2500\u2500 urls.py  \u251c\u2500\u2500 apps \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 payment \u2502\u00a0\u00a0     \u251c\u2500\u2500 admin.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 apps.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 migrations \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 models.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 tests.py \u2502\u00a0\u00a0     \u2514\u2500\u2500 views.py \u251c\u2500\u2500 config \u2502\u00a0\u00a0 \u251c\u2500\u2500 asgi.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 __pycache__ \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500... \u2502\u00a0\u00a0 \u251c\u2500\u2500 settings.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 urls.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 wsgi.py \u251c\u2500\u2500 library \u2502\u00a0\u00a0 \u251c\u2500\u2500 youtube \u2502   \u2502   \u251c\u2500\u2500 __init__.py \u2502   \u2502   \u251c\u2500\u2500 videos.py \u2502\u00a0\u00a0 \u2502   \u2514\u2500\u2500 ... \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 ... \u251c\u2500\u2500 utils \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 numbers.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 ... \u251c\u2500\u2500 workers \u2502\u00a0\u00a0 \u251c\u2500\u2500 payment \u2502   \u2502   \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u2502   \u2514\u2500\u2500 tasks.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 ... \u251c\u2500\u2500 __init__.py \u2514\u2500\u2500 manage.py <\/code><\/pre>\n<h2>P.S.<\/h2>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044f \u0435\u0449\u0435 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u044e <strong><em>config\/<\/em><\/strong>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <strong><em>apps\/<\/em><\/strong>, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/692518\/\"> https:\/\/habr.com\/ru\/post\/692518\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0412 \u0445\u043e\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043b\u0435\u0442 \u043c\u043e\u0435\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 Django \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043e\u043d\u0438 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u043d\u043e \u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435.<\/p>\n<p><a href=\"#arch\" rel=\"noopener noreferrer nofollow\">\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u0445\u0435\u043c\u0443(\u043f.8), \u043a\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0445\u0435\u043c\u0430 \u0431\u0435\u0437 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439.<\/a><\/p>\n<h3>1. Poetry &#8212; \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438<\/h3>\n<pre><code class=\"bash\">$ poetry new maindir $ tree maindir maindir\/ \u251c\u2500\u2500 maindir \u2502\u00a0\u00a0 \u2514\u2500\u2500 init.py \u251c\u2500\u2500 pyproject.toml \u251c\u2500\u2500 README.rst \u2514\u2500\u2500 tests \u251c\u2500\u2500 init.py \u2514\u2500\u2500 test_maindir.py<\/code><\/pre>\n<p>&#171;Maindir&#187; \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0430 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u0443 \u0432\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<h3>2. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 Django<\/h3>\n<pre><code class=\"bash\">$ poetry shell $ poetry add django<\/code><\/pre>\n<h3>3. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Django<\/h3>\n<h4>3.1 \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044e\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e maindir to src<\/h4>\n<pre><code class=\"bash\">$ cd maindir ~\/maindir $ mv maindir src $ cd src<\/code><\/pre>\n<h4>3.2 \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 Django \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0430\u043f\u043a\u0438 src<\/h4>\n<pre><code class=\"django\">~\/maindir\/src $ django-admin startproject config .<\/code><\/pre>\n<h4>3.3 \u0423\u0434\u0430\u043b\u044f\u0435\u043c tests\/ \u0438 README.rst<\/h4>\n<p>\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c:<\/p>\n<pre><code class=\"bash\">$tree maindir maindir\/ \u251c\u2500\u2500 poetry.lock \u251c\u2500\u2500 pyproject.toml \u2514\u2500\u2500 src \u251c\u2500\u2500 config \u2502\u00a0\u00a0 \u251c\u2500\u2500 asgi.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 init.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 settings.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 urls.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 wsgi.py \u251c\u2500\u2500 init.py \u2514\u2500\u2500 manage.py<\/code><\/pre>\n<h3>4. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Git<\/h3>\n<pre><code class=\"bash\">$ git init $ touch .gitignore $ touch README.md<\/code><\/pre>\n<h3>5. \u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0438\u0442\u043e\u0433<\/h3>\n<pre><code>maindir\/ \u251c\u2500\u2500 .git \u2502\u00a0\u00a0 \u251c\u2500\u2500 ... \u251c\u2500\u2500 .gitignore \u251c\u2500\u2500 poetry.lock \u251c\u2500\u2500 pyproject.toml \u251c\u2500\u2500 README.md \u2514\u2500\u2500 src \u251c\u2500\u2500 config \u2502\u00a0\u00a0 \u251c\u2500\u2500 asgi.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 init.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 settings.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 urls.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 wsgi.py \u251c\u2500\u2500 init.py \u2514\u2500\u2500 manage.py<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 Django \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 src.<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0441 <strong><em>src\/<\/em><\/strong>, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 <em>maindir): <\/em>\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, .gitignore, Dockerfile, deploy\/, setup.cfg, poetry.lock \u0438 \u0442.\u0434.<\/p>\n<h3>6. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 PyCharm<\/h3>\n<p><em>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 PyCharm, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/em><\/p>\n<p>6.1 \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432 PyCharm \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <em>maindir<br \/><\/em>6.2 \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435. <br \/>    6.2.1 \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0445\u043e\u0434\u0438\u043c File\/Settings\/Project: maindir\/Python Interpreter<br \/>    6.2.2 \u0416\u043c\u0435\u043c &#171;add interpreter&#187;, \u0434\u0430\u043b\u0435\u0435 &#171;add local interpreter&#187;, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Poetry Environment, \u0434\u0430\u043b\u0435\u0435 Existing Environment  \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043d\u0430\u0448\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 \u043f\u0443\u0442\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u0432 1-2 \u043f\u0443\u043d\u043a\u0442\u0430\u0445.<br \/>6.3 \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c PyCharm \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c Django (File\/Settings\/Languages &amp; Frameworks)<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>6.4 \u041f\u043e\u043c\u0435\u0447\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e  <strong><em>src\/<\/em><\/strong> \u043a\u0430\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u043d\u0443\u044e, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u043c\u044b\u0448\u0438 \u043a\u043b\u0438\u043a\u0430\u0435\u043c \u043f\u043e src, \u043d\u0430\u0432\u043e\u0434\u0438\u043c \u0432 \u043f\u043e\u044f\u0432\u0438\u0432\u0448\u0435\u043c\u0441\u044f \u043e\u043a\u043d\u0435 &#171;Mark Directory as&#187;  \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c Sources Root.<\/p>\n<h2>7. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Django<\/h2>\n<h4>7.1 APPS\/<\/h4>\n<pre><code class=\"bash\">~\/maindir\/src $ mkdir apps $ touch apps\/__init__.py<\/code><\/pre>\n<p><em>\u0418\u043b\u0438 \u0432 PyCharm \u043a\u043b\u0438\u043a\u0430\u0435\u0442\u0435 \u043f\u043e src, \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0435 New, \u0434\u0430\u043b\u0435\u0435 Python Package.<br \/>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c.<\/em><\/p>\n<p>\u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0432\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f django \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <strong>apps\/<\/strong>.<br \/>\u0427\u0442\u043e\u0431\u044b django \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u043e \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0437 <strong>apps\/<\/strong><em>, <\/em>\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <em>payment<\/em> \u0432\u043d\u0443\u0442\u0440\u0438 <strong>apps\/<\/strong> \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c:<\/p>\n<pre><code class=\"bash\">~\/maindir\/src $ mkdir apps\/payment $ .\/manage.py startapp payment apps\/payment $ tree  \u251c\u2500\u2500 apps \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 payment \u2502\u00a0\u00a0     \u251c\u2500\u2500 admin.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 apps.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 migrations \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 models.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 tests.py \u2502\u00a0\u00a0     \u2514\u2500\u2500 views.py \u251c\u2500\u2500 config ...<\/code><\/pre>\n<p>\u041e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b apps\/payment\/apps.py \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 config\/settings.py<\/p>\n<pre><code class=\"python\">...  INSTALLED_APPS = [     'django.contrib.admin',     'django.contrib.auth',     'django.contrib.contenttypes',     'django.contrib.sessions',     'django.contrib.messages',     'django.contrib.staticfiles',     'apps.payment.apps.PaymentConfig' ]  ...<\/code><\/pre>\n<h4>7.2 API\/<\/h4>\n<p>\u0412\u0441\u0435 views.py \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043c\u0435\u043b\u043e \u0443\u0434\u0430\u043b\u044f\u0435\u043c apps\/payment\/views.py<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 <strong><em>api\/<\/em><\/strong> \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0432\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <strong><em>auth\/<\/em><\/strong> \u0438 <strong>v1\/<\/strong><\/p>\n<p><strong><em>auth\/<\/em><\/strong>  &#8212; \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0435\u043b\u0430\u044e \u0441\u0432\u043e\u044e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443), \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u0441\u044f\u043a\u0438\u0435 permissions \u0434\u043b\u044f \u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u043e\u0432 API \u0438 \u0442.\u0434.<\/p>\n<p><strong>v1\/<\/strong> &#8212; \u0432\u0435\u0440\u0441\u0438\u044f API, \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 (python package, \u0442\u043e\u0436\u0434\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 apps), \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f views.py<\/p>\n<h4>7.3 UTILS\/<\/h4>\n<p>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<p>\u0412 \u044d\u0442\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u043e\u0439 \u0438\u043c\u043f\u043e\u0440\u0442 \u0438\u0437  <strong><em>api\/<\/em> <\/strong>\u0438<em> <\/em><strong>apps\/<\/strong>,<strong> <\/strong>\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<h4>7.4 LIBRARY\/<\/h4>\n<p>\u041a\u043e\u0434 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 API, \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0438 \u0442.\u0434.<\/p>\n<p>\u0412 \u044d\u0442\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u043e\u0439 \u0438\u043c\u043f\u043e\u0440\u0442 \u0438\u0437  <strong><em>api\/<\/em> <\/strong>\u0438<em> <\/em><strong>apps\/<\/strong>,<strong> <\/strong>\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u0440\u043e\u043c\u0435 <strong><em>utils\/<\/em><\/strong>.<\/p>\n<h4>7.5 WORKERS\/<\/h4>\n<p>\u0417\u0430\u0434\u0430\u043d\u0438\u044f \u0434\u043b\u044f Celery<\/p>\n<h3>8 \u0418\u0442\u043e\u0433\u043e: \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Django<\/h3>\n<p><a class=\"anchor\" name=\"arch\" id=\"arch\"><\/a><\/p>\n<pre><code>\u251c\u2500\u2500 api \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 auth \u2502\u00a0\u00a0 \u2502   \u251c\u2500\u2500 auth.py \u2502\u00a0\u00a0 \u2502   \u2514\u2500\u2500 permissions.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 v1 \u2502\u00a0\u00a0     \u251c\u2500\u2500 payment \u2502\u00a0\u00a0     \u2502    \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0     \u2502    \u2514\u2500\u2500 views.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0     \u2514\u2500\u2500 urls.py  \u251c\u2500\u2500 apps \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 payment \u2502\u00a0\u00a0     \u251c\u2500\u2500 admin.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 apps.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 migrations \u2502\u00a0\u00a0     \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 models.py \u2502\u00a0\u00a0     \u251c\u2500\u2500 tests.py \u2502\u00a0\u00a0     \u2514\u2500\u2500 views.py \u251c\u2500\u2500 config \u2502\u00a0\u00a0 \u251c\u2500\u2500 asgi.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 __pycache__ \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500... \u2502\u00a0\u00a0 \u251c\u2500\u2500 settings.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 urls.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 wsgi.py \u251c\u2500\u2500 library \u2502\u00a0\u00a0 \u251c\u2500\u2500 youtube \u2502   \u2502   \u251c\u2500\u2500 __init__.py \u2502   \u2502   \u251c\u2500\u2500 videos.py \u2502\u00a0\u00a0 \u2502   \u2514\u2500\u2500 ... \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 ... \u251c\u2500\u2500 utils \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 numbers.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 ... \u251c\u2500\u2500 workers \u2502\u00a0\u00a0 \u251c\u2500\u2500 payment \u2502   \u2502   \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u2502   \u2514\u2500\u2500 tasks.py \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py \u2502\u00a0\u00a0 \u2514\u2500\u2500 ... \u251c\u2500\u2500 __init__.py \u2514\u2500\u2500 manage.py <\/code><\/pre>\n<h2>P.S.<\/h2>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u044f \u0435\u0449\u0435 \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u044e <strong><em>config\/<\/em><\/strong>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <strong><em>apps\/<\/em><\/strong>, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/692518\/\"> https:\/\/habr.com\/ru\/post\/692518\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-339514","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/339514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=339514"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/339514\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=339514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=339514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=339514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}