web-dev-qa-db-fra.com

405 POST Méthode Non Autorisée

J'essaie de développer un fournisseur REST avec OAuth. J'utilise Django RESTFramework et DjangoOAuthToolkit. J'ai fait un GET et cela fonctionne parfaitement mais j'essaie d'utiliser un POST et le serveur répond avec {"detail": "La méthode 'POST' n'est pas autorisée."} Voici mon code:

# 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',
    ),
}

Et j'utilise ceci comme client "test":

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

Je ne comprends pas ce que la documentation REST du framework dit à propos de 405 Method not allowed

Msgstr "" "Apparu lorsqu'une requête entrante ne correspond pas à une méthode de gestionnaire dans la vue."

Merci

33
user2663554

Ce problème a été résolu dans les commentaires de user2663554

Problème résolu, il me manque une barre oblique.

Ce code de réponse (405) peut provenir de nombreux problèmes, mais il finit généralement par indiquer que vous utilisez une URL incorrecte (comme dans ce cas) ou que vous utilisez une méthode de requête incorrecte. Parfois c'est les deux!

Très souvent, je vois des gens résoudre ce problème lorsqu'ils tentent de mettre à jour une ressource individuelle (/api/res/1), mais ils utilisent la liste url (/api/res) qui ne permet pas de faire la demande. Cela peut également se produire à l'inverse, lorsque quelqu'un tente de créer une nouvelle instance, mais envoie une demande POST à l'objet individuel.

Dans certains cas, une URL incorrecte est utilisée. Les utilisateurs demandent donc une vue standard non-API et pensent qu'il s'agit d'une vue API (/res au lieu de /api/res). Donc, assurez-vous de toujours vérifier vos URL!

37
Kevin Brown
class ApiIndexView(APIView)

au lieu de cela, veuillez "importer des génériques d'importation rest_framework" et remplacez-le par

class ApiIndexView(generics.ListCreateAPIView) 

listcreateAPIview est utilisé pour les opérations get et post et createapiview est utilisé uniquement pour les méthodes post.

0
Prasad Giri

Dans mon cas, j'avais un routeur avec la même URL de base

router.register('sales', SalesViewSet, basename='sales')

et mes modèles d'URL était

urlpatterns = [
    path('', include((router.urls, app_name))),
    path('sales/analytics/', Analytics.as_view(), name='create'),
]

Je recevais une erreur 405 pour sales/analytics/. La solution était de changer l’ordre des noms de réponses. 

urlpatterns = [
    path('sales/analytics/', Analytics.as_view(), name='create'),
    path('', include((router.urls, app_name))),
]
0
nithin