<p>werkzeug.formparser рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдбрд╝реЗ рдмрд╛рдЗрдирд░реА рдЕрдкрд▓реЛрдб рдХреЗ рд╕рд╛рде рдзреАрдорд╛ рд╣реИ</p>

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

рдЬрдм рдореИрдВ рдлреНрд▓рд╛рд╕реНрдХ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрдбрд╝реА рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ multipart/form-data рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд╡реЗ рдЕрдкрд▓реЛрдб рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реАрдкреАрдпреВ рдмрд╛рдЙрдВрдб рд╣реЛрддреЗ рд╣реИрдВ (рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде 100% рд╕реАрдкреАрдпреВ рдХреА рдЦрдкрдд) I / O рдХреЗ рдмрдЬрд╛рдп рдХрд┐рд╕реА рднреА рддреЗрдЬреА рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рди рдкрд░ рдмрд╛рдзреНрдп рд╣реЛрддреЗ рд╣реИрдВред

CPU рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрди рдЕрдкрд▓реЛрдб рдХреЗ рджреМрд░рд╛рди рд▓рдЧрднрдЧ рд╕рднреА CPU рд╕рдордп werkzeug.formparser.MultiPartParser.parse_parts() рдореЗрдВ рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рдзрд┐ parse_lines() рдкреИрджрд╛рд╡рд╛рд░ _a lot_ of very small chunks, рдХрднреА-рдХрднреА рддреЛ рд╕рд┐рд░реНрдл рдмрд╛рдЗрдЯреНрд╕ :

# we have something in the buffer from the last iteration.
# this is usually a newline delimiter.
if buf:
    yield _cont, buf
    buf = b''

рддреЛ parse_parts() рдмрд╣реБрдд рд╕реЗ рдЫреЛрдЯреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ (100 рдПрдордмреА рдХреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП 2 рдорд┐рд▓рд┐рдпрди рд╕реЗ рдЕрдзрд┐рдХ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХрд▓ "рд▓рд╛рдЗрдиреЛрдВ" рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрд╢рд╛ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреЗрд╡рд▓ рдмрд╣реБрдд рд╣реА рдЫреЛрдЯрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╛ рдПрдХрд▓ рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдЙрди рд╕рд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рд╕реАрдкреАрдпреВ рдХреЛ рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИред

рдПрдХ рддреНрд╡рд░рд┐рдд рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ bytearray parse_lines() рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдХреЗ рдФрд░ рдЙрд╕ рдбреЗрдЯрд╛ рдХреЛ parse_parts() self.buffer_size рдХреЗрд╡рд▓ рдкреИрджрд╛рд╡рд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╕реНрдкреАрдб-рдЕрдк рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдВрднрд╡ рд╣реИред

buf = b''
collect = bytearray()
for line in iterator:
    if not line:
        self.fail('unexpected end of stream')

    if line[:2] == b'--':
        terminator = line.rstrip()
        if terminator in (next_part, last_part):
            # yield remaining collected data
            if collect:
                yield _cont, collect
            break

    if transfer_encoding is not None:
        if transfer_encoding == 'base64':
            transfer_encoding = 'base64_codec'
        try:
            line = codecs.decode(line, transfer_encoding)
        except Exception:
            self.fail('could not decode transfer encoded chunk')

    # we have something in the buffer from the last iteration.
    # this is usually a newline delimiter.
    if buf:
        collect += buf
        buf = b''

    # If the line ends with windows CRLF we write everything except
    # the last two bytes.  In all other cases however we write
    # everything except the last byte.  If it was a newline, that's
    # fine, otherwise it does not matter because we will write it
    # the next iteration.  this ensures we do not write the
    # final newline into the stream.  That way we do not have to
    # truncate the stream.  However we do have to make sure that
    # if something else than a newline is in there we write it
    # out.
    if line[-2:] == b'\r\n':
        buf = b'\r\n'
        cutoff = -2
    else:
        buf = line[-1:]
        cutoff = -1

    collect += line[:cutoff]

    if len(collect) >= self.buffer_size:
        yield _cont, collect
        collect.clear()

рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдореЗрд░реА 34 рдПрдордмреА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЕрдкрд▓реЛрдб рд╕рдордп рдХреЛ 4200 рдПрдордПрд╕ рд╕реЗ рдШрдЯрд╛рдХрд░ рдореЗрд░реА рдорд╢реАрди рдкрд░ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рд▓рдЧрднрдЧ 1100 рдПрдордПрд╕ рддрдХ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд▓рдЧрднрдЧ 4 рдЧреБрдирд╛ рд╡реГрджреНрдзрд┐ рд╣реИред рд╕рднреА рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдВрдбреЛрдЬ (64-рдмрд┐рдЯ рдкрд╛рдпрдерди 3.4) рдкрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред

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

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

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдореИрдВ рд╡рд┐рдЦрдВрдбреВ рдореЗрдВ рдзрд╛рд░рд╛ рдкрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред @siddhantgoel рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕ рдорд╣рд╛рди рдЫреЛрдЯреЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред https://github.com/siddhantgoel/streaming-form-data

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

рдореЗрд░реЗ рдкрд╛рд╕ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬрдм рдореИрдВ рдПрдХ рдЖрдИрдПрд╕рдУ рдлрд╝рд╛рдЗрд▓ (200 рдореАрдЯрд░) рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдкрд╣рд▓реА рдХреЙрд▓ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ.рдлреЙрд░реНрдо рдореЗрдВ 7s рд▓рдЧреЗрдВрдЧреЗ

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

(рдпрджрд┐ рдЖрдкрдХреЛ рдЙрдк-рд╕рдВрджреЗрд╢ рдХреА рд╕рд╛рдордЧреНрд░реА-рд▓рдВрдмрд╛рдИ рдкрддрд╛ рд╣реИ рддреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдХреИрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)

рдмрд╕ рдПрдХ рддреНрд╡рд░рд┐рдд рдиреЛрдЯ, рдХрд┐ рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реАрдзреЗ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХрд░рддреЗ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд application/multipart-formdata ), рддреЛ рдЖрдк рдлреЙрд░реНрдо рдкрд╛рд░реНрд╕рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реАрдзреЗ request.stream рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВред

