рдЬрдм рдореИрдВ рдлреНрд▓рд╛рд╕реНрдХ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрдбрд╝реА рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ 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) рдкрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рдпрд╣ рдЕрднреА рднреА рдЬреНрдпрд╛рджрд╛рддрд░ рд╕реАрдкреАрдпреВ рдмрд╛рдзреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдФрд░ рд╕рдордп рдорд┐рд▓реЗрдЧрд╛, рддреЛ рдореИрдВ рдЗрд╕реЗ рджреЗрдЦреВрдВрдЧрд╛ред
рдореЗрд░реЗ рдкрд╛рд╕ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЬрдм рдореИрдВ рдПрдХ рдЖрдИрдПрд╕рдУ рдлрд╝рд╛рдЗрд▓ (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 рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рд╣реИ
рджреЛрдиреЛрдВ рд░реЗрдкреЛ рдореГрдд рджрд┐рдЦрддреЗ рд╣реИрдВред
рддреЛ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЬреНрдЮрд╛рдд рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ?
рд╡рд╣рд╛рдБ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ ЁЯСЖ
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 рджреЗрдЦреЗрдВ рдЬреЛ рд╕рдВрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рднреА рд╕рдВрдмреЛрдзрд┐рдд рдХрд░реЗрдВрдЧреЗред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдореИрдВ рд╡рд┐рдЦрдВрдбреВ рдореЗрдВ рдзрд╛рд░рд╛ рдкрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред @siddhantgoel рдиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЗрд╕ рдорд╣рд╛рди рдЫреЛрдЯреЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред https://github.com/siddhantgoel/streaming-form-data