Django打造在线教育平台_day_4: 完成用户登录功能

1、在user中新建forms.py文件:实现链接数据库这前的用户输入验证

from django import forms

class LoginForm(forms.Form):
    """表单输入预检查功能(在链接数据库之前)"""
    # usernamepassword两个变量与相应htmlform表单中的name要完全一样,不然功无效
    username = forms.CharField(required=True)  # required=True输入不能为空
    password = forms.CharField(required=True, min_length=8)  # 最小长度8

2、把功能写在users/views.py文件中

from django.shortcuts import render
from django.contrib.auth import authenticate, login #倒入验证输入是否合法模块和登录模块
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from django.views.generic.base import View
from .models import UserProfile
from .forms import LoginForm

class CustomBackend(ModelBackend):
    """自定义邮箱与账户登录"""
    def authenticate(self, username=None, password=None, **kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username)|Q(email=username)) # 用户名与Email验证
            if user.check_password(password): # 验证密码
                return user
        except Exception as e:
            return None

class LoginView(View):
    """登录功能"""
    def get(self, request):
        return render(request, "login.html", {})

    def post(self, request):
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
            # 输入通过LoginForm验证,链接数据库验证
            # 取用户输入值
            user_name = request.POST.get('username', '')
            pass_word = request.POST.get('password', '')

            # 向数据库发起验证请求用户名和密码是否正确
            # 正确会返回一个对象, 不正确会返回None
            user = authenticate(username=user_name, password=pass_word)
            if user is not None:
                # 数据库匹配正确
                login(request, user)  # 登录
                return render(request, 'index.html')
            else:
                # 数据库匹配不正确
                return render(request, "login.html", {'msg': "用户名或者密码错误"})
        else:
            # 输入没通过LoginForm验证,返回错误原因给前端
            return render(request, "login.html", {'login_form': login_form})

3、修改login.html文件

<form action="/login/" method="post" autocomplete="off"> #添加action="/login/"
<input name="username" id="account_l" type="text" placeholder="手机号/邮箱" /> #添加name="username"且与views.py中的变量名一样
<input name="password" id="password_l" type="password" placeholder="请输入您的密码" /> #添加name="password"且与views.py中的变量名一样
# {% if login_form.errors.username %}errorput{% endif %}"的作用是如果有errors错误信息就加这errorput样式
<div class="form-group marb20 {% if login_form.errors.username %}errorput{% endif %}">
<div class="form-group marb8 {% if login_form.errors.password %}errorput{% endif %}">

#{% for key,error in login_form.errors.items %}{{ error }}{% endfor %} 的作用是显示后端传过来的错误提示信息
<div class="error btns login-form-tips" id="jsLoginTips">{% for key,error in login_form.errors.items %}{{ error }}{% endfor %}{{ msg }}</div>

4、运行程序输入用户密码,出现以下错误,是Django安全机制影响的

在login.html文件加入以下代码

 <form>  
    ........
    ........             
{% csrf_token %} #添加上这句代码取消Django保护机制
  </form>

5、修改index.html达到登录成功显示个人中心

{% if request.user.is_authenticated %} #登录成功,显示个人中心
  <div class="personal">......</div>
{% else %} # 否则显示登录页面
  <a style="color:white" class="fr registerbtn"href="register.html">注册</a>
  <a style="color:white" class="fr loginbtn" href="/login/">登录</a>
{% endif %}

6、修改urls.py文件

# 添加如下代码
from users.views import LoginView
urlpatterns = [
    url(r'^login/$', LoginView.as_view(), name='login'),
]

7、配置settings.py添加,实现自定义登录功能(用户名和邮箱都可以登录)

AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend',
)
原文地址:https://www.cnblogs.com/jp-mao/p/7073813.html