1. 程式人生 > >登錄認證的兩種方式

登錄認證的兩種方式

scrip put user hid 位置 變量 越界 per var

一.手動輸入驗證碼

技術分享圖片

技術分享圖片

技術分享圖片
def v_code(request):
    from PIL import Image,ImageDraw,ImageFont
    import random
    #定義一個生成隨機顏色代碼的內部函數,返回值對應RGB()裏面的三個參數值
    def get_color():
        return random.randint(0,255),random.randint(0,255),random.randint(0,255)
    #生成一個圖片對象
    img_obj=Image.new(
        
RGB, (250,35), color=(144,144,144) ) #在圖片中加文字 #生成一個畫筆對象 draw_obj=ImageDraw.Draw(img_obj) #加載字體文件 font_obj=ImageFont.truetype(static/font/kumo.ttf,size=40) #for循環五次,每次寫一個隨機的字符 tmp_list=[] for i in range(5): n=str(random.randint(0,9
)) l=chr(random.randint(97,122)) u=chr(random.randint(65,90)) r=random.choice([n,l,u]) tmp_list.append(r) draw_obj.text( (i*48+20,0),#驗證碼在圖片區的位置 r, #內容 get_color(),#顏色 font=font_obj ) #得到生成的隨機驗證碼 v_code_str
=‘‘.join(tmp_list) #不能使用全局的變量保存驗證碼,會被覆蓋 #每個請求都應該對應自己的驗證碼 request.session[v_code]=v_code_str.upper() #加幹擾線 # width = 250 # 圖片寬度(防止越界) # height = 35 # for i in range(2): # x1 = random.randint(0, width) # x2 = random.randint(0, width) # y1 = random.randint(0, height) # y2 = random.randint(0, height) # draw_obj.line((x1, y1, x2, y2), fill=get_color()) # # # 加幹擾點 # for i in range(2): # draw_obj.point([random.randint(0, width), random.randint(0, height)], fill=get_color()) # x = random.randint(0, width) # y = random.randint(0, height) # draw_obj.arc((x, y, x+4, y+4), 0, 90, fill=get_color()) #將圖片直接在內存中保存 from io import BytesIO tmp=BytesIO()#生成一個io對象 img_obj.save(tmp,png) data=tmp.getvalue() return HttpResponse(data,content_type=image/png)
驗證碼視圖函數 技術分享圖片
def login(request):
    form_obj=forms.UserForm()
    if request.method==POST:
        ret={code:0}
        username=request.POST.get(username)
        password=request.POST.get(password)
        v_code=request.POST.get(v_code,‘‘)
        if v_code.upper()==request.session.get(v_code,‘‘):
            #自動校驗用戶名和密碼對不對
            user=auth.authenticate(username=username,password=password)
            if user:
                # 內置的login方法
                # 1. 生成Session數據,存一下user_id 然後把sessionid寫入Cookie
                # 後續每一次請求來的時候,AuthenticationMiddleware中的process_request方法中
                # 會自動幫我們取到user_id,然後到數據庫中拿出user對象,然後添加到request.user屬性中 --> request.user = user
                # 後續我們都可以通過request.user拿到當前的登陸用戶對象
                auth.login(request,user)
                ret[data]=/home/
            else:
                ret[code]=1
                ret[data]=用戶名或密碼錯誤
        else:
            ret[code]=1
            ret[data]=驗證碼錯誤
        return JsonResponse(ret)
    return render(request,login.html,{form_obj:form_obj})
login視圖函數

二.滑動驗證碼

技術分享圖片

技術分享圖片
<script>
     var handlerPopup = function (captchaObj) {
        // 成功的回調
        captchaObj.onSuccess(function () {
            var validate = captchaObj.getValidate();
            $.ajax({
                url: "", // 進行二次驗證
                type: "post",
                data: {
                    username: $("#id_username").val(),
                    password: $("#id_password").val(),
                    geetest_challenge: validate.geetest_challenge,
                    geetest_validate: validate.geetest_validate,
                    geetest_seccode: validate.geetest_seccode
                },
                success: function (data) {
                    if (!data.code) {
                        location.href = data.data;
                    } else {
                        // 有錯誤
                        $("#login-error").text(data.data);
                    }
                },
                error: function (err) {
                    console.log(err)
                }
            });
        });
         $("#b1").click(function () {
            captchaObj.show();
        });
        // 將驗證碼加到id為captcha的元素裏
        captchaObj.appendTo("#popup-captcha");
        // 更多接口參考:http://www.geetest.com/install/sections/idx-client-sdk.html
    };

    // 驗證開始需要向網站主後臺獲取id,challenge,success(是否啟用failback)
    $.ajax({
        url: "/pcgetcaptcha?t=" + (new Date()).getTime(), // 加隨機數防止緩存
        type: "get",
        dataType: "json",
        success: function (data) {
            // 使用initGeetest接口
            // 參數1:配置參數
            // 參數2:回調,回調的第一個參數驗證碼對象,之後可以使用它做appendTo之類的事件
            initGeetest({
                gt: data.gt,
                challenge: data.challenge,
                product: "popup", // 產品形式,包括:float,embed,popup。註意只對PC版驗證碼有效
                offline: !data.success // 表示用戶後臺檢測極驗服務器是否宕機,一般不需要關註
                // 更多配置參數請參見:http://www.geetest.com/install/sections/idx-client-sdk.html#config
            }, handlerPopup);
        }
    });


    $(document).ready(function () {
        // 文檔加載完之後自動執行的
        // 當form中的input標簽獲取光標之後,就清空之前的錯誤信息
        $("form input").focus(function () {
            $("#login-error").text("");
        });

    })




</script>
對應的ajax處理方式

技術分享圖片

技術分享圖片

登錄認證的兩種方式