DjangoLearning_charter11登录、退出与限制

登录

在使用authenticate进行验证后,如果验证通过,那么会返回一个user对象,拿到后可以通过django内置的登录验证系统

路径:from django.contrib.auth import login

1、生成项目与配置settings

  • 安装app
  • 添加模板存储位置
  • 添加User模型 变量AUTH_USER_MODEL

2、创建模型和objects

from django.db import models
from django.contrib.auth.models import AbstractUser, BaseUserManager, PermissionsMixin, AbstractBaseUser


class UserManager(BaseUserManager):

    def _create_user(self, telephone, password, username=None, **kwargs):
        if not telephone or not password:
            raise ValueError('The given telephone or password must be set')
        user = self.model(telephone=telephone, username=username, **kwargs)
        user.set_password(password)
        user.save()
        return user

    def create_user(self, telephone, password, username=None, **kwargs):
        kwargs['is_superuser'] = False
        return self._create_user(telephone=telephone, password=password, username=username, **kwargs)

    def create_superuser(self, telephone, password, username=None, **kwargs):
        kwargs['is_superuser'] = True
        return self._create_user(telephone=telephone, password=password, username=username, **kwargs)


class User(AbstractUser):
    telephone = models.CharField(max_length=11, unique=True)
    school = models.CharField(max_length=100)

    USERNAME_FIELD = 'telephone'
    objects = UserManager()

 

3、创建表单类

在MODELFORM的fields中或者不再extends中的字段,如果它的unique是True, 那么会默认验证表单提交上来的数据是否在数据库存在, 如存在即报错

from django import forms
from django.contrib.auth import get_user_model


class LoginForm(forms.ModelForm):
remember = forms.IntegerField()
telephone = forms.CharField(max_length=11)

class Meta:
model = get_user_model()
# fields = ['telephone', 'password']
fields = ['password']

 

4、视图类:

from django.views import View
from django.contrib.auth import login

class LoginView(View):
    def get(self, request):
        form = LoginForm()
        return render(request, 'login.html', context={'form': form})

    def post(self, request):
        form = LoginForm(request.POST)
        if form.is_valid():
            telephone = form.cleaned_data.get('telephone')
            password = form.cleaned_data.get('password')
            remember = form.cleaned_data.get('remember')
            user = authenticate(request, username=telephone, password=password)
            if user and user.is_active:
                login(request, user=user)
                if remember:
                    request.session.set_expiry(None)
                else:
                    request.session.set_expiry(0)
                return HttpResponse('登陆成功')
            else:
                return HttpResponse('用户名或密码错误')
        else:
            print(form.errors)
            return redirect(reverse('login'))

注销

退出登录, 可以通过django.contrib.auth.logout来实现, 会清理掉这个用户的session数据

from django.contrib.auth import logout

def logout_view(request):
    logout(request)
    return HttpResponse('登出')

 

登录限制

有时候, 存在一些视图是登录后才可以访问, 比如个人空间,可以通过django.contrib.auth.decorators.login_required装饰器来实现

login_url:修改默认的登录url

“http://127.0.0.1:8000/login/?next=/profile/”:因包含了next参数, 因此登录后会自动跳转到profile页面, 用户体验好

from django.contrib.auth.decorators import login_required


@ login_required(login_url='/login/')
def my_profile(request):
    return HttpResponse('这里是个人主页, 只有登录才能看见')

 

 但是并未完成跳转,因为我们自定义的视图函数只返回登陆成功, 而未包含跳转。修改视图函数即可

注意点:因next_url已经为url ,因此不需要用reverse进行反转,否则会报错

# 原视图函数的返回值
    return HttpResponse('登陆成功')

#
修改为如下
next_url = request.GET.get('next')
if next_url:
return redirect(next_url)
# return redirect(reverse(next_url))
else:
return HttpResponse('登陆成功')

 

posted @ 2020-03-29 14:34  扛大炮的  阅读(180)  评论(0)    收藏  举报