Django-приложение, развернутое на сервере Ubuntu, перенаправляет на страницу входа в систему после успешной авторизации

Я развернул django на сервере ubuntu 22 с nginx в качестве сервера приложений, но когда я вхожу в систему и при каждом запросе получаю перенаправление обратно на login.`

if form.is_valid():
    username = form.cleaned_data.get("username")
    password = form.cleaned_data.get("password")
    logger.debug(f"Attempting to authenticate user {username}.")
    user = authenticate(username=username, password=password)

    if user is not None:
        logger.debug(f"Authenticated user {username}.")
        login(request, user)
        if user.role == 'STAFF':
            return redirect("sales:sales_list")
        elif user.role in ["MANAGER", "SUPERVISOR",]:
            return redirect("authentication:manager_dashboard")
        elif user.role in ["ADMIN", "GENERAL", "CEO"]:
            return redirect('master:index')

this is how I did the authentication`

class SalesListView(ListView): """ Представление для отображения операций по продажам.

Requires user to be logged in and have specific roles (STAFF, MANAGER, ADMIN, SUPERVISOR, CEO).
Displays sales data based on user role and branch.
"""

template_name = "manager/purchase/sales.html"
model = Sale
context_object_name = "sales"

def dispatch(self, request, *args, **kwargs):
    """
    Custom dispatch method to handle role-based template selection.

    Sets different template names based on the user's role.
    """
    user = request.user

    if not user.is_authenticated:
        # If not authenticated, redirect to login page
        messages.error(request, 'You need to log in first!', extra_tags="danger")
        return redirect('authentication:login')

    self.branch = user.branch.id
    self.user_role = user.role

    print(f"User branch {self.branch} : user role {self.user_role}")

    if self.user_role == 'STAFF':
        self.template_name = 'team_member/sales/sales.html'  # Set template for staff role
    # TODO: Add logic for other roles and master view

    return super().dispatch(request, *args, **kwargs)

вот как я получаю информацию о пользователе из запроса.

SESSION_COOKIE_AGE = 7200 SESSION_EXPIRE_AT_BROWSER_CLOSE = False SECURE_HSTS_SECONDS = 31536000

CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', 'LOCATION': 'unique-snowflake', 'TIMEOUT': 300, 'OPTIONS': { 'MAX_ENTRIES': 1000, 'CULL_FREQUENCY': 3, } } }

Session Engine

SESSION_ENGINE = "django.contrib.sessions.backends.cache" SESSION_CACHE_ALIAS = "default"

вот мои настройки кэша

Как решить ошибку сессии

Исходя из вашего кода, мне кажется, что вы не сохраняете аутентификацию в сессии. Поэтому аутентификация, вероятно, работает, но недоступна в следующих представлениях. Пользователь перенаправляется на SalesListView, который не имеет информации о пользователе, а затем, в свою очередь, перенаправляется обратно на представление входа.

Если у вас нет на то веских причин, я бы не рекомендовал писать собственный код для входа в систему, так как это очень важно с точки зрения безопасности. Вместо этого воспользуйтесь LoginView, предоставляемым Django. Тогда вы сможете получить доступ к пользователю так же, как и в request.user. https://docs.djangoproject.com/en/5.1/topics/auth/default/#django.contrib.auth.views.LoginView

Вернуться на верх