рдХреЙрд░реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ [1] [2]
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
Werkzeug рдкрд╣рд▓реЗ рд╕реЗ рд╣реА CORS рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдЕрдкрдиреЗ WSGI рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдкрд░ рд╢реАрд░реНрд╖рд▓реЗрдЦ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ Werkzeug рдХреЗ рднреАрддрд░ "CORS рдХрд╛ рд╕рдорд░реНрдерди" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдореИрдВ рдУрдкреА рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╕реАрдУрдЖрд░рдПрд╕ рдПрдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рд╣реЗрдбрд░ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реЗрдЯрд┐рдВрдЧ/рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рд╢рд╛рдпрдж рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдирд┐рдкреЗрдЯ рдХреА рддрд░реНрдЬ рдкрд░ рдХреБрдЫ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣рд╛рдВ-рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░реАрдлреНрд▓рд╛рдЗрдЯ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдЧрд╛ ...
if 'cors' in config and config['cors'] is True:
response.headers.add('Access-Control-Allow-Origin', '*')
response.headers.add('Access-Control-Allow-Methods',
'GET,PUT,POST,DELETE,PATCH')
response.headers.add('Access-Control-Allow-Headers',
'Content-Type, Authorization')
...рдЖрдк рдЕрдЬрдЧрд░ рдордВрддреНрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ: "рдмреИрдЯрд░реА рд╢рд╛рдорд┐рд▓"...;)
рд▓реЗрдХрд┐рди CORS *
рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдЖрдк рдХреБрдХреАрдЬрд╝ рдФрд░ рд╕рд╛рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореИрдВ CORS рд╣реЗрдбрд░ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдкреНрд░реАрдлрд╝реНрд▓рд╛рдЗрдЯ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП 20 LoC WSGI рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЗрддрдирд╛ рднреА рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред
@posativ - рд╢рд╛рдпрдж рдПрдХ
рдмрд╣реБрдд рд╕реАрдорд┐рдд рд░реВрдк рдореЗрдВ:
from werkzeug.datastructures import Headers
class CORSMiddleware(object):
"""Add Cross-origin resource sharing headers to every request."""
def __init__(self, app, origin):
self.app = app
self.origin = origin
def __call__(self, environ, start_response):
def add_cors_headers(status, headers, exc_info=None):
headers = Headers(headers)
headers.add("Access-Control-Allow-Origin", self.origin)
headers.add("Access-Control-Allow-Headers", "Origin, ...")
headers.add("Access-Control-Allow-Credentials", "true")
headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, etc")
headers.add("Access-Control-Expose-Headers", "...")
return start_response(status, headers.to_list(), exc_info)
if environ.get("REQUEST_METHOD") == "OPTIONS":
add_cors_headers("200 Ok", [("Content-Type", "text/plain")])
return [b'200 Ok']
return self.app(environ, add_cors_headers)
# usage
app = CORSMiddleware(make_app(...), "http://example.org/")
рдХрд╕реНрдЯрдо рд╣реЗрдбрд░, рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓, рд╡рд╛рдЗрд▓реНрдб-рдХрд╛рд░реНрдб рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
@posativ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬрдм рдореИрдВ рдЙрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред :)
рдЗрд╕рдХреЛ рдЯрдХреНрдХрд░ рджреЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рд╕рд╛рдкреЗрдХреНрд╖ рдкреНрд░рд╢реНрди http://stackoverflow.com/questions/19382431/set-header-on-werkzeug-exception
рд╕рдВрдмрдВрдзрд┐рдд рдкрдВрдХреНрддрд┐: https://github.com/pallets/werkzeug/blob/master/werkzeug/debug/__init__.py#L297
start_response('500 INTERNAL SERVER ERROR',
Access-Control-Allow-Origin: *
рдЬреИрд╕реЗ CORS рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдХрдард┐рди рдмрдирд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА X-XSS-Protection: 0
рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рдлреНрд▓рд╛рд╕реНрдХ-рдХреЙрд░реНрд╕ рд╕рдХреНрд╖рдо рд╣реИ, рдХреНрд░реЛрдо рдореЗрдВ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рд░рд┐рдореЛрдЯ рдЕрдЬрд╛рдХреНрд╕ рдПрдкреАрдЖрдИ рдХреЙрд▓ рдбрд┐рдмрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬрдм рдлреНрд▓рд╛рд╕реНрдХ рдореЗрдВ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕реАрдУрдЖрд░рдПрд╕ рдХреА рд╡рдЬрд╣ рд╕реЗ рдбреАрдмрдЧ рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ред рдХреНрдпрд╛ рд╣рдо рдЗрд╕ рд╣реЗрдбрд░ рдХреЛ рдбрд┐рдмрдЧ рдореЙрдбрд▓ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?
рдЖрдк рдбреАрдмрдЧрд░ рдкрд░ CORS рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреНрдпреЛрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ? рдФрд░ рдЖрдк рд░реИрдкрд┐рдВрдЧ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ?
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рд╣рд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рд╡рд░реНрдХрдЬрд╝реЗрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
@unititaker
рдЖрдк рдбреАрдмрдЧрд░ рдкрд░ CORS рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреНрдпреЛрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?
рдЪреВрдВрдХрд┐ рдпрд╣ рдХреНрд░реЙрд╕-рдбреЛрдореЗрди AJAX рдЕрдиреБрд░реЛрдз рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдИрд╡реЗрдВрдЯ рдЯреНрд░рд┐рдЧрд░рд┐рдВрдЧ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдмрд╛рдж рдХреЗрд╡рд▓ рдХреНрд░реЛрдо рджреЗрд╡рдЯреВрд▓ рдореЗрдВ рдЗрд╕реЗ рдбреАрдмрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдХреЛрдИ рд╕реАрдУрдЖрд░рдПрд╕ рд╣реЗрдбрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреНрд░реЛрдо рджреЗрд╡рдЯреВрд▓ рдХрд┐рд╕реА рднреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдХреБрдЫ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ред рдореИрдВ рдХреЗрд╡рд▓ 500 рд╕рд░реНрд╡рд░ рддреНрд░реБрдЯрд┐ рд╡рд╛рд▓реЗ рд░рд┐рдХреНрдд рдкреГрд╖реНрда рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред
рдФрд░ рдЖрдк рд░реИрдкрд┐рдВрдЧ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ?
рдХреНрдпреЛрдВрдХрд┐ рд▓рдкреЗрдЯрд╛ рд╣реБрдЖ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗрд╡рд▓ рд╕рд╛рдорд╛рдиреНрдп (рдЙрдЪрд┐рдд рд▓реМрдЯрд╛рдП рдЧрдП рдлреНрд▓рд╛рд╕реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди) рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм Werkzeug рдЕрдкрд╡рд╛рдж рдбреАрдмрдЧрд░ рд╣реЛрддрд╛ рд╣реИ рддреЛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ "рд░реИрдкрд┐рдВрдЧ рдорд┐рдбрд▓рд╡реЗрдпрд░" рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, https://github.com/corydorf/flask-cors/issues/67 рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдЬрдм рддрдХ рдХрд┐ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреЗ Werkzeug рд╕рд╛рдорд╛рди рдХреЛ рдЯреНрд╡реАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @untitaker рдиреЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдирд╣реАрдВ
@lambdaq рдЕрдм рдЖрдк @untitaker рдХреЗ рдкреНрд░рддрд┐ рдирд┐рдХреГрд╖реНрдЯ рдмрдирддреЗ рд░рд╣реЗ рд╣реИрдВ
рдХреЛрдИ рднреА рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреЛ рдбрд┐рдмрдЧ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, start_response рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдбреАрдмрдЧрд░ рдХреЗ рд▓рд┐рдП рднреА - рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪрд┐рдкрдХрд╛рдпрд╛ рдФрд░ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ,
рдЪреВрдВрдХрд┐ рдПрдХ рдХреЙрд░реНрд╕ рдорд┐рдбрд▓-рд╡реЗрдпрд░ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рдкреЗрдЯрдХрд░ рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ
рд╢рд╛рдпрдж рдореБрдЭреЗ рдЖрдкрдХреА рд╕рдЯреАрдХ рд╕рдорд╕реНрдпрд╛ рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп/рд╕рдордЭ рдХреЗ рдХрд╛рд░рдг рдХреГрдкрдпрд╛ рд╕рдЯреАрдХ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдЯреВрдЯрд╛/рдЕрд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ
рд╕реНрдерд┐рддрд┐ рдХреЛ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрдк.рд░рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдбреАрдмрдЧрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рднреА рдЖрдк рдЕрдкрдиреЗ CORS рдФрд░ рдбреАрдмрдЧрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рджреЛрдиреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред IMO рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрд┐рдирд╛рд░реЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбрд┐рдмрдЧрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдареЛрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИрдВ рдЬреЛ рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗ рд╕рдордЭреМрддрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╕реБрдЭрд╛рд╡ рджреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдХрд┐рд╕реА рдЖрд╕рд╛рди рдмрджрд▓рд╛рд╡ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВ Werkzeug рдореЗрдВ рдХреЛрдб рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╡рд╛рдХрд┐рдл рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦ рд░рд╣рд╛ рд╣реВрдВ?
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдЕрдкрдиреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, Werkzeug рдХрдорд╛рд▓ рдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдмрд╕ рдЗрди start_response()
рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рджреЗрд╡ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕реАрдУрдЖрд░рдПрд╕ рд╣реЗрдбрд░ рдмреНрд░реВрдЯрдлреЛрд░реНрд╕ рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рдпрд╣ рдмрд╛рд▓реЛрдВ рд╡рд╛рд▓реЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреЗрдПрд╕ рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ 500 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдкрд░ рдбреАрдмрдЧрд░ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред
@untitaker JS рдХреЛрдб рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЕрдЧрд░ 500 рддреНрд░реБрдЯрд┐ рд╣реИ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ http рд╕реНрдерд┐рддрд┐ рдХреЛрдб 500 рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдбреАрдмрдЧрд░ рдкреГрд╖реНрда рд╕реЗ рдЯреНрд░реЗрд╕рдмреИрдХ рд╡рд╣ рд╣реИ рдЬреЛ рдореИрдВ рдмрд╛рдж рдореЗрдВ рд╣реВрдВред
рдЬреЗрдПрд╕ рдХреЛрдб рднреА рдмрд╛рд▓реЛрдВ рд╡рд╛рд▓реА рд╕рдВрдХрд▓рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рд╣реИрдВ, рдЬрд┐рд╕реЗ рджреВрд╕рд░реА рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ 300s+ рд╕реЗ npm run dev
рд▓рдЧрддреЗ рд╣реИрдВред рдХреБрдЫ рдбрд┐рдмрдЧ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЯреНрд╡рд┐рдХ рдХрд░рдирд╛ рдпрд╛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ #1699 рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред рдЬрдмрдХрд┐ Werkzeug #1699 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХреНрд╕реЗрд╕рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП (рдЬреИрд╕реЗ рдХреИрд╢ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП) рдФрд░ рдЗрд╕ рдкрд░ рдмрдиреЗ рдЯреВрд▓ (рдЬреИрд╕реЗ рдлреНрд▓рд╛рд╕реНрдХ-рдХреЛрд░ рдпрд╛ рдХреНрд╡рд╛рд░реНрдЯ-рд╕реАрдУрдЖрд░рдПрд╕) рдХреЛ рд╕реАрдУрдЖрд░рдПрд╕ рддрд░реНрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рд╣рд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рд╡рд░реНрдХрдЬрд╝реЗрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред