Django打造在线教育平台_day_4: 完成用户登录功能
1、在user中新建forms.py文件:实现链接数据库这前的用户输入验证
from django import forms class LoginForm(forms.Form): """表单输入预检查功能(在链接数据库之前)""" # username\password两个变量与相应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', )