start how framework example ejemplo create python django django-rest-framework

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:

  1. Asegúrese de tener ''rest_framework.authtoken'' en INSTALLED_APPS en su settings.py .

  2. Asegúrese de tener esto en algún lugar de settings.py :

    REST_FRAMEWORK = { ''DEFAULT_AUTHENTICATION_CLASSES'': ( ''rest_framework.authentication.TokenAuthentication'', # ... ), # ... }

  3. 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/

  4. 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,) # ...

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