DJANGO:如何将传入的帖子数据作为用于流处理的类似文件的OBJ



我正在使用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)

您尚未发布代码,因此您必须按照您看到合适的方式进行适应。

还要注意,根据您的设置,这可能不是真正的流过程。您的服务器机制很可能会一次读取整个帖子主体,并将其传递给您的视图而无需一次发送线。在这种情况下,流的出现是虚幻的。

最新更新