从同一服务器调用Django rest framework终结点时出错

2024-09-29 06:26:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个API端点,比如说sampleapi.domain.com/api/v1/1,它在本地(127.0.0.1)和在线sampleapi-dev.domain.com的开发中工作得很好,但是当我从进行调用的服务器sampleapi.domain.com调用同一个端点sampleapi.domain.com/api/v1/1时,我得到了

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

这是不寻常的,因为相同的代码在开发和在线工作。返回的HTTP代码是500而不是200(对于本地测试和开发服务器中的相同API调用返回的代码)

当我改变开始的方式时gunicorn

gunicorn --certfile=crt --keyfile=key --bind 0.0.0.0:8000 a.wsgi

gunicorn --certfile=crt --keyfile=key --bind 0.0.0.0:8000 a.wsgi -w 1 --threads 2

这似乎解决了错误,但我不完全确定为什么会这样

是因为单个线程忙于加载API所在的页面,所以无法调用API吗? 如果这不是原因,原因可能是什么

File "/path/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 47, in inner
 response = get_response(request)
File "/path/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 181, in _get_response
 response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/path/venv/lib/python3.6/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
 return view_func(request, *args, **kwargs)
File "/path/venv/lib/python3.6/site-packages/django/views/decorators/http.py", line 40, in inner
return func(request, *args, **kwargs)
File "/path/png/script.py", line 128, in get_api
 return response.json()
File "/path/venv/lib/python3.6/site-packages/requests/models.py", line 910, in json
 return complexjson.loads(self.text, **kwargs)
File "/usr/lib64/python3.6/json/__init__.py", line 354, in loads
 return _default_decoder.decode(s)
File "/usr/lib64/python3.6/json/decoder.py", line 339, in decode
 obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib64/python3.6/json/decoder.py", line 357, in raw_decode
 raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

get_api

def get_api():
    url = 'https://sampleapi.domain.com/api/v1/1'
    params = {'Authorization': 'Token ' + os.environ.get("token")}
    try:
        response = requests.get(url, headers=params)
    except requests.exceptions.RequestException:
        return "Could not grab api text."

    return response.json()

Tags: pathinpycomapijsongetreturn
2条回答

试着使用它

gunicorn Config.wsgi:application  bind 0.0.0.0:8000 -w 3

好像是什么

response = requests.get(url, headers=params)

有时返回,不是一个json

如果您在调试时遇到困难,并且此问题仅在某些环境中发生,在这些环境中,您无法依赖调试器,并且依赖于第三方响应,那么只需在那里添加日志即可

import logging

logger = logging.getLogger(__name__)


def get_api():
    url = 'https://sampleapi.domain.com/api/v1/1'
    params = {'Authorization': 'Token ' + os.environ.get("token")}
    try:
        response = requests.get(url, headers=params)
    except requests.exceptions.RequestException:
        return "Could not grab api text."
    
    # .debug or .info or whatever level of logging you use
    logger.debug(f"Status code is {response.status_code} and text is {response.text}")

    return response.json()

如您所述,如果是500,并且返回一个通用服务器错误,您将无法从客户端调试该问题,因为它没有指向任何潜在的解决方案

如果您可以看到Django应用程序日志,只需查看它返回的内容即可。如果看不到任何错误,请添加sentry。如果您不能这样做,请询问服务器的控制者

它可能是ALLOWED_HOSTS或cors

相关问题 更多 >