我正在开发一个gRPC微服务。
因为每个方法都必须request
首先从参数中加载一个 JSON 字符串——然后最后再次转储它,我想在类的方法上使用装饰器,以便方法本身除了return
只包含... more stuff to do ...
以下内容:
class VPPSetupService(SetupService_pb2_grpc.VPPSetupServiceServicer):
...
def method(self, request, context):
request = json.loads(request.context)
request = request["request"]
header = request["headers"]
... more stuff to do ...
response = json.dumps(response)
return SetupService_pb2.JsonContextResponse(context=response)
所以我写了一个装饰器函数。但是,我找不到此错误的解决方案:
请求 = json.loads(request.context)
UnboundLocalError:分配前引用的局部变量“请求”
错误是由此产生的:(仅作为示例,真实的东西要复杂一些)
from functools import wraps
def json_and_error(func):
@wraps(func)
def args_wrapper(*args, **kwargs): # Problem: This
request = json.loads(request.context) <<# variable is referenced
request = request["request"] # before assignment
header = request["headers"]
func(*args, **kwargs)
return func(*args, **kwargs)
return args_wrapper
class VPPSetupService(SetupService_pb2_grpc.VPPSetupServiceServicer):
...
@json_and_error
def method(self, request, context):
... more stuff to do ...
return SetupService_pb2.JsonContextResponse(context=response)
我尝试request = json.loads(args[1].context)
改用。但后来我得到这个错误:
if request["source_machine"] 和 request["dest_machine"]: TypeError:
“JsonContextRequest”对象不可下标
作为request
参数给出的输入是类型的对象。<class 'SetupService_pb2.JsonContextRequest'>
请求中的 JSON 字符串可以通过request.context
属性访问。
我认为问题与如何调用装饰器函数有关。我想如果它是在类方法的运行时调用的,那么变量 request 应该已经被分配了 request 对象。
但也许我在这里完全错了。那么你将如何解决这个问题?