Джанго 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"для страниц, доступ к которым вы хотите ограничить.
Позвольте мне знать, если это помогает.