django 实现同步登登录和退出

本文介绍了使用Django实现用户登录与退出功能的步骤,包括准备登录模板表单、设计用户模型、添加同步登陆和登录拦截、实现退出登录等。还给出了用户登录的认证步骤及代码,以及用户退出的函数使用,同时提及了模板和表单、视图文件。

实现步骤

  1. 准备登录Django模板表单
  2. 设计用户模型
  3. 添加用户的同步登陆
  4. 添加登录拦截
  5. 实现退出登录的功能

用户登录

步骤一:认证用户

user = authenticate(username='john',possword='secret')

步骤二:判断认证后的用户是否为None

用户不为None则表示用户认证通过

步骤三:调用login函数登录用户

login(request,user,backend=None)

用户退出

使用logout函数退出当前登录的用户

from django.contrib.auth import logout

        def logout_view(request):

                logout(request)

模板中登录html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>用户登录</title>
  <style type="text/css">
    .errorlist {
      color: #f00;
    }
  </style>
</head>
<body>
  <h3>用户登录</h3>
  <form action="." method="post">
    {% csrf_token %}
{#    {{ form.as_p }}#}
    <div>
      <!-- 用户名 -->
      {{ form.username.label }}
      {{ form.username }}
      {{ form.username.errors.as_text }}
    </div>
    <div>
      <!-- 密码 -->
      {{ form.password.label }}
      {{ form.password }}
      {{ form.password.errors.as_text }}
    </div>
    <div>
      {{ form.non_field_errors.as_text }}
    </div>
    <input type="submit" value="登录">
  </form>
</body>
</html>

 模板中用户信息html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>用户的基本信息</title>
</head>
<body>
  <p>
    当前登录的用户是:{{ user.username }}
  </p>
  {% if user.is_authenticated %}
  <a href="/accounts/user/logout/">退出登录</a>
  {% endif %}
</body>
</html>

表单forms.py

class LoginForm(forms.Form):
    """ 登录表单 """
    username = forms.CharField(label='用户名',
                               max_length=100,
                               required=False,
                               help_text='使用帮助',
                               initial='admin')
    password = forms.CharField(label='密码', max_length=200, min_length=6,
                               widget=forms.PasswordInput)

    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        # 当前登录的用户
        self.user = None


    def clean_username(self):
        """ 验证用户名 hook 钩子函数 """
        username = self.cleaned_data['username']
        pattern = r'^1[0-9]{10}$'
        if not re.search(pattern, username):
            raise forms.ValidationError('手机号%s输入不正确',
                                        code='invalid_phone',
                                        params=(username, ))
        return username

    def clean(self):
        data = super().clean()
        print(data)
        # 如果单个字段有错误,直接返回,不执行后面的验证
        if self.errors:
            return
        # username = data['username']
        # password = data['password']
        username = data.get('username', None)
        password = data.get('password', None)
        user = authenticate(username=username,password=password)
        if user is None:
            raise forms.ValidationError('用户名或者密码不正确')
        else:
            if not user.is_active:
                raise forms.ValidationError('该用户已被禁用')

        self.user = user

    def do_login(self,request):
        """执行用户登录"""
        user = self.user
        login(request,user)

        # 修改用户登录的时间
        user.last_login = now()
        user.save()
        # 保存登录历史
        return user

视图views.py

from django.contrib.auth import logout
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect

# Create your views here.
from accounts.forms import LoginForm


def user_login(request):
    """ 用户登录 """
    if request.method == 'POST':
        form = LoginForm(data=request.POST)
        if form.is_valid():
            print('表单验证通过')
            form.do_login(request)
        else:
            print(form.errors)
    else:
        form = LoginForm()
    return render(request, 'user_login.html', {
        'form': form
    })

@login_required(login_url='/accounts/user/login/')
def user_info(request):
    """ 用户信息 """
    # print(request.user)
    return render(request, 'user_info.html')


def user_logout(request):
    """退出登录"""
    logout(request)
    return redirect('/accounts/user/info/')

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值