zoukankan      html  css  js  c++  java
  • 路飞学城Python-Day117

    jango用户登录界面

    """
    Django settings for cnblog project.
    
    Generated by 'django-admin startproject' using Django 2.1.2.
    
    For more information on this file, see
    https://docs.djangoproject.com/en/2.1/topics/settings/
    
    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/2.1/ref/settings/
    """
    
    import os
    
    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    
    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
    
    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = '618*78-lmwto37@v+-7j-(wi#glc=sm_-d63fi5nv%o6zf8#+i'
    
    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True
    
    ALLOWED_HOSTS = []
    
    
    # Application definition
    
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'blog.apps.BlogConfig',
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    
    ROOT_URLCONF = 'cnblog.urls'
    
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                    'social_django.context_processors.backends',  # for oa auth2
                    'social_django.context_processors.login_redirect',  # for oa auth2
                ],
            },
        },
    ]
    
    WSGI_APPLICATION = 'cnblog.wsgi.application'
    
    
    # Database
    # https://docs.djangoproject.com/en/2.1/ref/settings/#databases
    
    # DATABASES = {
    #     'default': {
    #         'ENGINE': 'django.db.backends.sqlite3',
    #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #     }
    # }
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'cnblog',
            'USER': 'root',
            'PASSWORD': '123',
            'HOST': 'localhost',
            'PORT': '3306',
        }
    }
    AUTH_USER_MODEL = 'blog.UserInfo'
    # Password validation
    # https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
    
    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]
    
    
    # Internationalization
    # https://docs.djangoproject.com/en/2.1/topics/i18n/
    
    LANGUAGE_CODE = 'en-us'
    
    TIME_ZONE = 'Asia/Shanghai'
    
    USE_I18N = True
    
    USE_L10N = True
    
    USE_TZ = True
    
    
    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/2.1/howto/static-files/
    
    STATIC_URL = '/static/'
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static')
    ]
    settings.py
    """cnblog URL Configuration
    
    The `urlpatterns` list routes URLs to views. For more information please see:
        https://docs.djangoproject.com/en/2.1/topics/http/urls/
    Examples:
    Function views
        1. Add an import:  from my_app import views
        2. Add a URL to urlpatterns:  path('', views.home, name='home')
    Class-based views
        1. Add an import:  from other_app.views import Home
        2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
    Including another URLconf
        1. Import the include() function: from django.urls import include, path
        2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
    """
    from django.contrib import admin
    from django.urls import path
    from django.conf.urls import url
    from blog import views
    from blog.check_views import pcgetcaptcha
    from blog.check_views import pcvalidate
    from blog.check_views import pcajax_validate
    from blog.check_views import mobileajax_validate
    from blog.check_views import home
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/', views.login),
        path('get_validCode_img/', views.get_validCode_img),
        # 认证路由
        url(r'^pc-geetest/register', pcgetcaptcha, name='pcgetcaptcha'),
        url(r'^mobile-geetest/register', pcgetcaptcha, name='mobilegetcaptcha'),
        url(r'^pc-geetest/validate$', pcvalidate, name='pcvalidate'),
        url(r'^pc-geetest/ajax_validate',pcajax_validate, name='pcajax_validate'),
        url(r'^mobile-geetest/ajax_validate',mobileajax_validate, name='mobileajax_validate'),
        url(r'/*/', home, name='home'),
    ]
    urls.py
    #!coding:utf8
    import sys
    import random
    import json
    import requests
    import time
    from hashlib import md5
    
    
    if sys.version_info >= (3,):
        xrange = range
    
    VERSION = "3.0.0"
    
    
    class GeetestLib(object):
    
        FN_CHALLENGE = "geetest_challenge"
        FN_VALIDATE = "geetest_validate"
        FN_SECCODE = "geetest_seccode"
    
        GT_STATUS_SESSION_KEY = "gt_server_status"
    
        API_URL = "http://api.geetest.com"
        REGISTER_HANDLER = "/register.php"
        VALIDATE_HANDLER = "/validate.php"
        JSON_FORMAT = False
    
        def __init__(self, captcha_id, private_key):
            self.private_key = private_key
            self.captcha_id = captcha_id
            self.sdk_version = VERSION
            self._response_str = ""
    
    
        def pre_process(self, user_id=None,new_captcha=1,JSON_FORMAT=1,client_type="web",ip_address=""):
            """
            验证初始化预处理.
            //TO DO  arrage the parameter
            """
            status, challenge = self._register(user_id,new_captcha,JSON_FORMAT,client_type,ip_address)
            self._response_str = self._make_response_format(status, challenge,new_captcha)
            return status
    
        def _register(self, user_id=None,new_captcha=1,JSON_FORMAT=1,client_type="web",ip_address=""):
            pri_responce = self._register_challenge(user_id,new_captcha,JSON_FORMAT,client_type,ip_address)
            if pri_responce:
                if JSON_FORMAT == 1:
                    response_dic = json.loads(pri_responce)
                    challenge = response_dic["challenge"]
                else:
                    challenge = pri_responce
            else:
                challenge=" "
            if len(challenge) == 32:
                challenge = self._md5_encode("".join([challenge, self.private_key]))
                return 1,challenge
            else:
                return 0, self._make_fail_challenge()
    
        def get_response_str(self):
            return self._response_str
    
        def _make_fail_challenge(self):
            rnd1 = random.randint(0, 99)
            rnd2 = random.randint(0, 99)
            md5_str1 = self._md5_encode(str(rnd1))
            md5_str2 = self._md5_encode(str(rnd2))
            challenge = md5_str1 + md5_str2[0:2]
            return challenge
    
        def _make_response_format(self, success=1, challenge=None,new_captcha=1):
            if not challenge:
                challenge = self._make_fail_challenge()
            if new_captcha:
                string_format = json.dumps(
                    {'success': success, 'gt':self.captcha_id, 'challenge': challenge,"new_captcha":True})
            else:
                string_format = json.dumps(
                    {'success': success, 'gt':self.captcha_id, 'challenge': challenge,"new_captcha":False})
            return string_format
    
        def _register_challenge(self, user_id=None,new_captcha=1,JSON_FORMAT=1,client_type="web",ip_address=""):
            if user_id:
                register_url = "{api_url}{handler}?gt={captcha_ID}&user_id={user_id}&json_format={JSON_FORMAT}&client_type={client_type}&ip_address={ip_address}".format(
                        api_url=self.API_URL, handler=self.REGISTER_HANDLER, captcha_ID=self.captcha_id, user_id=user_id,new_captcha=new_captcha,JSON_FORMAT=JSON_FORMAT,client_type=client_type,ip_address=ip_address)
            else:
                register_url = "{api_url}{handler}?gt={captcha_ID}&json_format={JSON_FORMAT}&client_type={client_type}&ip_address={ip_address}".format(
                        api_url=self.API_URL, handler=self.REGISTER_HANDLER, captcha_ID=self.captcha_id,new_captcha=new_captcha,JSON_FORMAT=JSON_FORMAT,client_type=client_type,ip_address=ip_address)
            try:
                response = requests.get(register_url, timeout=2)
                if response.status_code == requests.codes.ok:
                    res_string = response.text
                else:
                    res_string = ""
            except:
                res_string = ""
            return res_string
    
        def success_validate(self, challenge, validate, seccode, user_id=None,gt=None,data='',userinfo='',JSON_FORMAT=1):
            """
            正常模式的二次验证方式.向geetest server 请求验证结果.
            """
            if not self._check_para(challenge, validate, seccode):
                return 0
            if not self._check_result(challenge, validate):
                return 0
            validate_url = "{api_url}{handler}".format(
                api_url=self.API_URL, handler=self.VALIDATE_HANDLER)
            query = {
                "seccode": seccode,
                "sdk": ''.join( ["python_",self.sdk_version]),
                "user_id": user_id,
                "data":data,
                "timestamp":time.time(),
                "challenge":challenge,
                "userinfo":userinfo,
                "captchaid":gt,
                "json_format":JSON_FORMAT
            }
            backinfo = self._post_values(validate_url, query)
            if JSON_FORMAT == 1:
                backinfo = json.loads(backinfo)
                backinfo = backinfo["seccode"]
            if backinfo == self._md5_encode(seccode):
                return 1
            else:
                return 0
    
        def _post_values(self, apiserver, data):
            response = requests.post(apiserver, data)
            return response.text
    
        def _check_result(self, origin, validate):
            encodeStr = self._md5_encode(self.private_key + "geetest" + origin)
            if validate == encodeStr:
                return True
            else:
                return False
    
        def failback_validate(self, challenge, validate, seccode):
            """
            failback模式的二次验证方式.在本地对轨迹进行简单的判断返回验证结果.
            """
            if not self._check_para(challenge, validate, seccode):
                return 0
            validate_result = self._failback_check_result(
                challenge, validate,)
            return validate_result
    
        def _failback_check_result(self,challenge,validate):
            encodeStr = self._md5_encode(challenge)
            if validate == encodeStr:
                return True
            else:
                return False
    
    
    
        def _check_para(self, challenge, validate, seccode):
            return (bool(challenge.strip()) and bool(validate.strip()) and  bool(seccode.strip()))
    
    
    
        def _md5_encode(self, values):
            if type(values) == str:
                values = values.encode()
            m = md5(values)
            return m.hexdigest()
    geetest.py
    # coding:utf-8
    import json
    
    from django.shortcuts import render
    from django.http import HttpResponse
    from blog.geetest import GeetestLib
    from django.views.decorators.csrf import csrf_exempt
    
    pc_geetest_id = "b46d1900d0a894591916ea94ea91bd2c"
    pc_geetest_key = "36fc3fe98530eea08dfc6ce76e3d24c4"
    mobile_geetest_id = "7c25da6fe21944cfe507d2f9876775a9"
    mobile_geetest_key = "f5883f4ee3bd4fa8caec67941de1b903"
    
    
    
    def home(request):
        return render(request, "index.html",)
    
    @csrf_exempt
    def pcgetcaptcha(request):
        user_id = 'test'
        gt = GeetestLib(pc_geetest_id, pc_geetest_key)
        status = gt.pre_process(user_id)
        request.session[gt.GT_STATUS_SESSION_KEY] = status
        request.session["user_id"] = user_id
        response_str = gt.get_response_str()
        return HttpResponse(response_str)
    
    
    def mobilegetcaptcha(request):
        user_id = 'test'
        gt = GeetestLib(mobile_geetest_id, mobile_geetest_key)
        status = gt.pre_process(user_id)
        request.session[gt.GT_STATUS_SESSION_KEY] = status
        request.session["user_id"] = user_id
        response_str = gt.get_response_str()
        return HttpResponse(response_str)
    
    
    def pcvalidate(request):
        if request.method == "POST":
            gt = GeetestLib(pc_geetest_id, pc_geetest_key)
            challenge = request.POST.get(gt.FN_CHALLENGE, '')
            validate = request.POST.get(gt.FN_VALIDATE, '')
            seccode = request.POST.get(gt.FN_SECCODE, '')
            status = request.session[gt.GT_STATUS_SESSION_KEY]
            user_id = request.session["user_id"]
            if status:
                result = gt.success_validate(challenge, validate, seccode, user_id)
            else:
                result = gt.failback_validate(challenge, validate, seccode)
            result = "<html><body><h1>登录成功</h1></body></html>" if result else "<html><body><h1>登录失败</h1></body></html>"
            return HttpResponse(result)
        return HttpResponse("error")
    
    
    @csrf_exempt
    def pcajax_validate(request):
        if request.method == "POST":
            gt = GeetestLib(pc_geetest_id, pc_geetest_key)
            challenge = request.POST.get(gt.FN_CHALLENGE, '')
            validate = request.POST.get(gt.FN_VALIDATE, '')
            seccode = request.POST.get(gt.FN_SECCODE, '')
            status = request.session[gt.GT_STATUS_SESSION_KEY]
            user_id = request.session["user_id"]
            if status:
                result = gt.success_validate(challenge, validate, seccode, user_id)
            else:
                result = gt.failback_validate(challenge, validate, seccode)
            result = {"status":"success"} if result else {"status":"fail"}
            return HttpResponse(json.dumps(result))
        return HttpResponse("error")
    
    def mobileajax_validate(request):
        if request.method == "POST":
            gt = GeetestLib(mobile_geetest_id, mobile_geetest_key)
            challenge = request.POST.get(gt.FN_CHALLENGE, '')
            validate = request.POST.get(gt.FN_VALIDATE, '')
            seccode = request.POST.get(gt.FN_SECCODE, '')
            status = request.session[gt.GT_STATUS_SESSION_KEY]
            user_id = request.session["user_id"]
            if status:
                result = gt.success_validate(challenge, validate, seccode, user_id)
            else:
                result = gt.failback_validate(challenge, validate, seccode)
            result = {"status":"success"} if result else {"status":"fail"}
            return HttpResponse(json.dumps(result))
        return HttpResponse("error")
    check_views.py
    "v0.4.6 Geetest Inc.";
    
    (function (window) {
        "use strict";
        if (typeof window === 'undefined') {
            throw new Error('Geetest requires browser environment');
        }
    
    var document = window.document;
    var Math = window.Math;
    var head = document.getElementsByTagName("head")[0];
    
    function _Object(obj) {
        this._obj = obj;
    }
    
    _Object.prototype = {
        _each: function (process) {
            var _obj = this._obj;
            for (var k in _obj) {
                if (_obj.hasOwnProperty(k)) {
                    process(k, _obj[k]);
                }
            }
            return this;
        }
    };
    
    function Config(config) {
        var self = this;
        new _Object(config)._each(function (key, value) {
            self[key] = value;
        });
    }
    
    Config.prototype = {
        api_server: 'api.geetest.com',
        protocol: 'http://',
        typePath: '/gettype.php',
        fallback_config: {
            slide: {
                static_servers: ["static.geetest.com", "dn-staticdown.qbox.me"],
                type: 'slide',
                slide: '/static/js/geetest.0.0.0.js'
            },
            fullpage: {
                static_servers: ["static.geetest.com", "dn-staticdown.qbox.me"],
                type: 'fullpage',
                fullpage: '/static/js/fullpage.0.0.0.js'
            }
        },
        _get_fallback_config: function () {
            var self = this;
            if (isString(self.type)) {
                return self.fallback_config[self.type];
            } else if (self.new_captcha) {
                return self.fallback_config.fullpage;
            } else {
                return self.fallback_config.slide;
            }
        },
        _extend: function (obj) {
            var self = this;
            new _Object(obj)._each(function (key, value) {
                self[key] = value;
            })
        }
    };
    var isNumber = function (value) {
        return (typeof value === 'number');
    };
    var isString = function (value) {
        return (typeof value === 'string');
    };
    var isBoolean = function (value) {
        return (typeof value === 'boolean');
    };
    var isObject = function (value) {
        return (typeof value === 'object' && value !== null);
    };
    var isFunction = function (value) {
        return (typeof value === 'function');
    };
    
    var callbacks = {};
    var status = {};
    
    var random = function () {
        return parseInt(Math.random() * 10000) + (new Date()).valueOf();
    };
    
    var loadScript = function (url, cb) {
        var script = document.createElement("script");
        script.charset = "UTF-8";
        script.async = true;
    
        script.onerror = function () {
            cb(true);
        };
        var loaded = false;
        script.onload = script.onreadystatechange = function () {
            if (!loaded &&
                (!script.readyState ||
                "loaded" === script.readyState ||
                "complete" === script.readyState)) {
    
                loaded = true;
                setTimeout(function () {
                    cb(false);
                }, 0);
            }
        };
        script.src = url;
        head.appendChild(script);
    };
    
    var normalizeDomain = function (domain) {
        // special domain: uems.sysu.edu.cn/jwxt/geetest/
        // return domain.replace(/^https?://|/.*$/g, ''); uems.sysu.edu.cn
        return domain.replace(/^https?://|/$/g, ''); // uems.sysu.edu.cn/jwxt/geetest
    };
    var normalizePath = function (path) {
        path = path.replace(//+/g, '/');
        if (path.indexOf('/') !== 0) {
            path = '/' + path;
        }
        return path;
    };
    var normalizeQuery = function (query) {
        if (!query) {
            return '';
        }
        var q = '?';
        new _Object(query)._each(function (key, value) {
            if (isString(value) || isNumber(value) || isBoolean(value)) {
                q = q + encodeURIComponent(key) + '=' + encodeURIComponent(value) + '&';
            }
        });
        if (q === '?') {
            q = '';
        }
        return q.replace(/&$/, '');
    };
    var makeURL = function (protocol, domain, path, query) {
        domain = normalizeDomain(domain);
    
        var url = normalizePath(path) + normalizeQuery(query);
        if (domain) {
            url = protocol + domain + url;
        }
    
        return url;
    };
    
    var load = function (protocol, domains, path, query, cb) {
        var tryRequest = function (at) {
    
            var url = makeURL(protocol, domains[at], path, query);
            loadScript(url, function (err) {
                if (err) {
                    if (at >= domains.length - 1) {
                        cb(true);
                    } else {
                        tryRequest(at + 1);
                    }
                } else {
                    cb(false);
                }
            });
        };
        tryRequest(0);
    };
    
    
    var jsonp = function (domains, path, config, callback) {
        if (isObject(config.getLib)) {
            config._extend(config.getLib);
            callback(config);
            return;
        }
        if (config.offline) {
            callback(config._get_fallback_config());
            return;
        }
    
        var cb = "geetest_" + random();
        window[cb] = function (data) {
            if (data.status == 'success') {
                callback(data.data);
            } else if (!data.status) {
                callback(data);
            } else {
                callback(config._get_fallback_config());
            }
            window[cb] = undefined;
            try {
                delete window[cb];
            } catch (e) {
            }
        };
        load(config.protocol, domains, path, {
            gt: config.gt,
            callback: cb
        }, function (err) {
            if (err) {
                callback(config._get_fallback_config());
            }
        });
    };
    
    var throwError = function (errorType, config) {
        var errors = {
            networkError: '网络错误',
            gtTypeError: 'gt字段不是字符串类型'
        };
        if (typeof config.onError === 'function') {
            config.onError(errors[errorType]);
        } else {
            throw new Error(errors[errorType]);
        }
    };
    
    var detect = function () {
        return window.Geetest || document.getElementById("gt_lib");
    };
    
    if (detect()) {
        status.slide = "loaded";
    }
    
    window.initGeetest = function (userConfig, callback) {
    
        var config = new Config(userConfig);
    
        if (userConfig.https) {
            config.protocol = 'https://';
        } else if (!userConfig.protocol) {
            config.protocol = window.location.protocol + '//';
        }
    
        // for KFC
        if (userConfig.gt === '050cffef4ae57b5d5e529fea9540b0d1' ||
            userConfig.gt === '3bd38408ae4af923ed36e13819b14d42') {
            config.apiserver = 'yumchina.geetest.com/'; // for old js
            config.api_server = 'yumchina.geetest.com';
        }
    
        if (isObject(userConfig.getType)) {
            config._extend(userConfig.getType);
        }
        jsonp([config.api_server || config.apiserver], config.typePath, config, function (newConfig) {
            var type = newConfig.type;
            var init = function () {
                config._extend(newConfig);
                callback(new window.Geetest(config));
            };
    
            callbacks[type] = callbacks[type] || [];
            var s = status[type] || 'init';
            if (s === 'init') {
                status[type] = 'loading';
    
                callbacks[type].push(init);
    
                load(config.protocol, newConfig.static_servers || newConfig.domains, newConfig[type] || newConfig.path, null, function (err) {
                    if (err) {
                        status[type] = 'fail';
                        throwError('networkError', config);
                    } else {
                        status[type] = 'loaded';
                        var cbs = callbacks[type];
                        for (var i = 0, len = cbs.length; i < len; i = i + 1) {
                            var cb = cbs[i];
                            if (isFunction(cb)) {
                                cb();
                            }
                        }
                        callbacks[type] = [];
                    }
                });
            } else if (s === "loaded") {
                init();
            } else if (s === "fail") {
                throwError('networkError', config);
            } else if (s === "loading") {
                callbacks[type].push(init);
            }
        });
    
    };
    
    
    })(window);
    gt.js
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登录界面</title>
        <link rel="shortcut icon" href=" /static/imgs/login.ico"/>
        <link rel="stylesheet" href="/static/blog/bs/dist/css/bootstrap.min.css">
        <link rel="stylesheet" href="/static/blog/fa/web-fonts-with-css/css/fontawesome-all.min.css">
    </head>
    <body>
    {#    <h3>登录界面</h3>#}
    <div class="container" style="background-color: #eeeeee">
        <div class="row">
            <div class="col-md-6 col-lg-offset-3">
                <div class="form-group col-lg-offset-4">
                    <i class="fas fa-user-circle fa-10x"></i>
                    <p>sign in with your account</p>
                </div>
                <form>
                    {% csrf_token %}
                    <div class="form-group">
                        <label for="users"><i class="fas fa-user"></i>用户名</label>
                        <input type="text" id="users" class="form-control">
                    </div>
                    <div class="form-group">
                        <label for="pwd"><i class="fas fa-key"></i>密码</label>
                        <input type="password" id="pwd" class="form-control">
                    </div>
    {#                验证码功能#}
    {#                <div class="form-group">#}
    {#                    <label for="pwd"><i class="fas fa-check-circle"></i>验证码</label>#}
    {#                    <div class="row">#}
    {#                        <div class="col-md-6">#}
    {#                            <input type="text" class="form-control" id="valid_code"/>#}
    {#                        </div>#}
    {#                        <div class="col-md-6">#}
    {#                            <img id="code_img" width="260" height="32" src="/get_validCode_img/">#}
    {#                        </div>#}
    {#                    </div>#}
    {#                </div>#}
                    <button   id="popup-submit" type="button" class="btn btn-info login_btn col-lg-3"><i
                            class="fa fa-sign-in-alt col-lg-pull-1"></i>登录
                    </button>
                    <div id="popup-captcha"></div>
                    <span class="error pull-right form-group"></span>
    {#                                    <input type="button" class="btn btn-info login_btn col-lg-3 pull-right" value="sign in">#}
    
                </form>
            </div>
        </div>
    </div>
    </body>
    <script src="/static/JS/jquery-3.3.1.min.js"></script>
    <script>
        {#刷新验证码#}
         $('#code_img').click(function () {
           $(this)[0].src+="?";
        });
    
    </script>
    <script src="/static/gt/gt.js"></script>
    <script>
        var handlerPopup = function (captchaObj) {
            // 成功的回调
            captchaObj.onSuccess(function () {
                var validate = captchaObj.getValidate();
                $.ajax({
                    url: "/pc-geetest/ajax_validate", // 进行二次验证
                    type: "post",
                    dataType: "json",
                    data: {
                        username: $('#users').val(),
                        password: $('#pwd').val(),
                        geetest_challenge: validate.geetest_challenge,
                        geetest_validate: validate.geetest_validate,
                        geetest_seccode: validate.geetest_seccode,
                        csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(),
                    },
                    success: function (data) {
                        if (data && (data.status === "success")) {
                            location.href = '/index/';
                        } else {
                            location.href = '/login/';
                        }
                    }
                });
            });
            $("#popup-submit").click(function () {
                 $.ajax({
                url:"",
                type:'post',
                data:{
                    user:$('#users').val(),
                    pwd: $('#pwd').val(),
                    valid_code: $('#valid_code').val(),
                    csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(),
    
                },
                success:function (data) {
                  if (data.user){
                      if(location.search){
                            location.href = location.search.slice(6)
                      }else {
                           captchaObj.show();
                      }
                  }else{
                      $('.error').text(data.msg).css({'color':'red'});
                      setTimeout(function () {
                            $('.error').text('');
                      }, 1000);
                  }
                }
            });
    
            });
            // 将验证码加到id为captcha的元素里
            captchaObj.appendTo("#popup-captcha");
            // 更多接口参考:http://www.geetest.com/install/sections/idx-client-sdk.html
        };
        // 验证开始需要向网站主后台获取id,challenge,success(是否启用failback)
        $.ajax({
            url: "/pc-geetest/register?t=" + (new Date()).getTime(), // 加随机数防止缓存
            type: "get",
            dataType: "json",
             csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val(),
            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);
            }
        });
    </script>
    </html>
    login.html

     

    Win a contest, win a challenge
  • 相关阅读:
    hdu 6085 bitset优化
    hdu 6070 二分答案+线段树
    hdu 6069 区间筛
    hdu 6058 并查集
    CF 835D D. Palindromic characteristics 字符串hash
    (转)Linux整合apache和tomcat构建Web服务器
    iTunes备份文件路径
    mac下Apache添加限速模块mod_bw
    mac显示隐藏文件夹
    Mac OS X下HomeBrew安装卸载
  • 原文地址:https://www.cnblogs.com/pandaboy1123/p/9814809.html
Copyright © 2011-2022 走看看