Django, запрошенное для входа в систему программное обеспечение, логин и носитель

в приложении Django 5.2 я обнаружил LoginRequiredMiddleware. Это отличная система. Однако у меня есть некоторые проблемы со средствами массовой информации.

Если URL-адрес содержит параметр @login_not_required(), невозможно отобразить загруженные изображения.

в консоли, когда страница загружается, django рассматривает это как next_url.

[19/Apr/2025 08:11:34] "GET /media/identity/background.jpg HTTP/1.1" 302 0
[19/Apr/2025 08:11:34] "GET /?next=/media/identity/background.jpg HTTP/1.1" 200 3062

Если пользователь вошел в систему, он работает нормально, объявляя загруженные изображения с помощью MEDIA_URL, как в примерах ниже. Если пользователь анонимен, то изображение содержит ошибку.

<style>
    body{
        background-image: url("{{ MEDIA_URL }}{{ identity.background }}") !important;
    }
</style>

<img src="{{ MEDIA_URL }}{{ identity.logo }}" style="width: auto; height: 100px;">

#settings.py
# Media files 
MEDIA_ROOT = BASE_DIR / "media"
MEDIA_URL = "/media/"

У вас есть какие-нибудь идеи о том, как отобразить мультимедиа?

Я начал создавать пользовательское промежуточное программное обеспечение, но суть не в этом.

urlpatterns = [
    #path("", LoginView.as_view(template_name="lnr/login.html", redirect_authenticated_user=True), name="home"),
    path("", login_not_required(CustomLoginView.as_view()), name="home"),
    # path("", core_views.login, name="home"),
    path("about/", brand_views.about, name="about"),
]

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Я пробовал использовать другие views.class, функции, вид входа в систему.


@login_not_required
def about(request):
    return render(
        request,
        "lnr/about.html",
    )

class CustomLoginView(LoginView):
    template_name = 'lnr/login.html'

@login_not_required
def login(request):
    return render(request, 'lnr/login.html')

используйте LOGIN_REQUIRED_IGNORE_PATHS в вашем setting.py

LOGIN_REQUIRED_IGNORE_PATHS = [     r"^/media/"]

затем перезапустите свой сервер django.

Вам (вероятно, нужно) также запретить вход в систему для мультимедийных и статических файлов, поэтому:

from django.views.static import serve

if settings.DEBUG:
    urlpatterns += static(
        settings.STATIC_URL,
        document_root=settings.STATIC_ROOT,
        view=login_not_required(serve),
    )
    urlpatterns += static(
        settings.MEDIA_URL,
        document_root=settings.MEDIA_ROOT,
        view=login_not_required(serve),
    )

Это, конечно, откроет доступ ко всем мультимедийным и статическим файлам для пользователя, что может быть не тем, что вы намереваетесь делать: если пользователь загружает файл на /media, то вы обычно не хотите, чтобы другие люди имели доступ к этому файлу.

Обычно статические файлы и медиафайлы обслуживаются не Django, а веб-сервером, таким как Nginx или Apache. В этом случае вы можете принудительно выполнить аутентификацию с помощью представления Django, которое запускается первым и отвечает сообщением X-Accel заголовок, а затем вы позволяете Nginx обслуживать файл.

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