我正在使用python django来处理传入的Web请求,这些Web请求可以将大量JSON作为邮政数据字段之一(例如var1 = abc& json_var = lots_of_of_data&eleth_var&eleth_var&eleth_var&eleth_var&eleth_var&eNTIC= xxx(。我想以我自己的流式JSON解析器来以流式传输方式处理JSON,该解析器将类似文件的句柄作为输入参数。从https://docs.djangoproject.com/en/1.11/ref/request-response/出现,使用HttpRequest.__iter__()
,这是可行的,但是我找不到任何如何使用我自己的代码实现此目的的示例(即。不仅导入XML.Etree.Elementtree之类的库(。
基本上,我想做以下操作:
发布请求w/big json => django/python =>创建类似文件的句柄以读取post =>流URL解码器=>流式json处理器
我可以将ijson用于流式JSON处理器。如何填补两个空白,以在帖子数据中创建类似文件的句柄并将其传递给流URL解码器?宁愿不要自己滚动,但我想如果有必要,我可以。
我只能通过滚动自己的发电机和迭代器来解决此问题。有一些解决此问题的关键:
- 在发送数据块的情况下,查找如何访问帖子数据的类似文件的句柄。我能够在
request.META.get('wsgi.input')
上找到它,我通过使用此帖子将其丢弃所有请求属性 - 滚动我自己的发电机以读取类似文件的句柄和产量(varname,data_chunk(对
- 根据本文的修改版本滚动我自己的发电机,以创建一个具有正常read((操作的文件状句柄,但具有三个其他功能:
- f.varname返回正在读取的当前变量的名称
- 数据在从read(( 中传递回去之前进行URL未编码
- f.next_pair((推进句柄以读取下一个变量。因此,调用F.Read((直到使用第一个变量完成为止,然后如果有另一个变量,则F.Next_pair((将返回true,并且可以再次调用F.Read((,直到读取下一个变量
- 可以在主循环中实现进一步的流处理
将它们放在一起,看起来像:
f = request.META.get('wsgi.input')
ff = some_magic_adaptor(qs_from_file_to_generator(f))
while ff.next_pair():
print 'varname:' + ff.varname
if ff.varname == 'stream_parse_this':
parser = stream_parser(ff)
for event_results in parser:
do_something
while True:
data = ff.read(buffer_size)
if not data:
break
do_something_with_data_chunk(data)
__iter__()
只是xReadlines的包装器,又是一个循环,它使用HttpRequest
的输入流来调用并将数据呼叫并产生一条线。因此,您可以在手册中替换该示例代码,例如此
parser = MyJsonParser()
for line in (request):
parser.process(line)
您尚未发布代码,因此您必须按照您看到合适的方式进行适应。
还要注意,根据您的设置,这可能不是真正的流过程。您的服务器机制很可能会一次读取整个帖子主体,并将其传递给您的视图而无需一次发送线。在这种情况下,流的出现是虚幻的。