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'), ]
解决方案
- 修正视图函数参数:Django视图函数第一个参数必须是
request,否则无法正常使用模板渲染工具。 - 调整数据收集逻辑:当前只把
data['branch']存入列表,但模板需要包含branch和status的完整对象,应直接添加data。 - 使用标准
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
相关产品推荐
相关产品推荐

