• BBS项目 登录界面代码详解


    forms

    from django import forms


    # 创建form类
    class LoginInfo(forms.Form):
    # 创建账号字段
    username = forms.CharField(
    #默认名称
    label="用户名",
    #错误提示
    error_messages={
    #不能为空
    "required":"用户名不能为空"
    },
    #widget方法调用,可以定义类
    widget=forms.widgets.TextInput(attrs={"class":"form-control"})

    )

    # 创建密码字段
    password = forms.CharField(
    # 默认名称
    label="密码",
    # 错误提示
    error_messages={
    # 不能为空
    "required": "密码不能为空"
    },
    # widget方法调用,可以定义类
    widget=forms.widgets.PasswordInput(attrs={"class": "form-control"})

    )

    ———————————————————————————————————————————————————————————————————————————————

    views

    from django.shortcuts import render,HttpResponse
    from bolg import forms
    from django.contrib import auth
    from django.http import JsonResponse


    # Create your views here.


    def login(request):
    # 创建LoginInfo对象
    login_obj = forms.LoginInfo()
    # 判断是否是POST数据
    if request.method == "POST":
    # 用于传参判断
    ret = {'code': 0}
    # 提取账号密码和验证码
    username = request.POST.get('id_username')
    password = request.POST.get('id_password')
    print(username)
    v_code = request.POST.get('v_code')
    print(v_code)
    # 判断验证码是否正确,从session中提取
    if v_code.upper() == request.session.get('v_code'):
    # 用authenticate判断账户密码
    user = auth.authenticate(username=username, password=password)
    # 判断是否有此用户
    if user:
    # 有的话转入登录后页面
    ret['data'] = '/index/'
    else:
    # 用户错误,传递错误信息
    ret['code'] = 1
    ret['data'] = "用户名或密码错误"
    else:
    # 验证码错误传递错误信息
    ret['code'] = 1
    ret['data'] = "验证码错误"

    print(ret)
    return JsonResponse(ret)

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


    def v_code(request):
    # PIL 生成图片模块
    # Image 生成图片对象
    # ImageDraw 生成画笔对象
    # ImageFont 生成文字对象
    from PIL import Image, ImageDraw, ImageFont
    # 随机数类
    import random

    # 定义一个生成随机数颜色的方法
    def get_color():
    return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

    # 定义生成图片对象
    img_obj = Image.new(
    "RGB", # 图片类型
    (250, 35), # 图片大小
    color=get_color() # 图片色彩
    )

    # 定义生成画笔对象
    # Draw生成img_obj的画笔对象
    draw_obj = ImageDraw.Draw(img_obj)

    # 定义生成字体对象
    # truetype 生成字体对象,后面参数,字体文件路径,字体大小
    font_obj = ImageFont.truetype('static/font/kumo.ttf', size=28)

    # 存放随机数
    tem_list = []

    # 产生随机字体
    for i in range(5):
    # 获取随机数,限定为数字0-9,大小写字母
    # 把得到的数字转为字符串
    a = str(random.randint(0, 9))
    # 把得到的数字转为asc编码值
    b = chr(random.randint(97, 122))
    c = chr(random.randint(65, 90))
    # 3个随机数取其一
    r = random.choice([a, b, c])

    # 画笔对象对图片中的字体进行修改
    draw_obj.text(
    (i * 48 + 20, 0), # 字体在图片中的位置
    r, # 上面随机数得到的文字内容
    get_color(), # 字体颜色
    font=font_obj # 字体样式
    )

    # 把穗子字体放入字体列表中
    tem_list.append(r)

    #用join将列表转为字符串
    code_str=''.join(tem_list)

    #把字符串转为小写,在放入session中
    request.session['v_code']=code_str.upper()

    from io import BytesIO
    #生成IO对象
    tem=BytesIO()
    #把图片对象以png格式放到tem对象中
    img_obj.save(tem,'png')

    #取出tem中的值
    data=tem.getvalue()

    # content_type 以什么类型和编码读取,这里设置的图片类型
    return HttpResponse(data, content_type="image/png")

    def index(request):
    return render(request,'index.html')

    ———————————————————————————————————————————————————————————————————————————————

    HTML

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>登录</title>
    <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
    <link rel="stylesheet" href="/static/mystyle.css">
    </head>
    <body>
    <div class="container">
    <div class="row">
    <div class="col-md-4 col-md-offset-4">
    {# 面板开始#}
    <div class="panel panel-primary">
    <div class="panel-heading">
    <h3 class="panel-title">BBS登录界面</h3>
    </div>
    <div class="panel-body">
    {# 登录界面开始#}

    <form>
    <div class="form-group">
    <label for="{{ login_obj.username.id_for_label }}">{{ login_obj.username.label }}</label>
    {{ login_obj.username }}
    </div>
    <div class="form-group">
    <label for="{{ login_obj.password.id_for_label }}">{{ login_obj.password.label }}</label>
    {{ login_obj.password }}
    </div>
    <div id="v-code-wrapper" class="form-group">
    <label for="">验证码</label>
    <input type="text" class="form-control" id="v-code-input">
    <img id="v_code" src="/v_code/" alt="">
    </div>

    <button type="button" class="btn btn-default btn-primary" id="button_denglu">登陆</button>
    <span id="cuo" class="error"></span>
    </form>
    {# 登录界面结束#}

    </div>
    </div>
    {# 面板结束#}

    </div>
    </div>
    </div>

    <script src="/static/jquery-3.3.1.min.js"></script>
    <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
    <script src="/static/setupAjax.js"></script>

    <script>
    $('#button_denglu').click(function () {
    $.ajax(
    {
    url: "/login/",
    type: "POST",
    data: {
    "id_username": $('#id_username').val(),
    "id_password": $('#id_password').val(),
    "v_code": $('#v-code-input').val()
    },
    success: function (data) {
    if (data.code) {
    $('.error').text(data.data)
    } else {
    location.href = data.data
    }
    }
    }
    )
    });
    $('form input').focus(function () {
    $('.error').text("")
    });

    $('#v_code').click(function () {
    this.src += '?'
    })
    </script>

    </body>
    </html>
  • 相关阅读:
    不定方程(Exgcd)
    [模板]乘法逆元
    STL-Deque(双端队列)与单调队列的实现
    最优得分 score
    摆书 book
    [模板]树链剖分
    [模板]Splay
    NOIP2013 货车运输
    Java的类类型和类的动态加载
    Java:搜索特定后缀名的文件
  • 原文地址:https://www.cnblogs.com/yangli0504/p/9256743.html
Copyright © 2020-2023  润新知