Джанго 2 Аутентификация

Проблема URL в Джанго Аутентификации

это мое приложение urls.py

from django.urls import path,  re_path
from . import views

app_name = 'music'

urlpatterns = [

    path('register/', views.register, name='register'),
    path('login_user/', views.login_user, name='login_user'),
    path('logout_user/', views.logout_user, name='logout_user'),
    #path('<int:album_id>/', views.detail, name='detail'),
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
    #re_path(r'^(?P<album_id>[0-9]+)/$', views.detail, name='detail'),
    #path('<int:album_id>/favorite/', views.favorite, name='favorite'),
    path('album/add', views.AlbumCreate.as_view(), name='album-add'),
    path('album/<int:pk>/', views.AlbumUpdate.as_view(), name='album-update'),
    path('album/<int:pk>/delete/', views.AlbumDelete.as_view(), name='album-delete'),
    path('index/', views.IndexView.as_view(), name='index'),
    path('', views.login_user)
    # path('', views.index, name='index'),


]

это мой файл views.py

from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login, logout
from django.views import generic
from django.views.generic import View
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from django.contrib.auth.decorators import login_required
from .models import Album, Song
from django.db.models import Q
from .forms import UserForm


class IndexView(generic.ListView):
    template_name = 'music/index.html'
    def get_queryset(self):
        return Album.objects.all() 

class DetailView(generic.DetailView):
    model = Album
    template_name = 'music/detail.html'


class AlbumCreate(CreateView):
    model = Album
    fields = ['artist', 'alum_title', 'genre', 'album_logo']


class AlbumUpdate(UpdateView):
    model = Album
    fields = ['artist', 'alum_title', 'genre', 'album_logo']


class AlbumDelete(DeleteView):
    model = Album
    success_url = reverse_lazy('music:index')


@login_required(login_url="/login_user/")
class UserFormView(View):
    form_class = UserForm
    template_name = 'music/registration_form.html'

    def get(self, request):
        form = self.form_class(None)
        return render(request, self.template_name,{'form':form})

    def post(self, request):
        form = self.form_class(request.POST)

        if form.is_valid():

            user = form.save(commit=False)

            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user.set_password(password)
            user.save()

            user = authenticate(username=username, password=password)

            if user is not None :
                 if user.is_active:
                     login(request, user)
                     return redirect('music:index')

            return render(request, self.template_name,{'form' : form})

        context = {
            "form": form,
        }
        return render(request, 'music/registration_form.html', context)

def logout_user(request):
    logout(request)
    form = UserForm(request.POST or None)
    context = {
        "form": form,
    }
    return render(request, 'music/login.html', context)

def login_user(request):
    if request.method == "POST":
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                albums = Album.objects.filter(user=request.user)
                return render(request, 'music/index.html', {'albums': albums})
            else:
                return render(request, 'music/login.html', {'error_message': 'Your account has been disabled'})
        else:
            return render(request, 'music/login.html', {'error_message': 'Invalid login'})
    else:
        return render(request, 'music/login.html')


def register(request):
    form = UserForm(request.POST or None)
    if form.is_valid():
        user = form.save(commit=False)
        username = form.cleaned_data['username']
        password = form.cleaned_data['password']
        user.set_password(password)
        user.save()
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                albums = Album.objects.filter(user=request.user)
                return render(request, 'music/index.html', {'albums': albums})
    context = {
        "form": form,
    }
    return render(request, 'music/register.html', context)

это мой файл models.py

from django.contrib.auth.models import Permission, User
from django.db import models
from django.urls import reverse


class Album(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    artist = models.CharField(max_length=20)
    alum_title = models.CharField(max_length=20)
    genre = models.CharField(max_length=10)
    album_logo = models.FileField()

    def get_absolute_url(self):
        return reverse('music:detail', kwargs={'pk':self.pk})
    def __str__(self):
        return self.alum_title + self.artist

class Song(models.Model):
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    file_type = models.CharField(max_length=10)
    song_title = models.CharField(max_length=20)
    is_favorite = models.BooleanField(default=False)

    def __str__(self):
        return self.song_title

моя проблема заключается в том, что когда я выхожу из системы и пытаюсь поиграть с URL-адресами, она регистрируется, но сеанс пользователя заканчивается, я пытался решить проблему с login_required, но это не сработало, может кто-нибудь помочь мне решить эту проблему?

1 ответ

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

Во-первых - не уверен, что это проблема, но я думаю, что в ваших urlpatterns для login_user должен быть заключительный ",".

Второе. Если вы используете модель пользователя django, почему вы создаете эти сложные методы представления? Django может справиться со всем этим сам, кажется, что запихивать все это в файл views.py кажется беспорядком. Все, что вам нужно, это некоторые html-файлы для его рендеринга.

Я настоятельно рекомендую вам взглянуть на ту часть руководства, которая посвящена настройке ваших просмотров аутентификации, как она показывает пример настройки пользователей, и тогда вы можете удалить методы входа и выхода из вашего views.py и использовать только "@login_required"для страниц, доступ к которым вы хотите ограничить.

Позвольте мне знать, если это помогает.

Другие вопросы по тегам