Django REST Framework Web Login не работает - PullRequest
0 голосов
/ 24 октября 2018

Кажется, я не могу понять, почему мой вход в систему для фреймворка rest в моем проекте django не работает ... У меня есть ссылка для входа туда и все, и она перенаправляет меня на страницу входа в остальные, но после заполненияв моих учетных данных и нажатии входа в систему он просто возвращает меня на страницу, с которой я пришел, но, похоже, он не аутентифицирует меня, так как в правом верхнем углу все еще говорится «Логин» ...

This is the login button I am talking about.

Я ожидаю, что в этом случае он изменится на «admin», так как я пытаюсь войти в систему, используя моего суперпользователя с именем «admin» ...

Я, безусловно, отсутствуетчто-то ..

Вот мой REST Urls

path("rest/auctions", auction_list, name="auction-list"),
path('rest/auctions/<int:pk>', auction_detail, name="auction-detail"),
path('rest-auth/', include('rest_framework.urls', namespace='rest_framework')),

Остальной auth / один, которого я знаю, это тот, который каким-то образом добавляет кнопку входа и все (Магия?) Но, может быть, я должен сделать что-то еще, чтобы сделать это аутентификацию?Я не знаю ... Я использую встроенную систему аутентификации django и модель User.

views.py

@api_view(['GET'])
def auction_list(request, format=None):
    if request.method == 'GET':
        query = request.GET.get('q')
        if query is not None:
            auctions = Auction.objects.filter(Q(title__icontains=query), deadline__gte=timezone.now(),
                                              status=Auction.STATUS_ACTIVE)
        else:
            auctions = Auction.objects.all()
        serializer = AuctionSerializer(auctions, many=True, context={'request': request})
        return Response(serializer.data)

сериализатор.py

class AuctionSerializer(serializers.ModelSerializer):
    winning_bid = serializers.SlugRelatedField(many=False, read_only=True, slug_field='amount', allow_null=True)
    seller = serializers.SlugRelatedField(many=False, read_only=True, slug_field='username', allow_null=False)

    class Meta:
        model = Auction
        fields = ('id', 'url', 'title', 'description', 'deadline', 'min_price', 'winning_bid', 'seller')

в моем Settings.py

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticatedOrReadOnly'
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
    ],
}

Наконец, я могу упомянуть, что аутентификация работает, когда я использую API через Почтальон.

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

если кто-то не работает над решением, добавьте эту строку тоже

'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.SessionAuthentication',
),
0 голосов
/ 24 октября 2018

Вы должны удалить BasicAuthentication из settings.py, и он должен работать как положено.BasicAuthentication работает с помощью base64, кодирующего информацию для входа пользователя в систему и присоединяющей их к заголовку авторизации HTTP.Вот почему ваши запросы через Postman работают нормально.

По умолчанию Django использует аутентификацию на основе сеанса, которая зависит от файлов cookie на клиенте для хранения информации о сеансе пользователя после входа в систему. Очевидно, что имя пользователя и пароль не сохраняются.в cookie с BasicAuthentication.

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticatedOrReadOnly'
    ],
}
...