【问题标题】:maximum recursion depth exceeded requests超出最大递归深度的请求
【发布时间】:2018-04-09 11:40:02
【问题描述】:

目前是 python/django 的新手,如果这是一个简单的问题,请原谅我。

我正在使用请求下载 json 文件并尝试解析/显示模板中的值。

我收到以下错误: `调用 Python 对象时超出最大递归深度

代码如下:

from django import template
from django.template.loader import render_to_string
from wagtail.wagtailcore.blocks.base import Block
from django.http import HttpResponse
from django.shortcuts import render
from django.template import loader

import datetime
import urllib
import json
import requests
import requests_cache

requests_cache.install_cache('demo_cache')

register = template.Library()

# Advert snippets
@register.inclusion_tag('swd/templates/adverts.html', takes_context=True)
def adverts(context):
    return {
        'adverts': Advert.objects.all(),
        'request': context['request'],
    }

#Socialboard
#Pinterest
@register.inclusion_tag('blocks/socialboard.html')
def get_pinterest_pins():
    req = requests.get(URL)
    req_json = json.loads(req.content)

    for key, value in req_json.items():
        print (key, value)

# Related within article
@register.filter
def inject_related_after_paragraph(value, arg):
    related_list = render_to_string("related.list.html")
    paragraphs = value.split('</p>')

    if arg < len(paragraphs):
        paragraphs[arg] = related_list + paragraphs[arg]
        value = '</p>'.join(paragraphs)
    return value

@register.filter
def inject_advert_after_paragraph(value, arg):
    advert = render_to_string("adverts.html")
    paragraphs = value.split('</p>')

    if arg < len(paragraphs):
        paragraphs[arg] = advert + paragraphs[arg]
        value = '</p>'.join(paragraphs)

    return value

这会循环遍历 URL,但会一直持续到超时为止。

【问题讨论】:

  • 第三行末尾的引号可能会导致问题
  • 提供网址,我们可以测试确认。
  • 请正确格式化您的代码,并发布完整的回溯。
  • 不确定,但我猜 JSON 嵌套太深了。
  • 注意:如果您希望将响应对象转换为 json,那么它已经具有 json 方法属性。即req.json()

标签: python django python-3.x wagtail


【解决方案1】:

以下代码完美运行:

import requests
import json

req = requests.get('https://jsonplaceholder.typicode.com/posts/1')
req_json = json.loads(req.content)

for key, value in req_json.items():
    print (key, value)

根据 URL,生成的 JSON 可能“嵌套太深”。 如果错误发生在json.loads,您必须找到一个使用堆栈而不是递归调用的 JSON 解码器。如果错误发生在print 语句中,请避免打印该字典(或定义您自己的使用堆栈的函数)。

【讨论】:

  • 如果“嵌套太深”会怎样?
  • 假设 json.loads 实现是基于递归调用的,那么当结构的深度大于预定义的递归调用限制时,Python 将达到其最大递归调用深度。例如,您可以使用sys.setrecursionlimit(10000) 增加此限制,但我不建议这样做(考虑查看neopythonic.blogspot.be/2009/04/tail-recursion-elimination.html)。
  • 好的。我运行了您上面的代码,并且在最大递归深度方面也遇到了同样的问题。一定是在某个地方称呼自己,只是不确定在哪里。
  • 如果您使用的 URL 与我提供的 URL 相同并且出现错误,则表示您调用此代码的方式有问题。请使用该代码更新您的初始问题,或打开一个新问题。例如,您在最初的帖子中向我们展示的代码没有调用“get_pinterest_pins”函数,所以我认为那里缺少一些东西。
  • 我已更新原始代码以提供文件的完整视图。最终,函数应该将结果输出到模板。
猜你喜欢
  • 2018-09-24
  • 2013-12-01
  • 2017-03-24
  • 2011-12-31
  • 2017-08-09
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多