ΠΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π½Π΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π°ΠΏΡΡΠΌΡΡ.
https://docs.aiohttp.org/en/stable/testing.html#pytest
Π― Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠ²ΠΎΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π°ΠΏΡΡΠΌΡΡ test_client
Π΄Π»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² "Π½Π° Π»Π΅ΡΡ" ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΡΠ΅ΡΡΠΎΠΌ. ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ app
Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² test_client
ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π·, Π·Π°ΡΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ "RuntimeError: ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ web.Application ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ Π΄ΡΡΠ³ΠΈΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ".
# handler.py
async def foo():
return 'foo'
# app.py
from aiohttp import web
from .handler import foo
app = web.Application()
app.add_routes([web.get('/foo/', foo)])
# test.py
from .app import app
async def test_foo_status(test_client):
response = await client.get('/foo/')
assert response.status == 200
async def test_foo_body(test_client):
response = await client.get('/foo/')
body = await response.text()
assert body == 'foo'
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ ΡΠ΅ΡΠΈΠ» ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π·Π°Π³Π»ΡΠ½ΡΠ² Π² ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ² ΠΏΡΠΈΡΠΈΠ½Ρ ΠΎΡΠΈΠ±ΠΊΠΈ.
if self._loop is not None and self._loop is not loop:
raise RuntimeError(
"web.Application instance initialized with different loop")
https://github.com/aio-libs/aiohttp/blob/e561eaa/aiohttp/web_app.py#L134
ΠΠ½Π΅ Π½Π΅ ΡΡΠ°Π·Ρ ΠΏΠΎΠ½ΡΡΠ½ΠΎ, Π·Π°ΡΠ΅ΠΌ Π½ΡΠΆΠ΅Π½ ΡΡΠΎΡ ΠΊΠΎΠ΄. Π― Π½Π΅ ΡΠΌΠΎΠ³ Π½Π°ΠΉΡΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π² ΠΈΡΡΠΎΡΠΈΠΈ git. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° app._loop = None
Π² ΠΌΠΎΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄Π΅ ΡΠ΅ΡΡΠΎΠ²ΠΎΠΉ ΠΎΡΠΈΡΡΠΊΠΈ, ΠΏΠΎΡ
ΠΎΠΆΠ΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ
-Π»ΠΈΠ±ΠΎ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΡΡ
ΠΏΠΎΠ±ΠΎΡΠ½ΡΡ
ΡΡΡΠ΅ΠΊΡΠΎΠ². ΠΠ΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π»ΠΈ ΡΡΠΎΡ ΠΊΠΎΠ΄ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ? ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² test_client
?
Application
- ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ, Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΠΎΡΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠ° ΠΈΠ· Π½Π°Π±ΠΎΡΠ° ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΡ
ΡΠ΅ΡΡΠΎΠ².
Π‘ΡΠΎΠΊ ΡΠ»ΡΠΆΠ±Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΊΠΎΡΠΎΡΠ΅, ΡΠ΅ΠΌ ΡΠΈΠΊΠ» ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ.
ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°: Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ app.app
Π½Π° async def app.make_app()
coroutine, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅.
ΠΠΎΠ±Π°Π²ΠΈΡΡ def make_app()
Π² app.py
? Π ΡΡΠΎΠΌ Π΅ΡΡΡ ΡΠΌΡΡΠ».
FWIW tornado ΠΏΡΠΎΠ΄Π²ΠΈΠ³Π°Π΅Ρ ΡΠ°Π±Π»ΠΎΠ½ make_app()
Π² ΡΠ²ΠΎΠ΅ΠΌ ΡΠ°ΠΌΠΎΠΌ ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅. Π― Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΠΈΠ·Π΄Π΅Π²Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Π½Π°Π΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π² ΡΠ΅ΡΡΠΎΠ²ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ - Ρ
ΠΎΡΠΎΡΠΈΠΉ ΠΎΠ±ΡΠ°Π·Π΅Ρ Π΄Π»Ρ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
Π§Π΅ΡΡΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΡ, Ρ Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΠΈΠ·Π΄Π΅Π²Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Π½Π°Π΄ Π»ΡΠ±ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ aiohttp
- Ρ
ΠΎΡΠΎΡΠΈΠΉ ΡΠ°Π±Π»ΠΎΠ½
ΠΡΠΎΡ ΠΏΠΎΡΠΎΠΊ Π±ΡΠ» Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΠΎΡΠ»Π΅ Π΅Π³ΠΎ Π·Π°ΠΊΡΡΡΠΈΡ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π²ΡΠ΅ΠΌΡ Π½Π΅ Π±ΡΠ»ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ. ΠΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°, ΠΎΡΠΊΡΠΎΠΉΡΠ΅ [Π½ΠΎΠ²ΡΠΉ Π²ΡΠΏΡΡΠΊ], ΡΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ
.
ΠΡΠ»ΠΈ Π²Ρ ΡΡΠ²ΡΡΠ²ΡΠ΅ΡΠ΅, ΡΡΠΎ Π² Ρ
ΠΎΠ΄Π΅ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ Π±ΡΠ»ΠΈ Π·Π°ΡΡΠΎΠ½ΡΡΡ Π²Π°ΠΆΠ½ΡΠ΅ ΠΌΠΎΠΌΠ΅Π½ΡΡ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΡΡΠΈ Π²ΡΠ΄Π΅ΡΠΆΠΊΠΈ Π² ΡΡΠΎΡ [Π½ΠΎΠ²ΡΠΉ Π²ΡΠΏΡΡΠΊ].
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Application
- ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ, Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΠΎΡΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠ° ΠΈΠ· Π½Π°Π±ΠΎΡΠ° ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΡΡ ΡΠ΅ΡΡΠΎΠ².Π‘ΡΠΎΠΊ ΡΠ»ΡΠΆΠ±Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΊΠΎΡΠΎΡΠ΅, ΡΠ΅ΠΌ ΡΠΈΠΊΠ» ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ.
ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°: Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅
app.app
Π½Π°async def app.make_app()
coroutine, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅.