Django-第二次发送OPTIONS请求会将正文数据附加到请求方法

时间:2018-12-24 08:17:39

标签: django django-rest-framework python-3.5 django-cors-headers

问题是当体内的内容使用OPTIONS方法时,第二个请求将始终失败,并显示消息 Method Allowed 。打印日志,并显示该方法变为"/home/tukatech/rails_projects/live_tukagarments/public/system/xhtml_files/60/Cycle_Suit.xhtml"。问题是服务器重新启动后,第一个OPTIONS请求将正常通过。仅尝试过POST,并且效果很好。只有OPTIONS才有此问题。

ENV详细信息:python:3.6.5,django:2.1.3,drf:3.9.0,django-cors-headers:2.4.0

views.py(仅显示装饰,因为它没有进入块内):

"{"username":"test","password":"test"}POST /member/login/ HTTP/1.1" 405 111

中间件:

@csrf_exempt
@api_view(['POST'])
@authentication_classes([])
@permission_classes([AllowAny])
def member_login(request):
    pass

请求方法: OPTIONS POST

请求标头:

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

请求正文:

Content-Type: application/json
Origin: http://google.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER,Content-Type

两次发送OPTIONS请求后:

{"username":"superuser","password":"pass1234"}

在方法不允许发生错误后,无法向api发送任何其他请求。即使我使用的是不同的方法,它也会始终返回不允许的方法

INFO 2018-12-25 02:26:03,585 "OPTIONS /member/login/ HTTP/1.1" 200 0
WARNING 2018-12-25 02:26:10,180 Method Not Allowed: /member/login/
WARNING 2018-12-25 02:26:10,182 "{"username":"superuser","password":"pass1234"}OPTIONS /member/login/ HTTP/1.1" 405 98

尝试使用旧版本的Django。这个问题没有发生。

1 个答案:

答案 0 :(得分:1)

更新为Django>=2.1.5将解决此问题。这是由于以下问题引起的:HTTP server doesn't clear previous request data in keep-alive connection

问题在于,存在runserver请求时,用于OPTIONS的WSGI服务器的实现没有使用请求内容。并通过保持活动连接,将剩余数据作为后续请求的内容读取。