рдореИрдВ jQuery-File- рдЕрдкрд▓реЛрдб рдХреА chunked рдЕрдкрд▓реЛрдб рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ рдЕрдкрд▓реЛрдб рдХреЗ рд╕рд╛рде рдзреАрдореА рдЕрдкрд▓реЛрдб рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд╣реИред рдЫреЛрдЯреЗ рд╡рд┐рдЦрдВрдбреВ (~ 10 рдПрдордмреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдЧрддрд┐ 0 рдФрд░ 12 рдПрдордмреА / рдПрд╕ рдХреЗ рдмреАрдЪ рдХреВрдж рдЬрд╛рддреА рд╣реИ, рдЬрдмрдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдФрд░ рд╕рд░реНрд╡рд░ 50 рдПрдордмреА / рдПрд╕ рд╕реЗ рдЕрдзрд┐рдХ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдХреНрд╖рдо рд╣реЛрддреЗ рд╣реИрдВред рдордВрджреА рд╕реАрдкреАрдпреВ рдмрд╛рдЙрдВрдб рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдкрд▓реЛрдб рдХреЗ рд╕рдорд╛рди рд╣реА рд╕рдордп рд▓реЗрддреА рд╣реИред рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ, рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдЕрдкрд▓реЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ iOS рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@Sekrause рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреИрдЪ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдЬрдЧрд░ 2.7 рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

@carbn : рдореИрдВ рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЛ collect = bytearray() рдмрджрд▓рдХрд░ рдкрд╛рдпрдерди 2.7 рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рдореМрдЬреВрджрд╛ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирдпрд╛ рдмреНрдпреЛрд░рд╛ рдмрдирд╛рддрд╛ рд╣реИред

@ рдХреНрдпреВрдЗрдмреЛрдиреЛрдмреЛ : рдпрд╣ рдкрд╣рд▓реА рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдмрджрд▓рд╛ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдПрдХ рдФрд░ рддреНрд░реБрдЯрд┐ рдереАред рдореИрдВ рдЗрд╕ рд╕рдордп рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдЪ рдХреА рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд▓реЗрдХрд┐рди IIRC рдХреА рдкреИрджрд╛рд╡рд╛рд░ рдХреЛ yield _cont, collect рд╕реЗ yield _cont, str(collect) рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛ред рдЗрд╕рдиреЗ рдХреЛрдб рдХреЛ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдФрд░ рдкреИрдЪ рдиреЗ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓рдЧрднрдЧ 30% рд╡реГрджреНрдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХреАред рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реНрдкреАрдбрдЕрдк рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдЕрднреА рднреА рдмрд╣реБрдд рдмреБрд░рд╛ рд╣реИред

рдереЛрдбрд╝реА рдФрд░ рдЬрд╛рдВрдЪ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ werkzeug.wsgi.make_line_iter рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдбрд╝рдЪрди рд╣реИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ parse_lines() рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рдкрд╛рдпрдерди 3 рдЯреЗрд╕реНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рджреЗрдЦреЗрдВ:

import io
import time
from werkzeug.wsgi import make_line_iter

filename = 'test.bin' # Large binary file
lines = 0

# load a large binary file into memory
with open(filename, 'rb') as f:
    data = f.read()
    stream = io.BytesIO(data)
    filesize = len(data) / 2**20 # MB

start = time.perf_counter()
for _ in make_line_iter(stream):
    lines += 1
stop = time.perf_counter()
delta = stop - start

print('File size: %.2f MB' % filesize)
print('Time: %.1f seconds' % delta)
print('Read speed: %.2f MB/s' % (filesize / delta))
print('Number of lines yielded by make_line_iter: %d' % lines)

рдкрд╛рдпрдерди 3.5 рдХреЗ рд╕рд╛рде 923 рдПрдордмреА рд╡реАрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

File size: 926.89 MB
Time: 20.6 seconds
Read speed: 44.97 MB/s
Number of lines yielded by make_line_iter: 7562905

рдЗрд╕рд▓рд┐рдП, рднрд▓реЗ рд╣реА рдЖрдк рдореЗрд░реЗ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдКрдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рддрдм рддрдХ рдЖрдЧреЗ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдкреВрд░реНрдгрддрд╛ рддрдХ рдЖрдк рдЕрднреА рднреА ~ 45 рдПрдордмреА / рдПрд╕ рддрдХ рд╣реА рд╕реАрдорд┐рдд рд░рд╣реЗрдВрдЧреЗ рдмрд╛рдЗрдирд░реА рдЕрдкрд▓реЛрдб рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рдХрд┐ make_line_iter рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЛ рддреЗрдЬреА рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдк ' рд╕реАрдорд╛ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрдкрдХреЗ рд▓реВрдк рдореЗрдВ 923 рдПрдордмреА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП 7.5 рдорд┐рд▓рд┐рдпрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХрдорд╛рддреНрд░ рдорд╣рд╛рди рдЕрдиреБрдХреВрд▓рди рдХреБрдЫ рдФрд░ рдХреЗ рд╕рд╛рде parse_lines() рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓ рджреЗрдЧрд╛ред рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рд╕реНрдЯреНрд░реАрдо рдХреА рдПрдХ рдмрдбрд╝реА рдмрдбрд╝реА рдЪрдВрдХ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдкрдврд╝рдирд╛ рдлрд┐рд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рд╕рдордп) (рдпрд╛ рдмрд╛рдЗрдЯреНрд╕) (рдкрд╛рдЗрдерди 3 рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рддрд╛рдХрд┐ рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рд╕реАрдорд╛ рдХрдмрд╛рдбрд╝ рдореЗрдВ рд╣реИред рдкрд╛рдпрдерди рдореЗрдВ () рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдЙрдЪреНрдЪ рдЕрдиреБрдХреВрд▓рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЛ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдкрдХреЛ рдмрд╕ рдЙрд╕ рдорд╛рдорд▓реЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рд╕реАрдорд╛ рджреЛ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдмреАрдЪ рд╕рд╣реА рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдореИрдВ рд╡рд┐рдЦрдВрдбреВ рдореЗрдВ рдзрд╛рд░рд╛ рдкрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред @siddhantgoel рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕ рдорд╣рд╛рди рдЫреЛрдЯреЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред https://github.com/siddhantgoel/streaming-form-data

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХрдорд╛рддреНрд░ рдорд╣рд╛рди рдЕрдиреБрдХреВрд▓рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ parse_lines рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдЧрд╛ ()

рдЗрд╕рдХреЗ рд▓рд┐рдП +1ред

рдореИрдВ рдХрд┐рд╕реА рднреА рдордзреНрдпрд╡рд░реНрддреА рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдкрд▓реЛрдб рдХреЛ рд╕реАрдзреЗ S3 рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд▓ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ, рд╕рдВрднрд╡рддрдГ рдмреИрдХрдкреЗрдХреНрдЪрд░ рдХреЗ рд╕рд╛рде, рдФрд░ рдореБрдЭреЗ werkzeug рдФрд░ flask рдирд┐рд░рд╛рд╢рд╛ рдорд┐рд▓ рд░рд╣реА рд╣реИред рдЖрдк рджреЛ рдкрд╛рдЗрдкреЛрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЛ рд╕реАрдзреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

@ рд▓реЗрдореНрдмрдбрд╛рдХ рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рдореБрдЭреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП рдкреИрдЪ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдХреЗ рдЦреБрд╢реА рд╣реЛрдЧреАред

@lambdaq рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдз рдмреЙрдбреА рдореЗрдВ рд╕реАрдзреЗ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ application/octet-stream рддреЛ рдлреЙрд░реНрдо рдкрд╛рд░реНрд╕рд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд┐рдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдк request.stream рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд рдХреЛрдИ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓реЗрдВ рдЖрджрд┐) ред

рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдереА рд╡реЗрд░реНрдХреЗрдЬ рдлреЙрд░реНрдо рдлреЙрд░реНрдо рдкрд╛рд░реНрд╕рд░ рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдЬрд╛рдирдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╛рдордЧреНрд░реА рдХреА рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рдВрдмрд╛рдИ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИ ред

рдпрд╣ рдЖрдкрдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝реЙрд░реНрдо рдбреЗрдЯрд╛ рдкрд░ рдЕрдзрд┐рдХрддрдо рд╕рд╛рдордЧреНрд░реА рд▓рдВрдмрд╛рдИ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдмрдбрд╝реА рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рд╣рдордиреЗ рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдХреЗ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ред рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдз рдмреЙрдбреА рдореЗрдВ рд╕реАрдзреЗ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдСрдХреНрдЯреЗрдЯ-рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдлреЙрд░реНрдо рдкрд╛рд░реНрд╕рд░ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрд┐рдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдк рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдирд╣реАрдВред рдпрд╣ рдорд▓реНрдЯреАрдкрд╛рд░реНрдЯ рдХреЗ рд╕рд╛рде рд╕рд┐рд░реНрдл рд╕рд╛рдорд╛рдиреНрдп рдлреЙрд░реНрдо рдЕрдкрд▓реЛрдб рд╣реИред

рдореБрдЭреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП рдПрдХ рдкреИрдЪ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдореИрдВрдиреЗ рдЬрдирд░реЗрдЯрд░ рдХреЗ send() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ werkzeug.wsgi.make_line_iter рдпрд╛ parse_lines() рд╣реИрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЗрд╕рд▓рд┐рдП рд╣рдо рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдкреВрд░реЗ рд╡рд┐рдЦрдВрдбреВ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _iter_basic_lines() рдХрд╛ рд╕рдВрдХреЗрдд рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рдирд┐рдХрд▓рд╛ред

рдЕрд╕рд▓ рдореЗрдВ, рдЦрд░рдЧреЛрд╢ рдкреВрд░реЗ 'itertools.chain' object has no attribute 'send' .... ЁЯШВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ C (рдпрд╛ рд╕рд╛рдЗрдерди рдЖрджрд┐) рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рджреЗрд╢реА рд╕реНрдкреАрдбрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рдХрд┐рддрдирд╛ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд░реНрдз-рдмрдбрд╝реА (рдХреБрдЫ 100 рдПрдордмреА, рд▓реЗрдХрд┐рди рдХрдИ рдЬреАрдмреА рдореЗрдВ рдмрдбрд╝реА рдирд╣реАрдВ) рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдмрд┐рдирд╛ рдпрд╣ рдмрджрд▓реЗ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ (рдпрд╛рдиреА рдмрдлрд░рд┐рдВрдЧ рдХреЗ рдмрдЬрд╛рдп рд╕реАрдзреЗ рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ) - рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ рдУрд╡рд░рдХрд┐рд▓ рдФрд░ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд░реНрддрдорд╛рди рдХреБрдЫ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рд╢рд╛рдпрдж рдЙрдирдХреЗ рд▓рд┐рдП рдареАрдХ рд╣реИ) рд▓реЗрдХрд┐рди рдЪреАрдЬреЗрдВ рддреЗрдЬреА рд╕реЗ рдмрдирд╛рдирд╛ рд╣рдореЗрд╢рд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ рд╣реИ!

