Werkzeug: рдХреЙрд░реНрд╕ рд╕рдорд░реНрдерди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 3 рдирд╡ре░ 2011  ┬╖  16рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pallets/werkzeug

рдХреЙрд░реНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ [1] [2]

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

[1] http://www.w3.org/TR/cors/
[2] http://enable-cors.org/

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рд╣рд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рд╡рд░реНрдХрдЬрд╝реЗрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рд╕рднреА 16 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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 рдиреЗ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдирд╣реАрдВ

qq20160420-3

@lambdaq рдЕрдм рдЖрдк @untitaker рдХреЗ рдкреНрд░рддрд┐ рдирд┐рдХреГрд╖реНрдЯ рдмрдирддреЗ рд░рд╣реЗ рд╣реИрдВ

рдХреЛрдИ рднреА рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреЛ рдбрд┐рдмрдЧ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рдкреЗрдЯрддрд╛ рд╣реИ, start_response рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдбреАрдмрдЧрд░ рдХреЗ рд▓рд┐рдП рднреА - рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪрд┐рдкрдХрд╛рдпрд╛ рдФрд░ рд▓рд┐рдВрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд▓рдЧрддрд╛ рд╣реИ,
рдЪреВрдВрдХрд┐ рдПрдХ рдХреЙрд░реНрд╕ рдорд┐рдбрд▓-рд╡реЗрдпрд░ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рдкреЗрдЯрдХрд░ рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ

рд╢рд╛рдпрдж рдореБрдЭреЗ рдЖрдкрдХреА рд╕рдЯреАрдХ рд╕рдорд╕реНрдпрд╛ рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп/рд╕рдордЭ рдХреЗ рдХрд╛рд░рдг рдХреГрдкрдпрд╛ рд╕рдЯреАрдХ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдЯреВрдЯрд╛/рдЕрд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИ

рд╕реНрдерд┐рддрд┐ рдХреЛ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдРрдк.рд░рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдбреАрдмрдЧрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рднреА рдЖрдк рдЕрдкрдиреЗ CORS рдФрд░ рдбреАрдмрдЧрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рджреЛрдиреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред IMO рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХрд┐рдирд╛рд░реЗ рдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбрд┐рдмрдЧрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдареЛрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИрдВ рдЬреЛ рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗ рд╕рдордЭреМрддрд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╕реБрдЭрд╛рд╡ рджреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдХрд┐рд╕реА рдЖрд╕рд╛рди рдмрджрд▓рд╛рд╡ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВ Werkzeug рдореЗрдВ рдХреЛрдб рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╡рд╛рдХрд┐рдл рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдмрдирд╛рдП рд░рдЦ рд░рд╣рд╛ рд╣реВрдВ?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рдЕрдкрдиреА рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, Werkzeug рдХрдорд╛рд▓ рдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдмрд╕ рдЗрди start_response() рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рджреЗрд╡ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рд╕реАрдУрдЖрд░рдПрд╕ рд╣реЗрдбрд░ рдмреНрд░реВрдЯрдлреЛрд░реНрд╕ рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рдпрд╣ рдмрд╛рд▓реЛрдВ рд╡рд╛рд▓реЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреЗрдПрд╕ рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ 500 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдкрд░ рдбреАрдмрдЧрд░ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред

@untitaker JS рдХреЛрдб рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЕрдЧрд░ 500 рддреНрд░реБрдЯрд┐ рд╣реИ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ http рд╕реНрдерд┐рддрд┐ рдХреЛрдб 500 рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдбреАрдмрдЧрд░ рдкреГрд╖реНрда рд╕реЗ рдЯреНрд░реЗрд╕рдмреИрдХ рд╡рд╣ рд╣реИ рдЬреЛ рдореИрдВ рдмрд╛рдж рдореЗрдВ рд╣реВрдВред

рдЬреЗрдПрд╕ рдХреЛрдб рднреА рдмрд╛рд▓реЛрдВ рд╡рд╛рд▓реА рд╕рдВрдХрд▓рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЪреАрдЬреЗрдВ рд╣реИрдВ, рдЬрд┐рд╕реЗ рджреВрд╕рд░реА рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ 300s+ рд╕реЗ npm run dev рд▓рдЧрддреЗ рд╣реИрдВред рдХреБрдЫ рдбрд┐рдмрдЧ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЯреНрд╡рд┐рдХ рдХрд░рдирд╛ рдпрд╛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ #1699 рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддрд╛ рд╣реИред рдЬрдмрдХрд┐ Werkzeug #1699 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХреНрд╕реЗрд╕рд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП (рдЬреИрд╕реЗ рдХреИрд╢ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП) рдФрд░ рдЗрд╕ рдкрд░ рдмрдиреЗ рдЯреВрд▓ (рдЬреИрд╕реЗ рдлреНрд▓рд╛рд╕реНрдХ-рдХреЛрд░ рдпрд╛ рдХреНрд╡рд╛рд░реНрдЯ-рд╕реАрдУрдЖрд░рдПрд╕) рдХреЛ рд╕реАрдУрдЖрд░рдПрд╕ рддрд░реНрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