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

Django中如何将gRPC响应数据传递至HTML模板渲染?

问题:Django中gRPC响应数据无法正确渲染到HTML模板

我发起gRPC调用并将响应转为JSON,目标是把数据传递到HTML模板里自定义渲染(比如填充表格),但现在只能让页面直接打印JSON,达不到预期效果,已经折腾一整天了。

我尝试过这些返回方式(不同时使用):

return HttpResponse(branch_list)
return HttpResponse(response, 'src/grpc.html', {'branch_list', branch_list})
return HttpResponse(response, 'src/grpc.html', {'branch_list',branch_list})
return render(request, 'src/grpc.html', {'branch_list': response})
return JsonResponse(result, safe=False)
return HttpResponse(json.dumps(branch_list), 'src/grpc.html', content_type="application/json")

我的views.py函数定义:

...
def grpc(client_stub, payload_project_id=payload_project_id, grpc_stub_method=grpc_stub_method, metadata_okta_token_and_env=metadata_okta_token_and_env):
    client_stub = BitcClient(server, port)

    request = pb2.ListBranchesRequest(context=payload_project_id)

    response = client_stub.get_grpc_stub(grpc_stub_method).ListBranches(request=request,
                                                                        metadata=metadata_okta_token_and_env)
    #print(response)
    json_obj = MessageToJson(response)
    result = json.loads(json_obj)
    for data in result['branches']:
        # print(data['branch'])
        branch_list.append(data['branch'])

    return <need help here>??????????

我希望在grpc.html模板里遍历branch_list,渲染分支名称和状态,模板代码:

{% if branch_list %}
    <ul>
    {% for branch in branch_list %}
        <li>{{ branch.branch }}: {{ branch.status }}</li>
    {% endfor %}
    </ul>
{% else %}
    <p>No branches were found.</p>
{% endif %}

urls.py配置:

from django.urls import path

from . import views

urlpatterns = [
    path('', views.grpc, name='grpc'),
]

解决方案

  1. 修正视图函数参数:Django视图函数第一个参数必须是request,否则无法正常使用模板渲染工具。
  2. 调整数据收集逻辑:当前只把data['branch']存入列表,但模板需要包含branch和status的完整对象,应直接添加data。
  3. 使用标准render方法:render是Django渲染模板的标准方式,需传入request、模板路径和包含变量的上下文字典。

修改后的views.py代码:

# 第一个参数改为request,避免和gRPC请求变量冲突,重命名gRPC请求变量
def grpc(request, client_stub=None, payload_project_id=payload_project_id, grpc_stub_method=grpc_stub_method, metadata_okta_token_and_env=metadata_okta_token_and_env):
    client_stub = BitcClient(server, port)

    grpc_request = pb2.ListBranchesRequest(context=payload_project_id)

    response = client_stub.get_grpc_stub(grpc_stub_method).ListBranches(request=grpc_request,
                                                                        metadata=metadata_okta_token_and_env)
    json_obj = MessageToJson(response)
    result = json.loads(json_obj)
    branch_list = []  # 初始化局部列表,避免全局变量污染
    for data in result['branches']:
        # 存入完整的data对象,保留branch和status字段
        branch_list.append(data)

    # 用render渲染模板,传入上下文变量
    return render(request, 'src/grpc.html', {'branch_list': branch_list})

关键说明

  • 视图函数必须以request作为首参数,这是Django视图的规范要求,否则无法传递请求上下文。
  • 模板中需要branch和status两个字段,因此不能只提取data['branch'],要保留完整的分支数据对象。
  • render函数的正确格式为render(request, 模板路径, {"变量名": 数据}),上下文字典的键要和模板中使用的变量名完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:55:21