python - Django Rest 框架中的 POST 方法在 EC2 实例上返回服务器错误 500

标签 python django amazon-ec2 django-rest-framework internal-server-error

我正在尝试使用 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

  1. 首先通过pip install django-cors-headers安装它
  2. 在 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/

    相关文章:

    python - 从 Google BigQuery 中过滤掉或替换非英文字符

    django - 如何使用 OAuth2 创建用户?

    linux - 在 EC2 上根据请求更改 Tiny 代理 IP

    r - 如何在 headless 环境(EC2实例)中使用googlesheets包进行身份验证?

    python - 属性错误 : can't set attribute in python

    Python 在日期时间接近纪元的 Windows 上崩溃

    python - 根据每个列表的第一个元素从列表列表中删除一个项目

    android - 向 Django 后端验证 Android 或 iPhone 应用程序

    javascript - 提交后如何隐藏表单?

    Hadoop 纱 2.2.0 "Text File Busy Errors"