1. 程式人生 > >django 中驗證碼登入驗證的實現

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.最後驗證碼圖片可以自己設定刪除,節省開銷,很簡單的,就不寫了。