【问题标题】:How to response a Django request from nested function?如何响应嵌套函数的 Django 请求?
【发布时间】:2020-07-13 10:05:44
【问题描述】:

假设我想在继续之前测试几个数据,如果失败,则直接向发出请求的人返回错误响应。

我有这个

def gerUserInfo(request):
    if request.user.is_authenticated:
        data = json.loads(request.body.decode('utf-8'))
    
        info1 = data.get("info1") if data.get("info1") else ""
        if info1.strip() == "": 
            return JsonResponse({"status":"fail"})
        else: 
            #proceed...
        
        info2 = data.get("info2") if data.get("info2") else ""
        if info2.strip() == "": 
            return JsonResponse({"status":"fail"})
        else: 
            #proceed...
        
        ...

我想要这个

def gerUserInfo(request):
  def secureGetData(data):
    try:
        data = data if data else ""
        if data.strip() == "": return JsonResponse({"status":"fail"})
        else: return data
    except:
        return JsonResponse({"status":"fail"})
        
        
  if request.user.is_authenticated:
    data = json.loads(request.body.decode('utf-8'))
    info1 = secureGetData(data.get("info1"))
    info2 = secureGetData(data.get("info2"))
    ...
    # i can proceed without worring...

我希望服务器响应来自 secureGetData() 的请求,但从来没有。

编辑:

基本上我要做的是从嵌套函数(如 JS 中的here)返回一个循环,我想用返回来做,我什至不确定它在 JS 中是否可行。 ..

【问题讨论】:

  • return JsonResponse({"status":"fail"})
  • 这是我的代码中的内容,只是一个错误。我认为secureGetData()试图将服务器响应存储在变量上。
  • 你可以使用return secureGetData(data.get("info2")),但是你需要把return data换成return JsonResponse(data)这样的东西
  • 谢谢,但我真正希望该函数为我做的是回答查询或返回一些我可以在稍后自己响应请求之前使用的数据,因此return data 行。
  • 链接失效

标签: django function jsonresponse


【解决方案1】:

看起来你可以在你的方法上使用一些重构。

您应该将提取/验证数据的逻辑与您将从中创建的响应分开。

对于名为 secureGetData 的函数返回 JsonResponse 而不是类似数据的结构没有意义。看起来您试图通过更改您的第一个实现来避免重复自己,这是正确的,但您可能希望调用一个函数来获取有效数据或根本没有数据,并使用它来决定函数返回哪个响应。

def gerUserInfo(request):
  def validate_data(data):
    # validate all your data. and return a dict ({} if data is not valid)
        
        
  if request.user.is_authenticated:
    data = json.loads(request.body.decode('utf-8'))
    data = validate_data(data)
    if data:
      # proceed without worring...
    else:
      # return JsonResponse({"status":"fail"})

【讨论】:

  • 所以如果我不明白这一行return JsonResponse({"status":"fail"}) 不能被 validate_data 执行?
  • 嗯.. 它肯定可以,但是这种方法会迫使您检查嵌套函数的返回值的类型。我的建议是您使用嵌套函数来验证您的数据并返回您在请求中所期望的值,如果这些值不可用,则返回一个空字典,您可以稍后将其评估为 bool ( gerUserInfo),然后决定是要返回带有失败状态的 JsonResponse 还是在知道数据良好的情况下继续执行例程。
  • 谢谢,但实际上我已经考虑过这种方法,这可能是我最终会做的。但我问这个问题的原因是我希望你提到的make the decision 是由validate_data 制作的,而不是回到gerUserInfo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 2023-01-08
  • 2012-11-16
  • 1970-01-01
相关资源
最近更新 更多