[python] Django Rest Framework-인증 자격 증명이 제공되지 않았습니다.

Django Rest Framework를 사용하여 API를 개발 중입니다. “주문”개체를 나열하거나 만들려고하는데 콘솔에 액세스하려고하면이 오류가 발생합니다.

{"detail": "Authentication credentials were not provided."}

견해:

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,)

직렬 변환기 :

class OrderSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Order
        fields = ('field1', 'field2')

그리고 내 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)),
)

그리고 콘솔에서이 명령을 사용하고 있습니다.

curl -X GET http://127.0.0.1:8000/api/orders/ -H 'Authorization: Token 12383dcb52d627eabd39e7e88501e96a2sadc55'

그리고 오류는 다음과 같이 말합니다.

{"detail": "Authentication credentials were not provided."}



답변

mod_wsgi를 사용하여 Apache에서 Django를 실행하는 경우 다음을 추가해야합니다.

WSGIPassAuthorization On

httpd.conf에서. 그렇지 않으면 인증 헤더가 mod_wsgi에 의해 제거됩니다.


답변

내 settings.py에 “DEFAULT_AUTHENTICATION_CLASSES”를 추가하여 해결되었습니다.

REST_FRAMEWORK = {
   'DEFAULT_AUTHENTICATION_CLASSES': (
       'rest_framework.authentication.TokenAuthentication',
   ),
   'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAdminUser'
   ),
}


답변

내 settings.py에서 “DEFAULT_PERMISSION_CLASSES”없이 나를 도와줍니다.

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'PAGE_SIZE': 10
}


답변

당신이 경우 그냥 다른 사람들이 같은 오류가 여기 착륙이 문제가 발생할 수 request.user있습니다 AnonymousUser실제로 URL을 액세스 할 수있는 권한을 적절한 사용자를하지. 의 값을 인쇄하여 확인할 수 있습니다 request.user. 실제로 익명 사용자 인 경우 다음 단계가 도움이 될 수 있습니다.

  1. 되어 있는지 확인하십시오 'rest_framework.authtoken'INSTALLED_APPS당신의에서 settings.py.

  2. 어딘가에 있는지 확인하십시오 settings.py.

    REST_FRAMEWORK = {
    
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'rest_framework.authentication.TokenAuthentication',
            # ...
        ),
    
        # ...
    }
    
  3. 로그인 한 사용자에 대한 올바른 토큰이 있는지 확인하십시오. 토큰이없는 경우 여기 에서받는 방법을 알아보십시오 . 기본적으로 POST올바른 사용자 이름과 암호를 제공하면 토큰을 제공하는보기에 대한 요청 을 수행해야 합니다. 예:

    curl -X POST -d "user=Pepe&password=aaaa"  http://localhost:8000/
    
  4. 액세스하려는보기에 다음이 있는지 확인하십시오.

    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. curl지금 다음과 같이 사용하십시오 .

    curl -X (your_request_method) -H  "Authorization: Token <your_token>" <your_url>
    

예:

    curl -X GET http://127.0.0.1:8001/expenses/  -H "Authorization: Token 9463b437afdd3f34b8ec66acda4b192a815a15a8"


답변

명령 줄에서 놀고있는 경우 (컬 또는 HTTPie 등 사용) BasicAuthentication을 사용하여 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',
        )
    }

그런 다음 curl 을 사용할 수 있습니다.

curl --user user:password -X POST http://example.com/path/ --data "some_field=some data"

또는 httpie (눈에보기 편함 ) :

http -a user:password POST http://example.com/path/ some_field="some data"

또는 ARC (Advanced Rest Client) 와 같은 다른 것


답변

내가 추가를 놓친 이후 나도 똑같은 직면

authentication_classes = (TokenAuthentication)

내 API보기 클래스에서.

class ServiceList(generics.ListCreateAPIView):
    authentication_classes = (SessionAuthentication, BasicAuthentication, TokenAuthentication)
    queryset = Service.objects.all()
    serializer_class = ServiceSerializer
    permission_classes = (IsAdminOrReadOnly,)

위의 것 외에도 settings.py 파일 에서 인증 에 대해 Django에게 명시 적으로 알려야 합니다.

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


답변

settings.py에 SessionAuthentication을 추가하면 작업이 수행됩니다.

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