python - 石墨烯在其响应中发送 Python 错误消息 - 我如何告诉它更加离散?
问题描述
我已经使用 Django 和 Graphene 在 Python 中实现了一个 GraphQL 服务器。我有使用模型形式的突变,大致如下所示:
def mutate(self, info, **kwargs):
form = MyModelForm(kwargs)
if form.is_valid():
form.save()
return MyMutation(instance=form.instance)
raise GraphQLError(json.dumps(form.errors))
也就是说,如果表单验证失败,将表单错误作为 JSON 字符串发送,以便前端可以整齐地解包错误。这一切都很好。
但是,如果还有其他错误——比如数据库出现问题,当表单尝试保存时抛出异常,或者存在拼写错误,那么石墨烯的默认行为是获取错误消息并将其传输到 GraphQL错误列表给客户端。这意味着任何检查响应的人都可以看到来自服务器的原始错误消息。这似乎不明智 - 如果该错误消息包含我不想泄漏的信息怎么办?显然解决方案是创建一个不抛出异常的应用程序,但我无法预料到所有事情。有没有办法告诉石墨烯更加离散,并在错误不是由我明确引发 GraphQLError 而不是仅仅将所有内容发送到客户端时提供通用错误消息?
当前正在发生的事情的一个例子:
{"errors":[{"message":"name 'LogiForm' is not defined","locations":[{"line":2,"column":3}],"path":["login"]}],"data":{"login":null}}
这个特定示例不是安全问题,在生产之前很容易被发现,但这只是一个示例 - 即使不是安全威胁,我的服务器让客户端查看其内部错误消息似乎有点不专业.
我目前正在用装饰器解决这个问题:
def hide_error(mutate):
def new_func(*args, **kwargs):
try:
return mutate(*args, **kwargs)
except Exception as e:
raise e if isinstance(e, GraphQLError) else Exception("Error.")
return new_func
但是有更好的方法吗?有没有办法“应该”解决这个问题?
解决方案
推荐阅读
- ios - 即使只有其他用户点击个人资料,也只有我的个人资料可见
- java - 切换类型时应该抛出哪个异常?
- r - 如何在 Shiny 中显示通过 fileInput 上传的视频?
- python - Discord.py 新成员消息
- python - Secsh 通道 0 打开失败:打开失败:管理禁止 pythonanywhere
- html - Word Press URL中的(OBJ)符号?
- hyperledger-fabric - 我可以在不同的计算机上加入两个组织,每个组织一个订购者吗?使用 Minifabric - Hyperledger Fabric
- java - 理解 Drawable.Callback,invalidateDrawable 和 invalidate() 的区别
- python - 将numpy数组插入sqlite3数据库
- token - BEP20:转账金额超过限额