使用django编辑用户登录页

django编辑用户登录页

配置路由url

#导入视图函数
from apps.views import account
urlpatterns = [
    path('login/', account.login),
    path('logout/', account.logout),
    path('image/code/', account.image_code),
]

编辑试图函数,导入模块

from io import BytesIO
from django.shortcuts import render, redirect, HttpResponse
from django import forms
from django.forms import ValidationError

from apps import models
#自定义MD5加密函数
from apps.utils.encryption import md5_hash 
#自定义生成随机验证码函数
from apps.utils.random_code import check_code 

编辑登录视图函数

  • 定义form类用于生成input框
class LoginForm(forms.Form):
    name = forms.CharField(label="username", max_length=32
                           , widget=forms.TextInput,
                           required=True
                           )
    password = forms.CharField(label="password",
                               required=True,
                               widget=forms.PasswordInput(render_value=True),
                               )
    code = forms.CharField(label="code",
                           required=True,
                           widget=forms.TextInput,
                           )

    def clean_password(self):
        pwd = self.cleaned_data.get("password")
        return md5_hash(pwd)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for name, field in self.fields.items():
            if field.widget.attrs:
                field.widget.attrs["class"] = "form-control"
                field.widget.attrs["placeholder"] = field.label
            else:
                field.widget.attrs = {"class": 'form-control', 'placeholder': field.label}
  • 定义登录视图函数
def login(request):
    if request.method == 'GET':
        form = LoginForm()
        return render(request, 'login.html', {"form": form})

    form = LoginForm(data=request.POST)
    if form.is_valid():
        code = form.cleaned_data.pop('code')
        code_string = request.session.get('code_string')
        if code.upper() != code_string:
            form.add_error("code", "验证码错误")
            return render(request, 'login.html', {"form": form})
        request.session.set_expiry(60 * 60 * 24 * 7) #session超时时间
        exits_object = models.Admin.objects.filter(**form.cleaned_data).first()
        if exits_object:
            request.session['info'] = {'id': exits_object.id, 'name': exits_object.name}
            return redirect('/admin/list/')
        else:
            form.add_error("password", ValidationError("用户名或密码错误"))
            return render(request, 'login.html', {"form": form})
    return render(request, 'login.html', {"form": form})

定义登出视图函数

def logout(request):
    request.session.clear()
    return redirect('/login/')

定义生产随机验证码函数

#调用check_code函数,生成随机验证码图片及内容

def image_code(request):
    img, code_string = check_code()
    request.session["code_string"] = code_string
    #设置session超时时间
    request.session.set_expiry(60)
	
	#调用BytesIO类,把数据存入内存中
    strem = BytesIO()
    img.save(strem, 'PNG')
    return HttpResponse(strem.getvalue())

html模板

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户登录</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}">
    <style>
        .login {
            width: 400px;
        }
    </style>
</head>
<body>
<div class="container login">
    <div class="panel panel-default" style="margin-top: 200px">
        <h2 style="text-align: center">用户登录</h2>
        <div class="panel-body">
            <form class="form" method="post" novalidate>
                {% csrf_token %}
                <div class="form-group">
                    <label>用户名</label>
                    {{ form.name }}
                    <span>{{ form.name.errors.0 }}</span>
                </div>
                <div class="form-group">
                    <label>密码</label>
                    {{ form.password }}
                    <span>{{ form.password.errors.0 }}</span>
                </div>
                <div class="form-group">
                    <label>验证码</label>
                    <div class="row">
                        <div class="col-xs-7">{{ form.code }}</div>
                        <div class="col-xs-5">
                            <a href="#">
                                <img src="/image/code/">
                            </a>
                        </div>
                    </div>

                    <span>{{ form.code.errors.0 }}</span>
                </div>
                <button type="submit" class="btn btn-primary">提交</button>
            </form>
        </div>
    </div>
</div>
</body>
</html>
  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值