python - how - django rest framework serializer
Django Rest Framework: no se proporcionaron las credenciales de autenticación (7)
Estoy desarrollando una API usando Django Rest Framework. Estoy tratando de enumerar o crear un objeto "Orden", pero cuando intento acceder a la consola me da este error:
{"detail": "Authentication credentials were not provided."}
Puntos de vista:
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,)
Serializador:
class OrderSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Order
fields = (''field1'', ''field2'')
Y mis 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)),
)
Y luego estoy usando este comando en la consola:
curl -X GET http://127.0.0.1:8000/api/orders/ -H ''Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55''
Y el error dice:
{"detail": "Authentication credentials were not provided."}
Agregar SessionAuthentication en settings.py hará el trabajo
REST_FRAMEWORK = { ''DEFAULT_AUTHENTICATION_CLASSES'': ( ''rest_framework.authentication.SessionAuthentication'', ), }
Esto me ayuda sin "DEFAULT_PERMISSION_CLASSES" en mi configuración.py
REST_FRAMEWORK = {
''DEFAULT_AUTHENTICATION_CLASSES'': (
''rest_framework.authentication.TokenAuthentication'',
''rest_framework.authentication.SessionAuthentication'',
),
''PAGE_SIZE'': 10
}
Resuelto agregando "DEFAULT_AUTHENTICATION_CLASSES" a mi configuración.py
REST_FRAMEWORK = {
''DEFAULT_AUTHENTICATION_CLASSES'': (
''rest_framework.authentication.TokenAuthentication'',
),
''DEFAULT_PERMISSION_CLASSES'': (
''rest_framework.permissions.IsAdminUser''
),
}
Si está ejecutando Django en Apache usando mod_wsgi, debe agregar
WSGIPassAuthorization On
en su httpd.conf. De lo contrario, el encabezado de autorización será eliminado por mod_wsgi.
Si estás jugando en la línea de comando (usando curl, o HTTPie, etc.) puedes usar BasicAuthentication para probar / usar tu API
REST_FRAMEWORK = {
''DEFAULT_PERMISSION_CLASSES'': [
''rest_framework.permissions.IsAuthenticated'',
],
''DEFAULT_AUTHENTICATION_CLASSES'': (
''rest_framework.authentication.BasicAuthentication'', # enables simple command line authentication
''rest_framework.authentication.SessionAuthentication'',
''rest_framework.authentication.TokenAuthentication'',
)
}
Luego puedes usar curl
curl --user user:password -X POST http://example.com/path/ --data "some_field=some data"
o httpie (es más fácil para los ojos):
http -a user:password POST http://example.com/path/ some_field="some data"
o algo más como Advanced Rest Client (ARC)
Solo para otras personas que llegan aquí con el mismo error, este problema puede surgir si su
request.user
es
AnonymousUser
y no el usuario correcto que está autorizado para acceder a la URL.
Puede ver eso imprimiendo el valor de
request.user
.
Si realmente es un usuario anónimo, estos pasos podrían ayudar:
-
Asegúrese de tener
''rest_framework.authtoken''
enINSTALLED_APPS
en susettings.py
. -
Asegúrese de tener esto en algún lugar de
settings.py
:REST_FRAMEWORK = { ''DEFAULT_AUTHENTICATION_CLASSES'': ( ''rest_framework.authentication.TokenAuthentication'', # ... ), # ... }
-
Asegúrese de tener el token correcto para el usuario que inició sesión. Si no tiene el token, aprenda cómo obtenerlo here . Básicamente, debe hacer una solicitud
POST
a una vista que le proporcione el token si proporciona el nombre de usuario y la contraseña correctos. Ejemplo:curl -X POST -d "user=Pepe&password=aaaa" http://localhost:8000/
-
Asegúrese de que la vista a la que está intentando acceder tenga lo siguiente:
class some_fancy_example_view(ModelViewSet): """ not compulsary it has to be ''ModelViewSet'' this can be anything like APIview etc, depending on your requirements. """ permission_classes = (IsAuthenticated,) authentication_classes = (TokenAuthentication,) # ...
-
Usa
curl
ahora de esta manera:curl -X (your_request_method) -H "Authorization: Token <your_token>" <your_url>
Ejemplo:
curl -X GET http://127.0.0.1:8001/expenses/ -H "Authorization: Token 9463b437afdd3f34b8ec66acda4b192a815a15a8"
Yo también me enfrenté a lo mismo ya que me perdí agregar
autenticación_clases = (Autenticación de testigo)
en mi clase de vista API.
class ServiceList(generics.ListCreateAPIView):
authentication_classes = (SessionAuthentication, BasicAuthentication, TokenAuthentication)
queryset = Service.objects.all()
serializer_class = ServiceSerializer
permission_classes = (IsAdminOrReadOnly,)
Además de lo anterior, necesitamos decirle explícitamente a Django sobre la autenticación en el archivo settings.py.
REST_FRAMEWORK = {
''DEFAULT_AUTHENTICATION_CLASSES'': (
''rest_framework.authentication.TokenAuthentication'',
)
}