Django 意外的 405 响应
Django Unexpected 405 Response
问题
我的 Django 应用程序经常响应 405 Method Now Allowed
即使
它正在 api 开发环境中工作。但是如果我重新启动
开发服务器 (python manage.py runserver
) 它有效。
环境
- macOS 莫哈韦沙漠 10.14
- Python 3.6.4(通过 Pipenv 隔离环境)
- Django 2.1.4
- djangorestframework 3.8.2
API代码
settings/urls.py(根 url 文件)
from django.urls import path, include
import my_account.urls
urlpatterns = [
path('account/', include(my_account.urls, namespace='account_v1')),
]
my_account/urls.py
from django.urls import path
from .apps import MyAccountConfig
from .views import TokenView
app_name = MyAccountConfig.name
urlpatterns = [
path('token/', TokenView.as_view()),
]
my_account/views.py
from rest_framework.views import APIView
class TokenView(APIView):
def post(self, request):
# Some Business-Logic Code
pass
日志
发生 405 时记录
System check identified no issues (0 silenced).
December 07, 2018 - 11:22:54
Django version 2.1.4, using settings 'my_server.settings.staging'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
.env Applied
[07/Dec/2018 11:24:30] "OPTIONS /account/token/ HTTP/1.1" 200 0
[07/Dec/2018 11:24:30] "{"email":"email@hidden.com","password":"hidden_password"}POST /account/token/ HTTP/1.1" 405 66
工作时登录
System check identified no issues (0 silenced).
December 07, 2018 - 11:48:01
Django version 2.1.4, using settings 'my_server.settings.staging'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
.env Applied
[07/Dec/2018 11:48:08] "OPTIONS /account/token/ HTTP/1.1" 200 0
[07/Dec/2018 11:48:09] "POST /account/token/ HTTP/1.1" 200 517
在 chrome 网络选项卡中,请求 200 和 405 之间没有区别。
HTTP_405_METHOD_NOT_ALLOWED
状态码405表示您正在以不允许的方式请求。
根据您的代码,您将令牌 API 定义为可通过 post
方法访问。
看看这个日志:
[07/Dec/2018 11:48:09] "POST /account/token/ HTTP/1.1" 200 517
在此您发送明确的 POST
请求,这样就可以了。但请查看提供的失败案例日志:
[07/Dec/2018 11:24:30] "{"email":"email@hidden.com","password":"hidden_password"}POST /v1/account/token/ HTTP/1.1" 405 66
1- 由于某些原因,在您的 UI 中,您正在使用方法 {"email":"email@hidden.com","password":"hidden_password"}POST
!!!! 发送请求。
2- 并且您正在向 /v1/account/token/
API 端点发送请求,该端点根本没有在您的网址中注册(根据您提供给我们的信息)
我在过去的两个月里遇到了同样的错误,最终我在最后解决了。
错误:
当用户令牌过期时,我们将收到带有未经授权消息的 401 状态代码,当发生这种情况时,下一个 API 也会被中断 returns 405 Method Not Allowed 作为错误。
解决方案 :
Django 版本 2.1 中存在错误问题,您必须将 Django 版本升级到 2.2。
之后检查这个错误,它不会出现。
问题
我的 Django 应用程序经常响应
405 Method Now Allowed
即使 它正在 api 开发环境中工作。但是如果我重新启动 开发服务器 (python manage.py runserver
) 它有效。环境
- macOS 莫哈韦沙漠 10.14
- Python 3.6.4(通过 Pipenv 隔离环境)
- Django 2.1.4
- djangorestframework 3.8.2
API代码
settings/urls.py(根 url 文件)
from django.urls import path, include import my_account.urls urlpatterns = [ path('account/', include(my_account.urls, namespace='account_v1')), ]
my_account/urls.py
from django.urls import path from .apps import MyAccountConfig from .views import TokenView app_name = MyAccountConfig.name urlpatterns = [ path('token/', TokenView.as_view()), ]
my_account/views.py
from rest_framework.views import APIView class TokenView(APIView): def post(self, request): # Some Business-Logic Code pass
日志
发生 405 时记录
System check identified no issues (0 silenced). December 07, 2018 - 11:22:54 Django version 2.1.4, using settings 'my_server.settings.staging' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C. .env Applied [07/Dec/2018 11:24:30] "OPTIONS /account/token/ HTTP/1.1" 200 0 [07/Dec/2018 11:24:30] "{"email":"email@hidden.com","password":"hidden_password"}POST /account/token/ HTTP/1.1" 405 66
工作时登录
System check identified no issues (0 silenced). December 07, 2018 - 11:48:01 Django version 2.1.4, using settings 'my_server.settings.staging' Starting development server at http://0.0.0.0:8000/ Quit the server with CONTROL-C. .env Applied [07/Dec/2018 11:48:08] "OPTIONS /account/token/ HTTP/1.1" 200 0 [07/Dec/2018 11:48:09] "POST /account/token/ HTTP/1.1" 200 517
在 chrome 网络选项卡中,请求 200 和 405 之间没有区别。
HTTP_405_METHOD_NOT_ALLOWED
状态码405表示您正在以不允许的方式请求。
根据您的代码,您将令牌 API 定义为可通过 post
方法访问。
看看这个日志:
[07/Dec/2018 11:48:09] "POST /account/token/ HTTP/1.1" 200 517
在此您发送明确的 POST
请求,这样就可以了。但请查看提供的失败案例日志:
[07/Dec/2018 11:24:30] "{"email":"email@hidden.com","password":"hidden_password"}POST /v1/account/token/ HTTP/1.1" 405 66
1- 由于某些原因,在您的 UI 中,您正在使用方法 {"email":"email@hidden.com","password":"hidden_password"}POST
!!!! 发送请求。
2- 并且您正在向 /v1/account/token/
API 端点发送请求,该端点根本没有在您的网址中注册(根据您提供给我们的信息)
我在过去的两个月里遇到了同样的错误,最终我在最后解决了。
错误:
当用户令牌过期时,我们将收到带有未经授权消息的 401 状态代码,当发生这种情况时,下一个 API 也会被中断 returns 405 Method Not Allowed 作为错误。
解决方案 :
Django 版本 2.1 中存在错误问题,您必须将 Django 版本升级到 2.2。
之后检查这个错误,它不会出现。