Je développe une API en utilisant Django Rest Framework. J'essaye de lister ou de créer un objet "Order", mais lorsque j'essaye d'accéder à la console, cela me donne cette erreur:
{"detail": "Authentication credentials were not provided."}
Vues:
from django.shortcuts import render
from rest_framework import viewsets
from django.contrib.auth.models import User
from rest_framework.renderers import JSONRenderer, YAMLRenderer
from rest_framework.response import Response
from rest_framework.views import APIView
from order.models import *
from API.serializers import *
from rest_framework.permissions import IsAuthenticated
class OrderViewSet(viewsets.ModelViewSet):
model = Order
serializer_class = OrderSerializer
permission_classes = (IsAuthenticated,)
Sérialiseur:
class OrderSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Order
fields = ('field1', 'field2')
Et mes URL:
# -*- coding: utf-8 -*-
from django.conf.urls import patterns, include, url
from django.conf import settings
from django.contrib import admin
from django.utils.functional import curry
from django.views.defaults import *
from rest_framework import routers
from API.views import *
admin.autodiscover()
handler500 = "web.views.server_error"
handler404 = "web.views.page_not_found_error"
router = routers.DefaultRouter()
router.register(r'orders', OrdersViewSet)
urlpatterns = patterns('',
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token'),
url(r'^api/', include(router.urls)),
)
Et puis j'utilise cette commande dans la console:
curl -X GET http://127.0.0.1:8000/api/orders/ -H 'Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55'
Et l'erreur dit:
{"detail": "Authentication credentials were not provided."}
python
django
django-rest-framework
Marcos Aguayo
la source
la source
curl -H "Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55" http://127.0.0.1:8000/api/orders/
Réponses:
Si vous exécutez Django sur Apache en utilisant mod_wsgi, vous devez ajouter
dans votre httpd.conf. Sinon, l'en-tête d'autorisation sera supprimé par mod_wsgi.
la source
httpd.conf
. de sorte que vous devez ajouterWSGIPassAuthorization On
à/etc/apache2/apache2.conf
Résolu en ajoutant "DEFAULT_AUTHENTICATION_CLASSES" à mes paramètres.py
la source
'rest_framework.authentication.TokenAuthentication'
auDEFAULT_PERMISSION_CLASSES
lieu deDEFAULT_AUTHENTICATION_CLASSES
SessionAuthentication
est activé par défaut et fonctionne avec les cookies de session standard, il est donc probable que votre application Angular (ou un autre framework JS) fonctionnait en raison de l'authentification de session par défaut.Cela m'aide sans "DEFAULT_PERMISSION_CLASSES" dans mes paramètres.py
la source
SessionAuthentication
était ce qu'il fixe pour moiJuste pour d' autres personnes débarquant ici avec la même erreur, ce problème peut survenir si votre
request.user
estAnonymousUser
et non l'utilisateur droit qui est effectivement autorisé à accéder à l'URL. Vous pouvez le voir en imprimant la valeur derequest.user
. S'il s'agit bien d'un utilisateur anonyme, ces étapes peuvent vous aider:Assurez-vous que vous avez
'rest_framework.authtoken'
dansINSTALLED_APPS
votresettings.py
.Assurez-vous que vous avez ceci quelque part dans
settings.py
:Assurez-vous que vous disposez du bon jeton pour l'utilisateur connecté. Si vous ne disposez pas du jeton, découvrez comment l'obtenir ici . Fondamentalement, vous devez faire une
POST
demande à une vue qui vous donne le jeton si vous fournissez le nom d'utilisateur et le mot de passe corrects. Exemple:Assurez-vous que la vue à laquelle vous essayez d'accéder contient les éléments suivants:
Utilisez
curl
maintenant de cette façon:Exemple:
la source
request.user
? Il semble que la méthode POST d'une vue basée sur les classes ne soit jamais traitée. Où puis-je essayer d'imprimer l'utilisateur?Si vous jouez dans la ligne de commande (en utilisant curl, ou HTTPie, etc.), vous pouvez utiliser BasicAuthentication pour tester / utiliser votre API
Vous pouvez ensuite utiliser curl
ou httpie (c'est plus facile pour les yeux):
ou quelque chose d'autre comme Advanced Rest Client (ARC)
la source
J'ai aussi fait face à la même chose depuis que j'ai manqué d'ajouter
dans ma classe de vue API.
En plus de ce qui précède, nous devons informer explicitement Django de l' authentification dans le fichier settings.py.
la source
L'ajout de SessionAuthentication dans settings.py fera le travail
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', ), }
la source
Comme il s'agit d'une session de connexion, vous devez donc fournir vos informations d'identification, alors
127.0.0:8000/admin
admin et connectez-vous plus tard, cela fonctionnera bienla source
Pour moi, j'ai dû ajouter à mon en-tête d'autorisation "JWT" au lieu de "Bearer" ou "Token" sur Django DRF. Ensuite, cela a commencé à fonctionner. par exemple -
Authorization: JWT asdflkj2ewmnsasdfmnwelfkjsdfghdfghdv.wlsfdkwefojdfgh
la source
Si vous utilisez,
authentication_classes
vous devriez avoiris_active
commeTrue
dans leUser
modèle, ce qui peut êtreFalse
par défaut.la source