“detail”:“未提供身份验证凭据。”当尝试以管理员身份访问列表视图时。 Django REST 框架

问题描述 投票:0回答:1

我有一个使用 Django REST 框架构建的简单视图:

class ProductListCreateAPIView(
        StaffEditorPermissionMixin,
        generics.ListCreateAPIView):

    queryset = Product.objects.all()
    serializer_class = ProductSerializer

    def perform_create(self, serializer):
        print(serializer.validated_data)
        name = serializer.validated_data.get('name')
        description = serializer.validated_data.get('description') or None
        if description is None:
            description = name
        serializer.save(description=description)

这是 StaffEditorPermissionMixin:

class StaffEditorPermissionMixin():
    permission_classes = [permissions.IsAdminUser, IsStaffEditorPermission]

这是 ProductSerializer:

class ProductSerializer(serializers.ModelSerializer):
    edit_url = serializers.SerializerMethodField(read_only=True)
    url = serializers.HyperlinkedIdentityField(
        view_name='product-details',
        lookup_field='pk',
    )
    class Meta:
        model = Product
        fields = [
            'url',
            'edit_url',
            'name',
            'description',
            'price',
            'sale_price',
        ]

    def get_edit_url(self, obj):
        # return f"/api/v2/products/{obj.pk}/"
        request = self.context.get('request')

        if request is None:
            return None
        return reverse("product-edit", kwargs={"pk": obj.pk}, request=request)

以防万一,这里是 products.url:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.ProductListCreateAPIView.as_view(), name='product-list'),
    path('<int:pk>/update/', views.ProductUpdateAPIView.as_view(), name='product-edit'),
    path('<int:pk>/delete/', views.ProductDestroyAPIView.as_view()),
    path('<int:pk>/',  views.ProductDetailAPIView.as_view(), name='product-details'),
]

以防万一,这是源 urls.py:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('api.urls')),
    path('api/products/', include('product.urls')),
    path('api/v2/', include('rest_practice.routers')),
]

因此,当我以管理员身份登录 http://127.0.0.1:8000/admin/ 并前往 http://127.0.0.1:8000/api/products/ 时,我无法访问产品列表并接收

HTTP 401 Unauthorized
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
WWW-Authenticate: Bearer

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

所以我不知道为什么身份验证不起作用,因此我们将不胜感激

编辑:我正在使用 Django 自己的管理面板

python django django-rest-framework django-rest-auth django-rest-framework-simplejwt
1个回答
0
投票

我认为这个问题有点不清楚,你是指 Django 自己的管理面板,还是你自己的一个调用该端点的管理面板。发生这种情况是因为从管理员转到该页面时,请求不包含您用户的令牌。

话虽这么说,我认为最好将 ListCreateAPIView 与管理页面解除关联(如果您谈论的是 Django 自己的管理页面),以便视图成为服务 API 调用的逻辑。为此,您只需将应用程序文件夹中的 admin.py 文件修改为如下所示:

from django.contrib import admin
from .models import Product

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_filter = ['some_column',...]
    list_display = [...]

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.