You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django使用Context Processors传递API数据到模板时返回<WSGIRequest: GET '/myapp/'>而非数据的问题求助

问题根源分析与修复方案

你遇到的核心问题是对Django上下文处理器(context processor)的工作原理完全误解,同时模板遍历逻辑也存在问题,下面一步步拆解并修复:

一、上下文处理器的错误使用(最关键)

Django的上下文处理器有严格的规则:

  1. 必须是接受一个request参数的函数
  2. 函数返回一个字典,作为模板的上下文变量
  3. 处理器是Django在渲染模板时自动调用的,不需要你手动用while循环去执行

你现在的my_function定义不符合要求,Django会自动把当前请求对象(WSGIRequest)传入你的函数,所以模板里的data才会变成<WSGIRequest: GET '/myapp/'>——因为你把传入的request当成了complex_data赋值给了all_data。

修复步骤1:修正上下文处理器的定义

把API数据的获取逻辑移到处理器内部,而不是靠外部传参:

# project/context_processors.py
from ttn.models import SomeClass  # 替换成你实际的导入路径
import time

def my_function(request):
    # 在这里直接获取API数据
    complex_data = SomeClass().return_data()
    return {'data': complex_data}

修复步骤2:删除错误的while循环代码

你写的那段循环调用处理器的代码完全没用,还会导致进程阻塞,直接删掉就行——Django会在每次渲染模板时自动调用这个处理器。

二、模板遍历逻辑错误

你的complex_data是类似{0:{}, 1:{}}的字典结构,直接用{% for dicts in data %}遍历的是字典的键(key)(也就是0、1这些数字),而不是字典里的具体值。需要调整遍历方式:

<div class="div-side">
    {% if data %}
        <p>{{data}}</p>
        <ul>
            <!-- 遍历字典的值,而不是键 -->
            {% for dict_item in data.values %}
                <!-- 如果每个dict_item是包含多个对象的字典,继续遍历它的值 -->
                {% for d in dict_item.values %}
                    <li>{{ d.name }} <span>{{d.someDigit|floatformat:'2'}}</span> <span>{{d.somePercent|floatformat:'2' }} %</span></li>
                {% endfor %}
            {% endfor %}
        </ul>
    {%else%}
        <p>no info</p>
    {%endif%}
</div>

三、优化建议(可选)

如果你的API请求比较耗时,每次渲染页面都调用API会拖慢响应速度,可以用Django的缓存框架缓存数据,避免频繁请求:

# project/context_processors.py
from ttn.models import SomeClass
from django.core.cache import cache

def my_function(request):
    # 从缓存获取数据,缓存5秒(和你之前的sleep时间一致)
    api_data = cache.get('cached_api_data')
    if not api_data:
        api_data = SomeClass().return_data()
        cache.set('cached_api_data', api_data, 5)
    return {'data': api_data}

最后验证

  1. 确保settings.py里的上下文处理器配置正确(你已经加了project.context_processors.my_function,这部分没问题)
  2. 重启Django服务,访问页面就能看到正确的API数据了

内容的提问来源于stack exchange,提问作者BBorisov95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:52:44