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
}
Just for other people landing up here with same error, this issue can arise if your request.user
is AnonymousUser
and not the right user who is actually authorized to access the URL. You can see that by printing value of request.user
. If it is indeed an anonymous user, these steps might help:
Make sure you have
'rest_framework.authtoken'
inINSTALLED_APPS
in yoursettings.py
.Make sure you have this somewhere in
settings.py
:REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', # ... ), # ... }
Make sure you have the correct token for the user who is logged in. If you do not have the token, learn how to get it here. Basically, you need to do a
POST
request to a view which gives you the token if you provide the correct username and password. Example:curl -X POST -d "user=Pepe&password=aaaa" http://localhost:8000/
Make sure the view which you are trying to access, has these:
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,) # ...
Use
curl
now this way:curl -X (your_request_method) -H "Authorization: Token <your_token>" <your_url>
Example:
curl -X GET http://127.0.0.1:8001/expenses/ -H "Authorization: Token 9463b437afdd3f34b8ec66acda4b192a815a15a8"
If you are playing around in the command line (using curl, or HTTPie etc) you can use BasicAuthentication to test/user your 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',
)
}
You can then use curl
curl --user user:password -X POST http://example.com/path/ --data "some_field=some data"
or httpie (its easier on the eyes):
http -a user:password POST http://example.com/path/ some_field="some data"
or something else like Advanced Rest Client (ARC)
I too faced the same since I missed adding
authentication_classes = (TokenAuthentication)
in my API view class.
class ServiceList(generics.ListCreateAPIView):
authentication_classes = (SessionAuthentication, BasicAuthentication, TokenAuthentication)
queryset = Service.objects.all()
serializer_class = ServiceSerializer
permission_classes = (IsAdminOrReadOnly,)
In addition to the above, we need to explicitly tell Django about the Authentication in settings.py file.
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
)
}
Adding SessionAuthentication in settings.py will do the job
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', ), }
'code' 카테고리의 다른 글
TypefaceSpan 또는 StyleSpan을 사용자 지정 서체와 함께 사용하려면 어떻게해야합니까? (0) | 2020.10.25 |
---|---|
Rails에서 정적 콘텐츠를 수행하는 방법은 무엇입니까? (0) | 2020.10.25 |
종횡비를 계산하는 알고리즘은 무엇입니까? (0) | 2020.10.25 |
패키지 이름을 알고 애플리케이션 시작 (0) | 2020.10.25 |
인쇄 대화 상자가 닫힌 후 자동으로 창 닫기 (0) | 2020.10.25 |