рдЖрдЬрдХрд▓, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд╛рдпрдерди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдЙрд╕ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рд▓реИрд╕ рдХрд░рдиреЗ рдХреА рд╣реЛрдЧреА рдЬреЛ HTTP рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред REST API рдХреА рд╕рд░реНрд╡рд╡реНрдпрд╛рдкрдХрддрд╛ рдиреЗ рдЕрдирдЧрд┐рдирдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ HTTP рдЯреВрд▓реНрд╕ рдХреЛ рдПрдХ рд╕рдореНрдорд╛рдирд┐рдд рдлреАрдЪрд░ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ HTTP рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЗрд╖реНрдЯрддрдо рдХрд╛рдо рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреИрдЯрд░реНрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдХрдИ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдЖрдо рд╣реИ, рдФрд░, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЙрд╕реЗ
рдЕрдиреБрд░реЛрдз рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЬ, рдпрд╣ рдЧреНрд░рд╛рд╣рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирдХ рд╣реИред
рд╕реНрдерд╛рдпреА рдХрдиреЗрдХреНрд╢рди
HTTP рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рдЕрдиреБрдХреВрд▓рди рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред HTTP 1.1 рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рдХрдиреЗрдХреНрд╢рди рдорд╛рдирдХ рдмрди рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрднреА рднреА рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рджреЛрд╖ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐
requests
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ
requests
рд╕рд░рд▓ рдореЛрдб рдореЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреА
get
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рд╕рд░реНрд╡рд░ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдЗрд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ
Session
рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЦреБрд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
import requests session = requests.Session() session.get("http://example.com")
рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рдореЗрдВ рдЬрдорд╛ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ (рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ 10 рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ)ред рдкреВрд▓ рдЖрдХрд╛рд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
import requests session = requests.Session() adapter = requests.adapters.HTTPAdapter( pool_connections=100, pool_maxsize=100) session.mount('http://', adapter) response = session.get("http://example.org")
рдХрдИ HTTP рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЯреАрд╕реАрдкреА рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХрдИ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдорд┐рд▓рддреЗ рд╣реИрдВ:
- рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рд▓реЛрдб рдХреЛ рдХрдо рдХрд░рдирд╛ рдФрд░ рд░реИрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдХрдо рдХрд░рдирд╛ (рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдо рдХрдиреЗрдХреНрд╢рди рдЦреБрд▓рддреЗ рд╣реИрдВ)ред
- рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рджреЗрд░реА рдХреЛ рдХрдо рдХрд░рдирд╛ (рдХреЛрдИ рдЯреАрд╕реАрдкреА рд╣реИрдВрдбрд╢реЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рд╣реИ)ред
- рдЯреАрд╕реАрдкреА рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдордп рдХреЗ рдмрд┐рдирд╛ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
HTTP 1.1 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ
рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рднреЗрдЬреЗ рдЧрдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╣реА рдХрдиреЗрдХреНрд╢рди рдХреЗ рднреАрддрд░ рдХрдИ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, "рдкреИрдХреЗрдЯ" рдореЗрдВ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ)ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ,
requests
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рдорд╛рдирд╛рдВрддрд░ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд┐рдВрдЧ рдЕрдиреБрд░реЛрдз рдЙрддрдиреЗ рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ: "рдкреИрдХреЗрдЯ" рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рдЙрд╕реЗ рдпреЗ рдЕрдиреБрд░реЛрдз рдорд┐рд▓реЗ рдереЗред рдкрд░рд┐рдгрд╛рдо FIFO рд╕рд┐рджреНрдзрд╛рдВрдд ("рдкрд╣рд▓реА рдмрд╛рд░, рдкрд╣рд▓реЗ рдмрд╛рд╣рд░" - "рдкрд╣рд▓реЗ рдЖрдУ, рдкрд╣рд▓реЗ рдЫреЛрдбрд╝реЛ") рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдмрд╕реЗ рдХреБрд╢рд▓ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИред
рд╕рдорд╛рдирд╛рдВрддрд░ рдХреНрд╡реЗрд░реА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
requests
рдореЗрдВ рдПрдХ рдФрд░ рдЧрдВрднреАрд░ рдЦрд╛рдореА рднреА рд╣реИред рдпрд╣ рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред
requests.get("http://example.org")
рддрд░рд╣ рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓
requests.get("http://example.org")
рдПрдХ рдкреВрд░реНрдг HTTP рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд╕рдВрдЧрдарди рдХреА рдЗрд╕ рдпреЛрдЬрдирд╛ рдХрд╛ рдЛрдг рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдХреЗрд╡рд▓ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрдЬрд╛рдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ?
рдПрдХ рдЪрддреБрд░ рд░реВрдк рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдереНрд░реЗрдб рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕рдорд╡рд░реНрддреА.рдлреБрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
from concurrent import futures import requests with futures.ThreadPoolExecutor(max_workers=4) as executor: futures = [ executor.submit( lambda: requests.get("http://example.org")) for _ in range(8) ] results = [ f.result().status_code for f in futures ] print("Results: %s" % results)
рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдкреИрдЯрд░реНрди
рдЕрдиреБрд░реЛрдз-рд╡рд╛рдпрджрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП
Session
рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИ:
from requests_futures import sessions session = sessions.FuturesSession() futures = [ session.get("http://example.org") for _ in range(8) ] results = [ f.result().status_code for f in futures ] print("Results: %s" % results)
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рджреЛ рдереНрд░реЗрдбреНрд╕ рд╡рд╛рд▓рд╛ рдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ
FuturSession
рддрд░реНрдХ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐
FuturSession
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрдХ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
FuturesSession(executor=ThreadPoolExecutor(max_workers=10))
рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рдо
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ,
requests
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордХрд╛рд▓рд┐рдХ рд╣реИред рдпрд╣ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реБрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдпреЛрдЬрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд рд╣реИ, рдЬреЛ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИред
рдкрд╛рдпрдерди 3.5 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдорд╛рдирдХ рднрд╛рд╖рд╛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ
asyncio
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИред
Aiohttp рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рднреЗрдЬрдиреЗ рдФрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЙрд╕реА рд╕рдордп, рдПрдХ рдФрд░ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рднреЗрдЬреЗ рдЧрдП рдЕрдиреБрд░реЛрдз рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд,
aiohttp
рдХрдИ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИред рдпрд╣ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд "рдлреАрдлреЛ рд╕рдорд╕реНрдпрд╛" рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╣реИ рдХрд┐
aiohttp
рдХрд╛ рдЙрдкрдпреЛрдЧ
aiohttp
рджрд┐рдЦрддрд╛ рд╣реИ:
import aiohttp import asyncio async def get(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return response loop = asyncio.get_event_loop() coroutines = [get("http://example.com") for _ in range(8)] results = loop.run_until_complete(asyncio.gather(*coroutines)) print("Results: %s" % results)
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдг (
Session
, рд╕реНрдЯреНрд░реАрдо,
concurrent.futures
asyncio
рдпрд╛
asyncio
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рдЙрддреНрдкрд╛рджрдХрддрд╛
рдирд┐рдореНрди рдХреЛрдб рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ
httpbin.org
рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдПрдХ рдПрдкреАрдЖрдИ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рд▓рдВрдмрд╛ рд╕рдордп рд▓реЗрддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ 1 рд╕реЗрдХрдВрдб рд╣реИ)ред рдпрд╣рд╛рдБ, рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рддрдХрдиреАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдорд╛рдкрд╛ рдЧрдпрд╛ рд╣реИ:
import contextlib import time import aiohttp import asyncio import requests from requests_futures import sessions URL = "http://httpbin.org/delay/1" TRIES = 10 @contextlib.contextmanager def report_time(test): t0 = time.time() yield print("Time needed for `%s' called: %.2fs" % (test, time.time() - t0)) with report_time("serialized"): for i in range(TRIES): requests.get(URL) session = requests.Session() with report_time("Session"): for i in range(TRIES): session.get(URL) session = sessions.FuturesSession(max_workers=2) with report_time("FuturesSession w/ 2 workers"): futures = [session.get(URL) for i in range(TRIES)] for f in futures: f.result() session = sessions.FuturesSession(max_workers=TRIES) with report_time("FuturesSession w/ max workers"): futures = [session.get(URL) for i in range(TRIES)] for f in futures: f.result() async def get(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: await response.read() loop = asyncio.get_event_loop() with report_time("aiohttp"): loop.run_until_complete( asyncio.gather(*[get(URL) for i in range(TRIES)]))
рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
Time needed for `serialized' called: 12.12s Time needed for `Session' called: 11.22s Time needed for `FuturesSession w/ 2 workers' called: 5.65s Time needed for `FuturesSession w/ max workers' called: 1.25s Time needed for `aiohttp' called: 1.19s
рдпрд╣рд╛рдВ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдПрдХ рдЪрд╛рд░реНрдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдПрдХ рдЕрдзреНрдпрдпрди рдХреЗ рдкрд░рд┐рдгрд╛рдордпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЬрдирд╛ рд╕рдмрд╕реЗ рдзреАрдореА рдирд┐рдХрд▓реАред рдпрд╣рд╛рдБ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдПред рдирддреАрдЬрддрди, 10 рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ 12 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВред
Session
рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ, 8% рд╕рдордп рдмрдЪрд╛рддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЬреЛ рдХреЛрдИ рднреА рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рдХрдо рд╕реЗ рдХрдо
Session
рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдЖрдкрдХрд╛ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрдкрдХреЛ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИред рдзрд╛рд░рд╛рдПрдБ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рднрд╛рд░ рдкреИрджрд╛ рдХрд░рддреА рд╣реИрдВ, рд╡реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, "рдореБрдХреНрдд" рдирд╣реАрдВред рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдиреЗ, рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЙрдирдХреЗ рдХрд╛рдо рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рддреЗрдЬ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрджрд┐ рдЖрдк рдкрд╛рдпрдерди рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдирд╣реАрдВ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ
aiohttp
рд╕рдмрд╕реЗ рдЧрдВрднреАрд░ рдзреНрдпрд╛рди рджреЗрдирд╛
aiohttp
ред рдпрд╣ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдЙрдкрд╛рдп рд╣реИ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕реНрдХреЗрд▓реЗрдмрд▓ред рдпрд╣ рд╕реИрдХрдбрд╝реЛрдВ рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред
aiohttp
рдПрдХ рд╡рд┐рдХрд▓реНрдк, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдзрд╛рдЧреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рд╕реНрдЯреНрд░реАрдо рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдЕрдиреБрдХреВрд▓рди, рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдорд╛рдирдХ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдпреЛрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ: рдЖрд╡реЗрджрди рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд▓реЛрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
stream
рдкреИрд░рд╛рдореАрдЯрд░, рдЬреЛ
requests
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рд╕рдорд░реНрдерди
requests
рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде
aiohttp
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА
content
рд╡рд┐рд╢реЗрд╖рддрд╛, рдЖрдкрдХреЛ рдЗрд╕ рдпреЛрдЬрдирд╛ рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐
requests
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХрд╛ рд╕рдВрдЧрдарди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
import requests
рдпрд╣рд╛рдБ рдХреИрд╕реЗ
aiohttp
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдХрд┐рдпрд╛
aiohttp
:
import aiohttp import asyncio async def get(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.content.read() loop = asyncio.get_event_loop() tasks = [asyncio.ensure_future(get("http://example.com"))] loop.run_until_complete(asyncio.wait(tasks)) print("Results: %s" % [task.result() for task in tasks])
рдкреВрд░реНрдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рд╛рдордЧреНрд░реА рдХреЗ рддреНрд╡рд░рд┐рдд рд▓реЛрдбрд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рд╕реИрдХрдбрд╝реЛрдВ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдореЗрдореЛрд░реА рдХреЗ рдмреЗрдХрд╛рд░ рдЖрд╡рдВрдЯрди рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдВрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЙрддреНрддрд░ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрджрд┐ рдпрд╣ рдЙрддреНрддрд░ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╕рдВрднрд╡рддрдГ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХрд╛рд░реНрдп рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдореЗрдореЛрд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмреЙрдбреА рдХреЛ рдкрдврд╝рдиреЗ, рд╕реНрдореГрддрд┐ рдХреА рдПрдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрдЧрд╛ред
рдкрд░рд┐рдгрд╛рдо
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдСрдкрд░реЗрд╢рди рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдмрд╛рдд рдЖрдкрдХреЛ рдпрд╣ рдЪреБрдирдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреА рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рдпрдерди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреНрдпрд╛ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдкрд╛рдпрдерди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп рддрд░реАрдХрд╛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред
