django登录页面

 

from django.shortcuts import render, redirect, HttpResponse
from django import forms
from app import models
from app.utils.bootstrap import BootSF
from app.utils.encrypt import md5
from app.utils.code import check_code


class LoginForm(BootSF):
    username = forms.CharField(
        label="用户名",
        widget=forms.TextInput,
        # 必填不能为空
        required=True
    )
    password = forms.CharField(
        label="密码",
        widget=forms.PasswordInput(render_value=True),
        required=True
    )
    code = forms.CharField(
        label="验证码",
        widget=forms.TextInput,
        required=True
    )

    def clean_password(self):
        password = self.cleaned_data.get('password')
        return md5(password)


def login(request):
    """登录页面"""
    form = LoginForm()
    if request.method == "GET":
        title = "登录"
        return render(request, 'login.html', {'form': form, 'title': title})
    form = LoginForm(data=request.POST)
    if form.is_valid():
        # {'username':'a','password':123}
        # print(form.cleaned_data)
        # 验证码的校验
        user_input_code = form.cleaned_data.pop('code')
        code = request.session.get("image_code", '')
        if code.upper() != user_input_code.upper():
            form.add_error("code", '验证码错误')
            return render(request, 'login.html', {'form': form})

        # 去数据库校验用户名和密码是否正确,获取用户对象、none
        admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
        if not admin_object:
            form.add_error(
                "password", '用户名或者密码错误'
            )
            return render(request, 'login.html', {'form': form})
        # 验证通过 网站生成随机生成字符串,写到用户浏览器的cookie中然后写入session中
        # 也可以写成字典 {“name”admin_object.username:“password”:admin_object.password}
        # 保存cookie到客户端 request.set.cookie['info']=admin_object.username
        request.session["info"] = admin_object.username
        # 七天免密登录
        request.session.set_expiry(60 * 60 * 24 * 7)
        return redirect('/admin/list/')

        # return HttpResponse("123456")
        # 数据库处理

    return render(request, 'login.html', {'form': form})


from io import BytesIO


def image_code(request):
    """验证码图片"""
    img, code_str = check_code()
    # 写入自己的session中
    request.session['image_code'] = code_str
    # 给验证码设置60s超时
    request.session.set_expiry(60)
    # print(code_str)
    stream = BytesIO()
    img.save(stream, "png")
    # with open('code.png', 'wb') as f:
    #     img.save(f, format='png')
    return HttpResponse(stream.getvalue())


def logout(request):
    """注销"""
    # 把你当前的用户取消掉
    request.session.clear()
    return redirect('/login/')

<div class="account">
    <h2>用户登录</h2>
    <form method="post" novalidate>
        {% csrf_token %}
        <div class="form-group">
            <label>用户名</label>
            {{ form.username }}
            <span style="color:red;">{{form.username.errors.0}}</span>
        </div>
        <div class="form-group">
            <label>密码</label>
            {{form.password}}
            <span style="color:red;">{{form.password.errors.0}}</span>
        </div>
        <div class = "form-group">
            <label >图片验证码</label>
            <div class="row">
                <div class="col-xs-7">
                    {{form.code}}
            <span style="color:red;">{{form.code.errors.0}}</span>
                </div>
                <div class="col-xs-5">
                    <img id="image_code" src="/image/code/" style="width:125px;">

                </div>
            </div>

        </div>
        <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">
        <input type="submit" value="登录" class="btn btn-primary">
    </form>
#model模版中
class Admin(models.Model):
    """管理员管理"""
    username = models.CharField(verbose_name='用户名', primary_key=True, max_length=32, blank=False, null=False)
    password = models.CharField(verbose_name='密码', max_length=32, blank=False, null=False)

    def __str__(self):
        return self.username
 # url模板中 path('login/', account.login),
    path('logout/', account.logout),
    path('image/code/', account.image_code),

验证码代码会在以后发布

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值