【问题标题】:django 2 Authentificationdjango 2 认证
【发布时间】:2018-08-29 18:07:36
【问题描述】:

django Authentification中的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 解决问题,但没有成功,谁能帮我解决这个问题?

【问题讨论】:

    标签: python-3.x django-2.0


    【解决方案1】:

    我想我明白你在问什么,也许吧。因此,当您注销并尝试访问仅限权限的页面时,您仍然可以获得访问权限。

    首先 - 不确定这是否是一个问题,但我认为您的 login_user 的 urlpatterns 中应该有一个尾随的“,”。

    第二 - 如果您使用的是 django User 模型,为什么要创建这些复杂的视图方法? Django 可以自己处理所有这些,将它们全部塞到 views.py 文件中似乎很乱。您只需要一些 html 文件来呈现它。

    我强烈建议您查看本教程的 Setting Up Your Authentication Views 部分,因为它通过一个很好地设置用户的示例,然后您可以从您的 views.py 中删除登录和注销方法,只需要使用“@login_required”用于您要限制访问的页面。

    如果这有帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-28
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多