Ich entwickle eine API mit Django Rest Framework. Ich versuche, ein "Order" -Objekt aufzulisten oder zu erstellen, aber wenn ich versuche, auf die Konsole zuzugreifen, wird folgende Fehlermeldung angezeigt:
{"detail": "Authentication credentials were not provided."}
Ansichten:
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,)
Serializer:
class OrderSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Order
fields = ('field1', 'field2')
Und meine URLs:
# -*- 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)),
)
Und dann benutze ich diesen Befehl in der Konsole:
curl -X GET http://127.0.0.1:8000/api/orders/ -H 'Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55'
Und der Fehler sagt:
{"detail": "Authentication credentials were not provided."}
python
django
django-rest-framework
Marcos Aguayo
quelle
quelle
curl -H "Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55" http://127.0.0.1:8000/api/orders/
Antworten:
Wenn Sie Django auf Apache mit mod_wsgi ausführen, müssen Sie hinzufügen
in Ihrer httpd.conf. Andernfalls wird der Autorisierungsheader von mod_wsgi entfernt.
quelle
httpd.conf
. so muss man hinzufügen ,WSGIPassAuthorization On
in/etc/apache2/apache2.conf
Gelöst durch Hinzufügen von "DEFAULT_AUTHENTICATION_CLASSES" zu meiner settings.py
quelle
'rest_framework.authentication.TokenAuthentication'
umDEFAULT_PERMISSION_CLASSES
stattDEFAULT_AUTHENTICATION_CLASSES
SessionAuthentication
ist standardmäßig aktiviert und funktioniert mit den Standard-Sitzungscookies. Daher ist es wahrscheinlich, dass Ihre Angular-Anwendung (oder eine andere JS-Framework-Anwendung) aufgrund der Standard-Sitzungsauthentifizierung funktioniert hat.Dies hilft mir ohne "DEFAULT_PERMISSION_CLASSES" in meiner settings.py
quelle
SessionAuthentication
war es, was es für michNur für andere Personen, die mit demselben Fehler hier landen, kann dieses Problem auftreten, wenn Sie der richtige Benutzer
request.user
sindAnonymousUser
und nicht der richtige Benutzer, der tatsächlich zum Zugriff auf die URL berechtigt ist. Sie können dies sehen, indem Sie den Wert von druckenrequest.user
. Wenn es sich tatsächlich um einen anonymen Benutzer handelt, können folgende Schritte hilfreich sein:Vergewissern Sie sich ,
'rest_framework.authtoken'
inINSTALLED_APPS
Ihrersettings.py
.Stellen Sie sicher, dass Sie dies irgendwo in
settings.py
:Stellen Sie sicher, dass Sie das richtige Token für den angemeldeten Benutzer haben. Wenn Sie das Token nicht haben, erfahren Sie hier , wie Sie es erhalten . Grundsätzlich müssen Sie eine
POST
Anforderung an eine Ansicht senden, die Ihnen das Token gibt, wenn Sie den richtigen Benutzernamen und das richtige Kennwort angeben. Beispiel:Stellen Sie sicher, dass die Ansicht, auf die Sie zugreifen möchten, folgende Eigenschaften aufweist:
Verwenden Sie
curl
jetzt so:Beispiel:
quelle
request.user
? Es scheint, dass die POST-Methode einer klassenbasierten Ansicht niemals verarbeitet wird. Wo sonst kann ich versuchen, den Benutzer zu drucken?Wenn Sie in der Befehlszeile herumspielen (mithilfe von Curl, HTTPie usw.), können Sie mit BasicAuthentication Ihre API testen / verwenden
Sie können dann Curl verwenden
oder httpie (es ist augenschonender ):
oder etwas anderes wie Advanced Rest Client (ARC)
quelle
Auch ich sah mich dem gegenüber, da ich das Hinzufügen verpasst hatte
in meiner API-Ansichtsklasse.
Darüber hinaus müssen wir Django explizit über die Authentifizierung in der Datei settings.py informieren.
quelle
Das Hinzufügen von SessionAuthentication in settings.py erledigt den Job
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', ), }
quelle
Da es sich um eine Sitzungsanmeldung handelt, müssen Sie Ihre Anmeldeinformationen
127.0.0:8000/admin
angeben. Führen Sie also den Administrator aus und melden Sie sich später an. Dies funktioniert einwandfreiquelle
Für mich musste ich meinem Authorization-Header "DWT" anstelle von "Bearer" oder "Token" in Django DRF voranstellen. Dann fing es an zu arbeiten. z.B -
Authorization: JWT asdflkj2ewmnsasdfmnwelfkjsdfghdfghdv.wlsfdkwefojdfgh
quelle
Wenn Sie verwenden
authentication_classes
, sollten Sieis_active
wieTrue
imUser
Modell haben, was möglicherweiseFalse
standardmäßig ist.quelle