【问题标题】:Django / Apache returns HTTP 500 RandomlyDjango / Apache 随机返回 HTTP 500
【发布时间】:2020-07-12 09:44:16
【问题描述】:

我最近一直在处理一个相当奇怪的问题。我的后端有 httpd + mod wsgi + Django 设置。

我有一个基于类的视图如下:

class ExtrasView(View):

def get(self, request):
    path = settings.BASE_DIR + "/data.json"
    with open(path, encoding='utf-8') as f:
        data = json.loads(f.read())
    return JsonResponse(data)

上述视图的 get 请求在 10 次中有 9 次都能正常工作。但是,此视图会随机给出状态为 500 的响应。根据 apache 日志,似乎响应正文长度是正确的,即文件中的数据长度。这由 apache 访问日志验证。

有人知道为什么会发生这种情况吗?我检查了错误日志,错误日志中没有任何内容。如果出现异常或其他语法错误,错误日志会打印回溯,只是在这种情况下它不会打印任何内容,所以我一无所知。不用说,正在读取的文件是100%存在的静态文件。

文件中的数据量很大,长度约为 30-40k 个字符。这会引起问题吗?如果是,那为什么 10 次中有 9 次有效?

欢迎任何cmets。

【问题讨论】:

  • 如果是静态文件,为什么不像其他静态文件一样提供它?
  • @IainShelvington 因为最终我想在发送响应之前添加一些逻辑来操作 json。
  • 文件需要是json吗?您不能将生成的对象存储在 .py 文件中或作为视图模块中的常量吗?
  • 我认为这不是一个好主意,尤其是考虑到我在帖子中提到的 JSON 的长度。此外,提供的代码是一个导致问题的准系统函数,如果我能够解决这个问题,我将拥有多个文件,并且我会根据 get 参数读取其中一个。
  • 为什么长度很重要?您已经将文件读入内存。如果您不是在每次请求时都读取和解析文件,您的视图性能会大幅提升

标签: python django apache mod-wsgi httpd.conf


【解决方案1】:

为什么不直接返回 json 文件,而不是将其加载为 json 并返回。类似的东西

def get(self, request)
    with open(path, encoding='utf-8') as f:
        return Response(f.read())

【讨论】:

  • 感谢您的回复。我可以那样做。但是,最终我想在发送响应之前添加一些逻辑来操作 json,所以我想保留这种方法。如果文件存在并且具有有效的 json 数据,您是否看到我的代码可能返回 500 的问题?
  • 我明白了,是的,可能是文件仍在被一个请求读取/锁定,而另一个请求已经在请求它。如果文件被频繁打开,请考虑将文件缓存在内存中。
  • 感谢您的洞察力。如果文件被另一个请求读取/锁定 - 它不会抛出错误而不是响应 HTTP 500 和正文内容吗?
  • 我不是 apache 专家,所以我无法完全回答这个问题。也许记录你的python aswel,看看错误是python还是apache
猜你喜欢
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 2016-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多