zoukankan      html  css  js  c++  java
  • 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',
    )
  • 相关阅读:
    UVA10765图论+点-双连通分量性质应用
    LA4287图论+ 有向图SCC+缩点
    LA5135图论+ 割点性质运用
    LA2572计算几何+离散化+面的覆盖
    LA2402暴力枚举+计算几何+四边形面积
    UVA10566计算几何+相似三角形比例函数+二分范围的辨析
    UVA11300计算几何:正n边形内的最长的线
    UVA11524平面几何+二分法+海伦公式
    LA4986三分法求出凹性函数最小值+计算几何
    胜利大逃亡--hdu --1253(bfs)
  • 原文地址:https://www.cnblogs.com/jp-mao/p/7073813.html
Copyright © 2011-2022 走看看