django 中验证码登录验证的实现

django中有关于登录验证的第三方模块,大家可以自己去搜搜,这里说一下自定义验证码登录的情况(可以参考http://www.cnblogs.com/alex3714/articles/6662365.html这篇文章)。

我们生成的验证码图片在发送给html前要先存放,可以有两种地方:

1.内存中,我们开发环境下时可以这样用,但是在生产时最好别这样,因为访问量太高的话,你内存就等着爆吧;

2.static(静态文件)中,并且可以设置在用了登录成功后可以立即删除掉图片,节省开销。


至于具体的实现过程,可以看上面的文章,不过有几个细节作者没有说清楚,我是根据我自己的情况将它完善了。

1.表单

<form action="/code/checkcode/" method="post">
    {% csrf_token %}
    <div class="form-group">
        <div class="input-group">
            <div class="input-group-addon">
                <img height="30px" src="/static/image/{{ today_str }}/{{ filename }}.png" />
            div>
            <input style="height: 50px" type="text" name="verify_code" class="form-control" placeholder="验证码">
            <input  type="submit" name="verify_code_key" value="submit" >
        div>
    div>
form>
2.setting.py存储路径设置

VERIFICATION_CODE_IMGS_DIR = 'E:\web project\web\webchat\static\image'

3.登录和验证

def acc_login(request):
    today_str = datetime.date.today().strftime("%Y%m%d")
    verify_code_img_path = "%s/%s" %(settings.VERIFICATION_CODE_IMGS_DIR, today_str)
    if not os.path.isdir(verify_code_img_path):
        os.makedirs(verify_code_img_path,exist_ok=True)
    print("session:", request.session.session_key)
    random_filename = "".join(random.sample(string.ascii_lowercase,4))
    random_code = verify_code.gene_code(verify_code_img_path,random_filename)
    cache.set('my_code', random_code,30)
    return render(request, 'login.html', {"filename": random_filename, "today_str": today_str})


def checkcode(request):
    err_msg = ''
    if request.method == "POST":
        _verify_code = request.POST.get('verify_code')
        if cache.get('my_code') == _verify_code:
            err_msg = 'successful'
        else:
            err_msg = "error!"

    return render(request, 'test.html', {'error': err_msg})
4.最后验证码图片可以自己设置删除,节省开销,很简单的,就不写了。



你可能感兴趣的:(web)