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
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!
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.
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))),
]