Подтвердить что ты не робот

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 Метод не разрешен

"Поднимается при поступлении входящего запроса, который не сопоставляется методу обработчика в представлении."

Спасибо

4b9b3361

Ответ 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))),
]