Estou desenvolvendo uma API usando Django Rest Framework. Estou tentando listar ou criar um objeto "Pedido", mas quando tento acessar o console, vejo este erro:
{"detail": "Authentication credentials were not provided."}
Visualizações:
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')
E meus 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)),
)
E então estou usando este comando no console:
curl -X GET http://127.0.0.1:8000/api/orders/ -H 'Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55'
E o erro diz:
{"detail": "Authentication credentials were not provided."}
python
django
django-rest-framework
Marcos Aguayo
fonte
fonte
curl -H "Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55" http://127.0.0.1:8000/api/orders/
Respostas:
Se você está executando o Django no Apache usando mod_wsgi, você deve adicionar
em seu httpd.conf. Caso contrário, o cabeçalho de autorização será removido por mod_wsgi.
fonte
httpd.conf
. então você tem que adicionarWSGIPassAuthorization On
em/etc/apache2/apache2.conf
Resolvido ao adicionar "DEFAULT_AUTHENTICATION_CLASSES" às minhas configurações.py
fonte
'rest_framework.authentication.TokenAuthentication'
ao emDEFAULT_PERMISSION_CLASSES
vez deDEFAULT_AUTHENTICATION_CLASSES
SessionAuthentication
está habilitado por padrão e funciona com os cookies de sessão padrão, portanto, é provável que seu aplicativo Angular (ou outra estrutura JS) estivesse funcionando por causa da autenticação de sessão padrão.Isso me ajuda sem "DEFAULT_PERMISSION_CLASSES" em minhas configurações.py
fonte
SessionAuthentication
foi o que fixa-lo para mimApenas para outras pessoas que chegam aqui com o mesmo erro, esse problema pode surgir se você
request.user
forAnonymousUser
e não o usuário correto que está realmente autorizado a acessar o URL. Você pode ver isso imprimindo o valor derequest.user
. Se for realmente um usuário anônimo, estas etapas podem ajudar:Certifique-se de que você tem
'rest_framework.authtoken'
naINSTALLED_APPS
suasettings.py
.Certifique-se de ter isso em algum lugar em
settings.py
:Certifique-se de ter o token correto para o usuário que está conectado. Se você não tiver o token, saiba como obtê-lo aqui . Basicamente, você precisa fazer uma
POST
solicitação para uma visualização que fornece o token se você fornecer o nome de usuário e a senha corretos. Exemplo:Certifique-se de que a vista da propriedade que você está tentando acessar tenha estes:
Use
curl
agora desta forma:Exemplo:
fonte
request.user
? Parece que o método POST de uma visão baseada em classe nunca está sendo processado. Onde mais posso tentar imprimir o usuário?Se você estiver brincando na linha de comando (usando curl ou HTTPie etc), você pode usar BasicAuthentication para testar / usar sua API
Você pode então usar curl
ou httpie (é mais fácil para os olhos):
ou algo como Cliente de Repouso Avançado (ARC)
fonte
Eu também enfrentei o mesmo desde que deixei de adicionar
na minha classe de visualização da API.
Além do acima, precisamos informar explicitamente ao Django sobre a autenticação no arquivo settings.py.
fonte
Adicionar SessionAuthentication em settings.py fará o trabalho
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', ), }
fonte
Como é o login da sessão, você precisa fornecer as credenciais, então faça o
127.0.0:8000/admin
administrador e faça o login mais tarde, ele funcionará bemfonte
Para mim, tive que preceder meu cabeçalho de autorização com "JWT" em vez de "Bearer" ou "Token" no Django DRF. Então começou a funcionar. por exemplo -
Authorization: JWT asdflkj2ewmnsasdfmnwelfkjsdfghdfghdv.wlsfdkwefojdfgh
fonte
Se você estiver usando
authentication_classes
, então você deve teris_active
comoTrue
noUser
modelo, que pode serFalse
por padrão.fonte