405 метод POST не разрешен
Я пытаюсь создать провайдера REST с OAuth. Я использую Django RESTFramework и DjangoOAuthToolkit. Я сделал GET, и он работает отлично, но я пытаюсь использовать POST, и сервер отвечает с помощью { "detail": "Метод" POST "не разрешен." }
Это мой код:
# views.py
@api_view(['POST'])
def pruebapost(request):
usuario = User()
access_token = Token.objects.get(
key=request.POST['oauth_token']
)
usuario = access_token.user
content = {'saludo': usuario.username}
return Response(content)
# settings.py
OAUTH_AUTHORIZE_VIEW = 'principal.views.oauth_authorize'
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
),
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.OAuthAuthentication',
),
}
И я использую это как "тестовый" клиент:
import urlparse
import oauth2 as oauth
import requests
consumer_key = "clave"
consumer_secret = "secreto"
consumer = oauth.Consumer(consumer_key, consumer_secret)
client = oauth.Client(consumer)
resource_url = 'http://blablabla.pythonanywhere.com/prueba'
consumer = oauth.Consumer(key='clave', secret='secreto')
token = oauth.Token(key='e7456187a43141af8d2e0d8fa99b95b9',
secret='3wRIKoacff16tcew')
oauth_request = oauth.Request.from_consumer_and_token(
consumer,
token,
http_method='POST',
http_url=resource_url,
parameters={'hola':'pepe'}
)
oauth_request.sign_request(
oauth.SignatureMethod_HMAC_SHA1(),
consumer,
token
)
url = oauth_request.to_url()
response = requests.post(url, oauth_request.to_postdata())
print response.content
Я не понимаю, что документация REST Framework говорит о 405 Метод не разрешен
"Поднимается при поступлении входящего запроса, который не сопоставляется методу обработчика в представлении."
Спасибо
Ответы
Ответ 1
Это было решено в комментариях user2663554
Проблема решена, я пропускаю одну косую черту по URL.
Этот код ответа (405) может исходить из любого количества проблем, но обычно он заканчивается тем, что либо вы используете неправильный URL (как в этом случае), либо используете неправильный метод запроса. Иногда это оба!
Довольно часто я вижу, как люди сталкиваются с этой проблемой, когда пытаются обновить отдельный ресурс (/api/res/1
), но они используют URL-адрес списка (/api/res
), который не позволяет сделать запрос. Это также может произойти в обратном порядке, когда кто-то пытается создать новый экземпляр, но они отправляют запрос POST
к отдельному объекту.
В некоторых случаях используется неправильный URL-адрес, поэтому пользователи запрашивают стандартное представление, отличное от API, и думают, что это представление API (/res
вместо /api/res
). Поэтому обязательно проверяйте свои URL-адреса!
Ответ 2
Posting, потому что это решение для меня, хотя и очень поздно.
Чтобы проверить параметры, которые вы передаете в методе POST...
Если это объект, он должен быть в том же порядке/заклинании в ui/backend..
example- > backend
@Entity
@Table(name = "xyz", catalog = "abc")
public class PostCallCheck{
private String name;
private String lastModified;
}
on ui(angularJs)->
var RTO={
name:"",
lastModified:"" //was failing as i wrote last_modified
}
Ответ 3
class ApiIndexView(APIView)
вместо этого, пожалуйста, "импортируйте из rest_framework import generics" и измените его на
class ApiIndexView(generics.ListCreateAPIView)
в общем списке существует множество представлений. APIview используется для get и post, а createapiview используется только для методов post.
Ответ 4
В моем случае у меня был маршрутизатор с тем же базовым URL
router.register('sales', SalesViewSet, basename='sales')
и мои шаблоны URL были
urlpatterns = [
path('', include((router.urls, app_name))),
path('sales/analytics/', Analytics.as_view(), name='create'),
]
Я получил ошибку 405 для sales/analytics/
. Решение было изменить порядок urlpatterns.
urlpatterns = [
path('sales/analytics/', Analytics.as_view(), name='create'),
path('', include((router.urls, app_name))),
]