рдПрдХ рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди multipart nginx рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рд╣реИ

https://www.nginx.com/resources/wiki/modules/upload/

рджреЛрдиреЛрдВ рд░реЗрдкреЛ рдореГрдд рджрд┐рдЦрддреЗ рд╣реИрдВред

рддреЛ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЬреНрдЮрд╛рдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ?

рд╡рд╣рд╛рдБ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ ЁЯСЖ

Uwsgi рдХреЗ рддрд╣рдд, рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ chunked_read() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдЖрддреЗ рд╣реА рд╕реНрдЯреНрд░реАрдо рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ 99% рд╕рдордп рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рдЕрднреА рддрдХ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╣реИред рдЖрдЙрдЯ-рдСрдл-рдж-рдмреЙрдХреНрд╕ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдлреЙрд░реНрдо рдкрд╛рд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВред Python2 рдХреЗ рддрд╣рдд рдпрд╣ рдзреАрдорд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЕрдкрдирд╛ рд░реЛрд▓ рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рддреЗрдЬ рд╣реИред :)

рдКрдкрд░ рд╕реЗ рдЙрджреНрдзрд░рдг:

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрджрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рдореБрдЭреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП рдкреИрдЪ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдХреЗ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рдЗрд╕ рд╕рдордп рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдк рд╕рдордп рдмрд┐рддрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдПрдХ рдкреИрдЪ рдпреЛрдЧрджрд╛рди

@sdizazzo

рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ рдХрд┐ рдореИрдВ рдЕрднреА рддрдХ рдиреАрдЪреЗ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ

рдХреНрдпрд╛ рдЖрдк рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ-рдлрд╝реЙрд░реНрдо-рдбреЗрдЯрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛ рдХрд┐ рдмрдЧ рдХреНрдпрд╛ рд╣реИред

рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдзреАрдореА рдЧрддрд┐ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдиреЗ рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдз рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЛ рд░реЛрдХрд╛ рдЬрд┐рд╕рд╕реЗ nomad рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЗрд╕реЗ рдорд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред

рдореЗрд░рд╛ рдлрд┐рдХреНрд╕ sleep(0) рдореЗрдВ werkzeug/formparser.py:MutlipartParser.parse_lines() рдЬреЛрдбрд╝рдирд╛ рдерд╛:

            for i, line in enumerate(iterator):
                if not line:
                    self.fail('unexpected end of stream')

                # give other greenlets a chance to run every 100 lines
                if i % 100 == 0:
                    time.sleep(0)

рдпрджрд┐ рдЖрдк рдЗрд╕ рдкреИрдЪ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ unexpected end of stream рдЦреЛрдЬ рдХрд░реЗрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдореИрдВ рд╡рд┐рдЦрдВрдбреВ рдореЗрдВ рдзрд╛рд░рд╛ рдкрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред @siddhantgoel рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕ рдорд╣рд╛рди рдЫреЛрдЯреЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред https://github.com/siddhantgoel/streaming-form-data

рджреВрд╕рд░рд╛ рд╣реИред
рдпрд╣ 10 рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░рдХ рджреНрд╡рд╛рд░рд╛ рдореЗрд░реЗ рдлреНрд▓рд╛рд╕реНрдХ рдРрдк рдкрд░ рдлрд╝рд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХреЛ рдЧрддрд┐ рджреЗрддрд╛ рд╣реИ

@ рд╕рд┐рджреНрджрд╛рдВрддрдЧреЗрд▓
рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ-рдлреЙрд░реНрдо-рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЗ рдлрд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЕрдВрдд рдореЗрдВ рдЕрдЪреНрдЫреА рдЧрддрд┐ рдкрд░ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдЖрдХрд╛рд░ рдХреА рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдмрд┐рдирд╛ рдореЗрдореЛрд░реА рднрд░реЗ!

# 1788 рджреЗрдЦреЗрдВ рдЬреЛ рд╕рдВрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рднреА рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдВрдЧреЗред

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

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

alexgurrola picture alexgurrola  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mrx23dot picture mrx23dot  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mhelmetag picture mhelmetag  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sorenh picture sorenh  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

paihu picture paihu  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