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 обслуживать файл.