我正在尝试使用 Django Rest 框架构建一个 Web 应用程序。
当我在本地主机 127.0.0.0/8000 上运行应用程序时,它工作正常。但是当我将其部署在 EC2 服务器上时,POST 方法返回 500 服务器错误。
这是views.py中的post方法之一-
class customer_location(APIView):
def post(self, request, *args, **kwargs):
customer_id = json.loads(request.body).get('customer_id')
queryset = customers.objects.filter(cid= customer_id)
serialize = customer_details(queryset, many=True)
return Response(serialize.data, status=status.HTTP_200_OK)
urls.py 是这样的 -
from django.conf.urls import include, url
from django.urls import path
from rest_framework import routers
from . import views
urlpatterns = [
url(r'^customer_location/$', views.customer_location.as_view(), name='customer_location'),
]
DEBUG 模式设置为 False,并将 EC2 实例 IP 地址添加到 ALLOWED_HOSTS 中。
GET 方法工作正常,但 POST 方法出错。
根据哨兵错误日志,问题是 -
raise JSONDecodeError("Expecting value", s, err.value) from None
这是 view.py 中的这一行 -
customer_id = json.loads(request.body).get('customer_id')
EC2实例的入站规则允许访问HTTP、HTTPS、SSH、PostgreSQL以及端口8000的自定义TCP规则。
当我从终端运行curl命令时,我可以获得POST方法的值-
curl --header "Content-Type: application/json" --request POST --data '{"customer_id":"1"}' http://ec2_ip/customer_location/
output -
[{"cid":"1","name":"Rachel". "location":"NYC"}]
curl 命令返回同一 EC2 服务器的 POST 方法的值,而 EC2 服务器上的 api 端点返回 500 服务器错误。
我该如何解决这个问题?
最佳答案
要解决 cors
问题,您应该在应用中安装 django-cors-headers
。
- 首先通过
pip install django-cors-headers
安装它 - 在 settings.py 的
INSTALLED_APPS
中添加corsheaders
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',
.....
]
- 在 settings.py 中的
MIDDLEWARE
顶部添加corsheaders.middleware.CorsMiddleware
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
....
]
- 在 settings.py 内的任意位置添加以下行
CORS_ORIGIN_ALLOW_ALL = True
- 最后在settings.py中添加这一行
ALLOWED_HOSTS = ['*']
如果您的项目使用此配置正常运行,请将“*”替换为您的 IP 地址。就是这样!
关于python - Django Rest 框架中的 POST 方法在 EC2 实例上返回服务器错误 500,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57986307/