Dummy WSGI Framework
Dummy WSGI Framework - ΡΡΠΎ WSGI-ΡΡΠ΅ΠΉΠΌΠΎΡΠΊ Π΄Π»Ρ Π²Π°ΡΠΈΡ ΠΠ΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΎΡΠ½ΠΎΠ²Π° Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ WSGI-ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°, ΠΎΠ½ "ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΠΈΠΉ" ΠΈ "Π³Π»ΡΠΏΠ΅Π½ΡΠΊΠΈΠΉ" (Ρ ΠΎΡΡ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΎΠ½ Π½Π΅ ΡΠ°ΠΊ ΡΠΆ "ΠΏΡΠΎΡΡ" ΠΈ "Π³Π»ΡΠΏ", ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ Π½Π° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄), ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½ ΠΊΠ°ΠΊ Just4Fun-ΠΏΡΠΎΠ΅ΠΊΡ.
Dummy WSGI Framework ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· "ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ²" ΠΈ "ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ", ΠΊΠ°ΠΊ ΠΏΠ°ΡΡΠ΅ΡΠ½ "Model-View-Controller", Π½ΠΎ Π±Π΅Π· "Model".
ΠΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡΠΌΠΈ, Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΡΠΌΠΈ Π²Π½ΡΡΡΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π³ΡΡΠΆΠ°Π΅ΠΌΡΠΌΠΈ ΠΈΠ· ΡΠ°ΠΉΠ»ΠΎΠ², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π±Π°Π·ΠΎΠ²ΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ HTML-ΡΠ°ΠΉΠ»Ρ.
Dummy WSGI Framework ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌ:
- Π² ΡΠΈΠ»Ρ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ WSGI-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΠΎΠ³ΠΎ Π½Π° Π΅Π³ΠΎ (ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°) ΠΎΡΠ½ΠΎΠ²Π΅;
- Π² ΡΠΈΠ»Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΡ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΠΎΠ² Π·Π° ΡΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π² ΡΠ΄ΡΠ΅ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ;
- ΠΈ, Π² ΠΊΠΎΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ², ΡΡΠΎ ΠΆΠ΅ Python, ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΡΠ·ΠΎΠ²Π°ΡΡ Dummy WSGI Framework. Π‘ΡΡΠ»Π°ΡΡΡΡ Π½Π° ΡΠ°ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΠ°ΠΌΠΈ Dummy WSGI Framework Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π½ΠΎ ΠΌΠ½Π΅ Π±Ρ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΎΡΠ·ΡΠ², Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ ΠΈ Π½Π΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΉ.
ΠΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ
- Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
- Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
- Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
-
ΠΡΠΈΠΌΠ΅ΡΡ
- ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ²
- ΠΡΠΈΠΌΠ΅Ρ 'ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π±Π°Π·ΠΎΠ²ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°'
- ΠΡΠΈΠΌΠ΅Ρ 'ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ Π΄Π²ΡΠΌΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΌΠΈ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ (Basic access authentication)'
- ΠΡΠΈΠΌΠ΅Ρ 'ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΎΡΠ°Π±ΠΎΡΠΊΠΎΠΉ Π΄ΠΎΠΏΡΡΠ΅Π½Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²'
- ΠΠΈΡΠ΅Π½Π·ΠΈΡ
- ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²Π΅ΡΡΠΈΡ Python 3.4
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
Dummy WSGI Framework Π²ΠΊΠ»ΡΡΠ΅Π½ Π² ΡΠ΅Π΅ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² PyPI (Python Package Index) - https://pypi.org/project/dummy_wsgi_framework/
ΠΠ³ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ pip
$ pip install dummy_wsgi_framework
ΠΠ»ΠΈ ΠΈΠ½ΡΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ (ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄Π»Ρ OS Debian):
$ cd <your_project_dir>
$ git clone git://github.com/BorisPlus/dummy_wsgi_framework.git
ΠΈΠ»ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ Π΄Π»Ρ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΡ master-Π²Π΅ΡΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° Zip (ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄Π»Ρ OS Debian):
$ wget https://github.com/BorisPlus/dummy_wsgi_framework/archive/master.zip
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°
ΠΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ dummy_wsgi_framework - ΡΡΠΎ ΠΈ Π΅ΡΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌ ΡΠ΄ΡΠΎΠΌ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ dummy_wsgi_framework/core ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ΄Π½ΠΎΡΡΡΠ°Π½ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ dummy_wsgi_framework/app.template.
ΠΠ»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΡΡΠ°ΡΡΠ°:
- Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ app (Π³Π΄Π΅ ΡΠ³ΠΎΠ΄Π½ΠΎ).
- CΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ app ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ dummy_wsgi_framework/app.template.
- ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
$ uwsgi --http 127.0.0.1:8080 --wsgi-file /<absolute_path>/app/application.py
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
Π€Π°ΠΉΠ» config.py Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ, Π±Π΅Π· Π΄ΠΎΠ»ΠΆΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡΡΠ°, Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ (Ρ ΠΎΡΡ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠΌ. ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ° "ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ ΠΏΡΡΡΠΌΠΈ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ") ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠ΄Π°.
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΠ°ΡΡΡΡΡΡ
Π€Π°ΠΉΠ» routes.py ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠ΅ "ΠΌΠ°ΡΡΡΡΡΡ" - ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ² (Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΈΡ ΠΌΠ°ΡΠΎΠΊ) ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Π»ΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠ°ΡΡΡΡΡΡ Π·Π°Π΄Π°ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅:
routes_of_uri_regexps = (
dict(uri_regexp='/index/', controller='index.py'),
dict(uri_regexp='/', controller='index.py'),
)
ΠΈΠ»ΠΈ Ρ ΠΏΠΎΠ΄Π³ΡΡΠ·ΠΊΠΎΠΉ Π±Π°Π·ΠΎΠ²ΡΡ ΠΌΠ°ΡΡΡΡΡΠΎΠ² ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°:
from dummy_wsgi_framework.core.routes import base_routes_of_uri_regexps
routes_of_uri_regexps = tuple([
dict(uri_regexp='^/page_one/$',
controller='page_one.py'),
dict(uri_regexp='^/page_two/$',
controller='page_two.py')
] + list(base_routes_of_uri_regexps).copy())
, Π³Π΄Π΅:
- Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° uri_regexp - ΡΡΠΎ REQUEST_URI, ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΠΏΠΎΡΠ»Π΅ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ IP-Π°Π΄ΡΠ΅ΡΠ° ΡΠ°ΡΡΡ HTTP-Π·Π°ΠΏΡΠΎΡΠ°. ΠΠ½Π°ΠΊ ΠΊΠΎΡΠΎΠΉ ΡΠ΅ΡΡΡ "/" Π² ΠΊΠΎΠ½ΡΠ΅ uri_regexp ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»Π΅Π½, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² ΡΠ΅ΡΠ΅Π· ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΡΠ΄ΡΠ° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅Ρ ΠΌΠ°ΡΡΡΡΡΡ HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ², ΠΈ Π΅ΡΠ»ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ REQUEST_URI Π·Π½Π°ΠΊ ΠΊΠΎΡΠΎΠΉ ΡΠ΅ΡΡΡ "/" ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ, ΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ΅Π΄ΠΈΡΠ΅ΠΊΡ (ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ HTTP-Π·Π°ΠΏΡΠΎΡΠ°) Π½Π° REQUEST_URI Ρ ΠΏΡΠΈΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ Π² ΠΊΠΎΠ½Π΅Ρ ΠΊΠΎΡΠΎΠΉ ΡΠ΅ΡΡΠΎΠΉ "/".
- Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ° controller - ΡΡΠΎ ΡΠ°ΠΌ Python-ΡΠ°ΠΉΠ» ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ uri_regexp ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠ΅Π³ΠΎ Π»ΠΎΠ³ΠΈΠΊΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π½Π° HTTP-Π·Π°ΠΏΡΠΎΡ.
ΠΡΠ΄ΡΠ΅ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½Ρ, ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠΎ ΠΏΠΎΡΡΠ΄ΠΊΡ (ΡΠ²Π΅ΡΡ Ρ Π²Π½ΠΈΠ·) ΠΌΠ°ΡΡΡΡΡ. ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΎΠΏΠΈΡΠ°Π΅ΡΡΡ Π½Π° ΡΡΠΏΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ re.compile(uri_regexp).findall(REQUEST_URI). Π€ΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π² uri_regexp Π±ΡΠ» Π²Π²Π΅Π΄Π΅Π½ Π² ΡΠ΄ΡΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Π΄Π»Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΌΠ°ΡΡΡΡΡΠ°Ρ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ² ("ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΎΡΠ°Π±ΠΎΡΠΊΠΎΠΉ Π΄ΠΎΠΏΡΡΠ΅Π½Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²").
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΠΈΡΠΏΠ΅ΡΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ²
ΠΠ° Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΊ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°ΠΌ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΌΠ°ΡΡΡΡΡΠ°ΠΌΠΈ ΠΈΠ· routes.py ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ application() - ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΉ "Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ²" ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π² application.py (ΡΠ°ΠΉΠ» Π½Π°Π·ΡΠ²Π°ΡΡ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊ). ΠΡΠΎΡ ΡΠ°ΠΉΠ» Π²ΡΡΡΡΠΏΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΠΎΡΠΊΠΈ Π²Π°ΡΠ΅Π³ΠΎ WSGI-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
# Content of: app/application.py
import config as app_config
from dummy_wsgi_framework.core.dispatchers import get_controller_response
def application(environ, start_response):
return get_controller_response(environ, start_response, app_config)
Π ΠΈΡΠΎΠ³Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ ΡΠ°ΠΊ:
$ uwsgi --http 127.0.0.1:8080 --wsgi-file /<absolute_path>/app/application.py
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Ρ ΠΠ°Ρ Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Dummy WSGI Framework Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π·Π°ΠΏΡΡΠΊΠ°Ρ ΠΈΡ Π½Π° ΡΠ°Π·Π½ΡΡ ΠΏΠΎΡΡΠ°Ρ ΡΠ΅ΡΠ²Π΅ΡΠ°.
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ
"ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ" ΡΡΠΎ Python-ΡΠ°ΠΉΠ»Ρ, ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡΠΈΠ΅ Π»ΠΎΠ³ΠΈΠΊΡ ΡΠ΅Π°ΠΊΡΠΈΠΈ Π½Π° HTTP-Π·Π°ΠΏΡΠΎΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠΌΠΈ ΠΌΠ°ΡΡΡΡΡΠ°ΠΌΠΈ.
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ²ΠΎΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² ΠΈΡ Π»ΠΎΠ³ΠΈΠΊΡ ΡΠ°Π±ΠΎΡΡ (ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡΡ ΡΠΈΠΏΠΎΠ²ΡΠ΅ Ρ ΠΏΠΎΠ΄Π³ΡΡΠ·ΠΊΠΎΠΉ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠ² ΠΈ Π±Π΅Π·, ΠΈΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ Ρ ΠΏΠΎΡΡΠ»ΠΊΠΎΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ Basic Access Authentication ΠΊΠ°ΠΊ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ "ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ Π΄Π²ΡΠΌΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΌΠΈ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ (Basic access authentication)").
ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡΡΡ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ controllers Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (ΡΡΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² config.py ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ², ΡΠΌ. ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ° "ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ ΠΏΡΡΡΠΌΠΈ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ").
ΠΡΠ½ΠΎΠ²Π½ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΌ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅ Π²ΡΠ·ΠΎΠ²Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ get_response(). ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ Π΅Π΅, ΠΈΠ½Π°ΡΠ΅ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² Π½Π΅ ΡΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ, ΠΈ Π±ΡΠ΄Π΅Ρ ΡΠ³Π΅Π½Π΅Π½ΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ControllerFileIsInvalid Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ get_response()
ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ "ΡΠ΅Π΄ΠΈΡΠ΅ΠΊΡΠ°" ΠΈ "404-ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ" ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² ΡΠ΄ΡΠ΅ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°:
# File: core/controllers/redirect.py
def get_response(environ, start_response, app_config, location):
start_response('301 Moved Permanently', [('Location', location)])
return b''
ΠΈ
# File: core/controllers/error404.py
def get_response(environ, start_response, app_config, message):
start_response('404 Not found', [('Content-Type', 'text/html; charset=utf-8')])
return [
# some template
]
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ
ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ ΠΌΠΎΠ³ΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΠ²Π΅ΡΠ°ΡΡ Π½Π° HTTP-Π·Π°ΠΏΡΠΎΡ ΠΈΠ»ΠΈ ΠΆΠ΅ Π·Π°Π³ΡΡΠΆΠ°ΡΡ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΡΠ°ΠΉΠ»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ, ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈΡ ΡΠ°ΠΊ ΠΆΠ΅ Π½Π°Π·ΡΠ²Π°ΡΡ "ΡΠ°Π±Π»ΠΎΠ½Ρ".
Python-ΡΠ°ΠΉΠ»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡΡΡ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ views Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (ΡΡΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π² config.py ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ, ΡΠΌ. ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ° "ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ ΠΏΡΡΡΠΌΠΈ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ").
ΠΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠΌ ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π·Π΄Π΅ΡΡ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ "ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π±Π°Π·ΠΎΠ²ΡΡ _Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°".
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΈΠΊΠΈ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
Π’ΠΎΡΠΊΠ° Π²Ρ ΠΎΠ΄Π° Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (app/application.py: def application()...), ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² (core/dispatchers.py: def get_controller_response()...) Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΎΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ°Π·ΠΎΠ²ΡΠΉ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΌ Π΅ΠΌΡ REQUEST_URI ΠΏΠΎ ΠΈΠΌΠ΅ΡΡΠΈΠΌΡ Π΄Π°Π½Π½ΡΠΌ Π² ΠΌΠ°ΡΡΡΡΡΠ°Ρ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (app/routes.py: routes_of_uri_regexps) Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΏΠΎ ΡΡΠΏΠ΅Ρ Ρ (core/routes.py: def get_controller_by_uri_regexp()...) ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π΄Π°Π½Π½ΠΎΠΌΡ ΠΌΠ°ΡΡΡΡΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ (app/controllers/ACTION.py: def get_response()), ΠΊΠΎΡΠΎΡΡΠΉ Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΎΡΠ²Π΅ΡΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎ "Π·Π°ΡΠΈΡΠΎΠΌΡ" Π² Π½Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Ρ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ (Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ°ΠΊ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΠ΅) ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π΄Π°Π»ΡΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ (core/dispatchers.py: def load_view()..._), ΠΊΠΎΡΠΎΡΡΠΉ "Π·Π°Π³ΡΡΠ·ΠΈΡ" ΡΠ°ΠΉΠ» Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ (app/views/ACTION.html).
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΡΠΈΠΌΠ΅ΡΡ
ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ²
ΠΡΠΈΠΌΠ΅ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Dummy WSGI Framework ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ:
- "ΠΠ΄Π½ΠΎΡΡΡΠ°Π½ΠΈΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅"
- "ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π±Π°Π·ΠΎΠ²ΡΡ _Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°"
- "ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΠΈ ΠΏΡΡΡΠΌΠΈ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ"
- "ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ Π΄Π²ΡΠΌΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΌΠΈ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ (Basic access authentication)"
- "ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΎΡΠ°Π±ΠΎΡΠΊΠΎΠΉ Π΄ΠΎΠΏΡΡΠ΅Π½Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²"
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΡΠΈΠΌΠ΅Ρ "ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π±Π°Π·ΠΎΠ²ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°"
ΠΡΠΈΠΌΠ΅Ρ "ΠΠ΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ Π±Π°Π·ΠΎΠ²ΡΡ _Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°" ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΠ΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ:
- ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΡΠ·ΠΎΠ²Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° Π±Π΅Π· ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ;
- ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π²ΡΠ·ΠΎΠ²Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΎΠΉ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΠ· HTML-ΡΠ°ΠΉΠ»Π°;
- Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ ΡΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠ»ΠΎΠ²Π° Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ΄ΡΠ° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ RouteDoesNotExist, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠ΅Π³ΠΎ ΠΏΡΠΈ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠ΅ΠΌ ΠΌΠ°ΡΡΡΡΡΠ΅, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠ΅Π³ΠΎ ΠΏΡΠΈΡΠ΅Π΄ΡΠ΅ΠΌΡ HTTP-Π·Π°ΠΏΡΠΎΡΡ;
- Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ ΡΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠ»ΠΎΠ²Π° Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ΄ΡΠ° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ControllerFileDoesNotExist, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠ΅Π³ΠΎ ΠΏΡΠΈ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠ΅ΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°, ΠΌΠ°ΡΡΡΡΡ Π΄ΠΎ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ;
- Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ ΡΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠ»ΠΎΠ²Π° Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ΄ΡΠ° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ControllerFileIsInvalid, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠ΅Π³ΠΎ ΠΏΡΠΈ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠ΅ΠΉ Ρ ΡΠ°ΠΉΠ»Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°, ΠΌΠ°ΡΡΡΡΡ Π΄ΠΎ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΡΡΠ½ΠΊΡΠΈΠΈ get_response();
- Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ ΡΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΎΡΠ»ΠΎΠ²Π° Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ΄ΡΠ° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ViewDoesNotExist, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡΠ΅Π³ΠΎ ΠΏΡΠΈ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠ΅ΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΠΏΠΎΠ΄Π³ΡΡΠΆΠ°Π΅ΠΌΠΎΠΌ Π² ΡΡΠ½ΠΊΡΠΈΠΈ get_response() ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°, ΠΌΠ°ΡΡΡΡΡ Π΄ΠΎ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Ρ ΡΠ΅Π»ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΠΎΠ² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ²Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π΅ΠΊΠΎΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ:
- ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ "ΠΊΠ°ΠΊ Π΅ΡΡΡ" - Π·Π°Π³ΡΡΠ·ΠΊΠ° ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Π°Ρ Π² ΡΠ΄ΡΠ΅ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°;
- ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ "ΡΠ΅Π³ΠΎ-ΡΠΎ" ΡΠ°ΠΌΠΎΠΏΠΈΡΠ½ΠΎΠ³ΠΎ - Π·Π°Π³ΡΡΠ·ΠΊΠ° ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈ Π·Π°ΠΌΠ΅Π½Π° ΡΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ Π»Π΅ΠΊΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ ΡΠ°ΠΊΠΎΠ²ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Ρ;
- ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Jinja2 - Π·Π°Π³ΡΡΠ·ΠΊΠ° ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Jinja2.
ΠΠ½Π΅ Π½Π΅ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π²Π½ΠΎΡΠΈΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΎΡ Jinja2 Π² ΡΠ΄ΡΠΎ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Ρ ΡΡΠΈΡΠ°Ρ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΡΠ²ΡΠ·Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΆΠ΅ΡΡΠΊΠΎΠΉ, Π΄Π° ΠΈ Dummy WSGI Framework ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π·Π°Π΄ΡΠΌΡΠ²Π°Π»ΡΡ ΠΊΠ°ΠΊ "Π±Π°Π·ΠΎΠ²ΡΠΉ", "ΠΊΠ°ΡΠΊΠ°ΡΠ½ΡΠΉ", "ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΠΈΠΉ" ΠΈ "Π³Π»ΡΠΏΠ΅Π½ΡΠΊΠΈΠΉ". ΠΡΠΈ ΡΡΠΎΠΌ, ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½Π΅ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ, ΠΈ ΠΈΠΌΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ ΠΏΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°, Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» Π² ΡΠ΄ΡΠ΅ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ° Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ.
ΠΠ΅ΠΊΠΎΡΠ°ΡΠΎΡ @decorate_loaded_view_function_for_response ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ.
Π’ΠΎ Π΅ΡΡΡ Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ "ΠΊΠ°ΠΊ Π΅ΡΡΡ", ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π² ΡΠ΄ΡΠ΅ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°, ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ Π²ΡΠ·ΠΎΠ² Π² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ load_view() ΡΠ΄ΡΠ° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°:
# Framework solution
from dummy_wsgi_framework.core.dispatchers import load_view
def get_response(environ, start_response, app_config):
return load_view(
environ,
start_response,
app_config, # ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡ Π΄ΠΈΡΠΏΠ΅ΡΡΠ΅ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ²
# ΠΊΠ°ΠΊΠΎΠ΅ ΠΈΠ· Π²Π°ΡΠΈΡ
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
'load_me.html' # ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ,
# ΠΎΠ±ΡΡΠ½ΠΎ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²ΡΠ·ΠΎΠ²
#
# from dummy_wsgi_framework.core.dispatchers import (
# resolve_name_by_python_file_name
# )
# resolve_name_by_python_file_name(__file__, '%s.html')
#
# ΡΡΠΎ ΠΎΠ±ΡΠΆΠ΅Ρ ΡΠ°ΠΉΠ» ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠΆΠ΅ ΠΈΠΌΡ,
# ΡΡΠΎ ΠΈ Ρ ΡΠ°ΠΉΠ»Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ΠΈ ΡΠΏΡΠΎΡΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΉ ΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³
)
Π Π΄Π»Ρ "ΡΠ΅Π³ΠΎ-ΡΠΎ" ΡΠ°ΠΌΠΎΠΏΠΈΡΠ½ΠΎΠ³ΠΎ Ρ Π²Π°Ρ Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ ΡΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ Π»Π΅ΠΊΡΠ΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½Π°. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π»ΠΈΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΊ Π²Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ°ΠΉΠ»Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄Π΅ΠΊΠΎΡΠ°ΡΠΎΡ @decorate_loaded_view_function_for_response:
# Your self realization
from dummy_wsgi_framework.core.dispatchers import decorate_loaded_view_function_for_response
@decorate_loaded_view_function_for_response
def yourself_load_view_function(view_path, **kwargs):
with open(view_path, 'rb') as f:
response_body = f.read()
for k in kwargs:
response_body = response_body.replace(
("{{ %s }}" % k).encode(),
str(kwargs[k]).encode()
)
return response_body
def get_response(environ, start_response, app_config):
return yourself_load_view_function(
environ,
start_response,
app_config,
'load_me.html', # ΡΠ°ΠΉΠ» ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΠ°Π±Π»ΠΎΠ½
id=1, # Π½Π΅ΠΊΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Ρ Π² ΡΠ°Π±Π»ΠΎΠ½ ΠΈ
value=2, # Π±ΡΠ΄ΡΡ ΡΡΠ°ΡΡΠ²ΠΎΠ²Π°ΡΡ Π² Π·Π°ΠΌΠ΅Π½Π΅ Π² response_body.replace
other=4
)
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°ΡΠΎΡΠΎΠ², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Jinja2, Π²ΡΡΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ:
# Jinja2 realization
from dummy_wsgi_framework.core.dispatchers import (
decorate_loaded_view_function_for_response
)
from dummy_wsgi_framework.core.exceptions import (
ExistViewFileIsInvalid,
ViewDoesNotExist
)
import config
import jinja2
import os
@decorate_loaded_view_function_for_response
def load_jinja2_view_template(view_template_path, **kwargs):
try:
environment = jinja2.Environment(loader=jinja2.FileSystemLoader(config.APP_VIEWS_DIR))
template = environment.get_template(os.path.basename(view_template_path))
return template.render(**kwargs).encode()
except jinja2.exceptions.TemplateSyntaxError as e:
raise ExistViewFileIsInvalid('File "%s" - %s' % (view_template_path, e.message))
except jinja2.exceptions.TemplateNotFound as e:
raise ViewDoesNotExist('File "%s" not found %s' % (view_template_path, e.message))
def get_response(environ, start_response, app_config):
return load_jinja2_view_template(
environ,
start_response,
app_config,
'load_me.html', # ΡΠ°Π±Π»ΠΎΠ½ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ Jinja2, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ Π±Π°Π·ΠΎΠ²ΡΠΌ.
id=1, # Π½Π΅ΠΊΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Ρ Π² ΡΠ°Π±Π»ΠΎΠ½ ΠΈ
value=2, # Π±ΡΠ΄ΡΡ ΡΡΠ°ΡΡΠ²ΠΎΠ²Π°ΡΡ Π² Π·Π°ΠΌΠ΅Π½Π΅ Π² template.render
other=4
)
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ Π²ΡΠ½ΠΎΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ load_jinja2_view_template(), Π² ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ°ΠΊ Π·Π΄Π΅ΡΡ - user_def.py, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈ Π²Π΅ΡΠ½ΡΠΌ Π΄Π»Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ load_jinja2_view_template(), Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ load_jinja2_view_template() Π² Π΄ΡΡΠ³ΠΈΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°Ρ .
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΡΠΈΠΌΠ΅Ρ 'ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ Π΄Π²ΡΠΌΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΌΠΈ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ (Basic access authentication)'
ΠΠΎΠ³Π΄Π° Π²ΡΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΎΡΡ, ΡΡΠΎ Dummy WSGI Framework ΡΠ°ΡΡΠΈΡΡΠ΅ΠΌ Π² ΡΠΈΠ»Ρ ΠΎΡΠΊΡΡΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ WSGI-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠΎ ΠΈΠΌΠ΅Π»ΠΎΡΡ Π² Π²ΠΈΠ΄Ρ, ΡΡΠΎ Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΏΠΎΡΡΠ» HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΈ ΠΈΠ½ΠΎΠΉ ΡΠ»ΡΠΆΠ΅Π±Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΠΎΠ³ΠΎ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Dummy WSGI Framework. Π’ΠΎΠΌΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΠΆΠΈΡΡ ΠΏΡΠΈΠΌΠ΅Ρ "ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ Π΄Π²ΡΠΌΡ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΡΠΌΠΈ ΡΡΡΠ°Π½ΠΈΡΠ°ΠΌΠΈ (Basic access authentication)"
ΠΠ°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ ΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅ Π·Π°ΠΏΡΠΎΡΠ° Π»ΠΎΠ³ΠΈΠ½Π° ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ:
* ΠΠ΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ) ΠΏΠΎΡΠ»Π΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡ
HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π·Π°ΠΏΡΠΎΡΠ° Basic Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ.
* ΠΡΠ°ΡΠ·Π΅Ρ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ ΡΠΎΡΠΌΡ.
* ΠΡ Π²Π²Π΅Π΄Π΅ΡΠ΅ Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°ΡΠΎΠ»Ρ.
* ΠΠ½ΠΈ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½ΠΈΡΡΡΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄Π²ΠΎΠ΅ΡΠΎΡΠΈΡ ":", Π·Π°ΠΊΠΎΠ΄ΠΈΡΡΡΡΡΡ
Π±ΡΠ°ΡΠ·Π΅ΡΠΎΠΌ ΠΏΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ Base64 ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΡΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ.
* ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π½Π° Π²Π°Π»ΠΈΠ΄Π½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΡ
ΠΏΠ°ΡΡ "login:password".
* Π ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅Ρ
Π° ΠΡ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ Π΄ΠΎΡΡΡΠΏ ΠΊ "ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠΉ" ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ :)
ΠΡΡΡΡ ΠΌΠ°ΡΡΡΡΡΡ Π±ΡΠ΄ΡΡ ΡΠ°ΠΊΠΎΠ²Ρ:
routes_of_uri_regexps = (
dict(uri_regexp=r'^/index_1/$', controller='first_secret_page.py'),
dict(uri_regexp=r'^/index_2/$', controller='second_secret_page.py'),
dict(uri_regexp=r'^/$', controller='first_secret_page.py'),
)
ΠΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ:
# Content of 'first_secret_page.py'
import base64
def get_response(environ, start_response, app_config):
if environ.get('HTTP_AUTHORIZATION', '').startswith('Basic '): # ΠΏΡΠΈΡΠ΅Π» Π»ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ
login_password_at_b64 = environ.get('HTTP_AUTHORIZATION', '')[6:]
login_password = base64.b64decode(login_password_at_b64) # Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΠΌ
if login_password == b'user:user':
start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')])
return [
# some template
]
# "login:password" is empty or not valid
start_response('401 Access Denied', [
('Content-Type', 'text/html; charset=utf-8'),
('WWW-Authenticate', 'Basic realm="Dummy WSGI Framework"'),
('Content-Length', '0'),
])
return b'Basic Auth'
Π Π½Π° "Π²ΡΠΎΡΠΎΠΉ ΡΠ΅ΠΊΡΠ΅ΡΠ½ΠΎΠΉ" ΡΡΡΠ°Π½ΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π΄ΡΡΠ³ΠΈΠ΅ "login:password", Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, "admin:admin".
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΡΠΈΠΌΠ΅Ρ 'ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΠΎΡΠ°Π±ΠΎΡΠΊΠΎΠΉ Π΄ΠΎΠΏΡΡΠ΅Π½Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²'
Π‘ ΡΠ΅Π»ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π²Π°ΠΌΠΈ Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² HTTP-Π·Π°ΠΏΡΠΎΡΠΎΠ² Π±ΡΠ» ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅Π½Π½ΠΎΠ²Π°Π½Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² (Π² Π½ΠΎΡΠ°ΡΠΈΠΈ "name=value") Π΄Π»Ρ ΠΌΠ°ΡΡΡΡΡΠ°, Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ Π² HTTP-Π·Π°ΠΏΡΠΎΡΠ΅ ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ Π΄Π»Ρ Π΅Π³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°, Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΈΡ "ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ΠΉ" Π΄Π°Π»ΡΡΠ΅ Π² ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ (Π² ΡΠΎΠΉ ΠΆΠ΅ Π½ΠΎΡΠ°ΡΠΈΠΈ "name=value"). ΠΡΠΎ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ "ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΎΡΠ°Π±ΠΎΡΠΊΠΎΠΉ Π΄ΠΎΠΏΡΡΠ΅Π½Π½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²"
ΠΠ»ΡΡΠ΅Π²ΡΠΌ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠΌ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌ uri_regexp.
routes_of_uri_regexps = (
...
dict(uri_regexp=r'^(/view_random/\?(id=[0-9]*)&(value=[A-F0-9]*)/)$', controller='view.py'),
...
)
ΠΡΠΈ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Π² uri_regexp ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΠΏΡΠ°Π²ΠΈΠ»:
- ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ HTTP-ΠΏΡΡΡ, ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΠΉ PATH_INFO, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, "/path/info/"
- ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡΡΡ Ρ Π½Π°Π±ΠΎΡΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΡ, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Π² ΠΊΠ»ΡΡΠ΅ controller, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎ "id", "hex", "word"
- ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ°ΡΡ ΠΈΠ· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈ ΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π½ΡΡ ΡΠΈΠΏΠΎΠ² Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, "id=id_value_type", "hex=hex_value_type", "word=word_value_type"
- Π·Π°ΠΊΠ»ΡΡΠΈΡΡ ΠΏΠ°ΡΡ Π² ΡΠΊΠΎΠ±ΠΊΠΈ ΠΈ ΡΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ , ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ "&", Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, "(id=id_value_type)&(hex=hex_value_type)&(word=word_value_type)"
- ΡΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ Ρ ΠΊΠΎΡΠ½Π΅Π²ΡΠΌ HTTP-ΠΏΡΡΠ΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ "\?", Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, "/path/info/\?(id=id_value_type)&(hex=hex_value_type)&(word=word_value_type)"
- ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ Π·Π½Π°ΠΊ ΠΊΠΎΡΠΎΠΉ ΡΠ΅ΡΡΡ "/", Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, "/path/info/\?(id=id_value_type)&(hex=hex_value_type)&(word=word_value_type)/"
- Π·Π°ΠΊΠ»ΡΡΠΈΡΡ Π² ΠΊΡΡΠ³Π»ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, "(/path/info/\?(id=id_value_type)&(hex=hex_value_type)&(word=word_value_type)/)"
- ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ Π·Π½Π°ΠΊΠΈ Π½Π°ΡΠ°Π»Π° "^" ΠΈ ΠΊΠΎΠ½ΡΠ° "$" ΡΠ΅Π³ΡΠ»ΡΡΠ½ΠΎΠ³ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, "^(/path/info/\?(id=id_value_type)&(hex=hex_value_type)&(word=word_value_type)/)$"
- Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°Π±Π»ΠΎΠ½Π½ΡΠ΅ ΡΠΈΠΏΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π½Π° ΠΈΡ
ΡΠ°Π±Π»ΠΎΠ½Ρ Π² Π½ΠΎΡΠ°ΡΠΈΠΈ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ
Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
- Π΄Π»Ρ "id_value_type" - "[0-9]*"
- Π΄Π»Ρ "hex_value_type" - "[0-9A-Fa-f]*"
- Π΄Π»Ρ "word_value_type" - "[0-9A-Za-z_]*" ΠΈΠ»ΠΈ "\w*"
- ΠΊΠ°ΠΊ ΠΈΡΠΎΠ³ Π² uri_regexp Π²Π½Π΅ΡΡΠΈ "^(/path/info/\?(id=[0-9]*)&(hex=[0-9A-Fa-f]*)&(word=[0-9A-Za-z_]*)/)$"
Π ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ list Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΎ ΡΠΏΠΈΡΠΊΠΎΠΌ ΡΡΡΠ»ΠΎΠΊ, Π³Π΄Π΅ ΡΠΊΠ°Π·Π°Π½Ρ ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠΈΡΠΈΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² Π²Π΅ΡΡ Π½Π΅ΠΌ ΡΠ΅Π³ΠΈΡΡΡΠ΅ ΠΈ ΠΈΡ id, ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½Π½ΡΠ΅ ΠΈΠΌ Π² ΠΏΠΎΡΡΠ΄ΠΊΠ΅ ΠΈΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ.
Π ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ view ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠ΅ Π² HTTP-Π·Π°ΠΏΡΠΎΡΠ΅ id ΠΈ ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠΈΡΠΈΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² Π²Π΅ΡΡ Π½Π΅ΠΌ ΡΠ΅Π³ΠΈΡΡΡΠ΅ . ΠΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ (ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠΈΡΡ), Π½Π°Π»ΠΈΡΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Ρ Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ, Π΄Π°ΠΆΠ΅ ΡΠ΅ΡΡΠ½Π°Π΄ΡΠ°ΡΠΈΡΠΈΡΠ½ΡΠΌΠΈ Π² Π½ΠΈΠΆΠ½Π΅ΠΌ ΡΠ΅Π³ΠΈΡΡΡΠ΅, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈΠ»ΠΈ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΈΠ½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΏΡΠΈΠ²Π΅Π΄ΡΡ Π² Π²ΡΠ·ΠΎΠ²Ρ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ RouteDoesNotExist, Π²Π΅Π΄Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅Ρ ΠΌΠ°ΡΡΡΡΡΠ° ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌΡ uri_regexp.
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΠΈΡΠ΅Π½Π·ΠΈΡ
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΡΠ·ΠΎΠ²Π°ΡΡ Dummy WSGI Framework Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠ°ΡΠΊΠ°ΡΠ° Π΄Π»Ρ ΡΠ²ΠΎΠΈΡ ΠΠ΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΎΡΠ½ΠΎΠ²Ρ Π΄Π»Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΠ΅Π±-ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠ°. Π‘ΡΡΠ»Π°ΡΡΡΡ Π½Π° ΡΠ°ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΠ°ΠΌΠΈ Dummy WSGI Framework Π½Π΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π½ΠΎ ΠΌΠ½Π΅ Π±Ρ Ρ ΠΎΡΠ΅Π»ΠΎΡΡ ΠΈΠΌΠ΅ΡΡ ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠΉ ΠΎΡΠ·ΡΠ², Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΎΠ½ ΠΈ Π½Π΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠΉ.
β Π½Π°Π²Π΅ΡΡ Π² ΠΎΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ
ΠΡΠΎΠ΅ΠΊΡ Π±ΡΠ» Π½Π°ΡΠ°Ρ Π² ΡΠ°ΠΌΠΊΠ°Ρ Π΄ΠΎΠΌΠ°ΡΠ½Π΅Π³ΠΎ Π·Π°Π΄Π°Π½ΠΈΡ ΠΊΡΡΡΠ° "Web-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π½Π° Python" Π½Π° https://otus.ru/learning ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ ΠΊΠ°ΠΊ Just4Fun-ΠΏΡΠΎΠ΅ΠΊΡ.
ΠΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠ΅ΡΠ΅Π½ΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»Π°ΡΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎ Π½ΠΈΡ ΠΏΡΠΈ ΠΏΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Π·Π°Π΄Π°ΡΠΈ Π½Π΅ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΎΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΡΡΠΎΠ±Ρ Dummy WSGI Framework Π±ΡΠ» ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ "ΡΠΈΡΡΡΠΌ".
ΠΡΠΎΡΡ ΠΏΠΎΠ½ΡΡΡ ΠΈ ΠΏΡΠΎΡΡΠΈΡΡ.
Π’Π΅ΠΏΠ΅ΡΡ, Π½Π°Π΄Π΅ΡΡΡ, ΠΈ ΠΠ°ΠΌ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ Dummy WSGI Framework Π½Π΅ ΡΠ°ΠΊ ΡΠΆ "ΠΏΡΠΎΡΡ" ΠΈ "Π³Π»ΡΠΏ".