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
. 실제로 익명 사용자 인 경우 다음 단계가 도움이 될 수 있습니다.
-
되어 있는지 확인하십시오
'rest_framework.authtoken'
에INSTALLED_APPS
당신의에서settings.py
. -
어딘가에 있는지 확인하십시오
settings.py
.REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', # ... ), # ... }
-
로그인 한 사용자에 대한 올바른 토큰이 있는지 확인하십시오. 토큰이없는 경우 여기 에서받는 방법을 알아보십시오 . 기본적으로
POST
올바른 사용자 이름과 암호를 제공하면 토큰을 제공하는보기에 대한 요청 을 수행해야 합니다. 예:curl -X POST -d "user=Pepe&password=aaaa" http://localhost:8000/
-
액세스하려는보기에 다음이 있는지 확인하십시오.
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,) # ...
-
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"
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',
),
}