路飞学城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': '',
- 'HOST': 'localhost',
- 'PORT': '',
- }
- }
- 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
路飞学城Python-Day117的更多相关文章
- 路飞学城—Python爬虫实战密训班 第三章
路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...
- 路飞学城—Python爬虫实战密训班 第二章
路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...
- 路飞学城Python爬虫课第一章笔记
前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...
- 路飞学城-Python开发集训-第3章
学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...
- 路飞学城-Python开发集训-第1章
学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...
- 路飞学城-Python开发集训-第4章
学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...
- 路飞学城-Python开发集训-第2章
学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...
- 路飞学城-Python开发-第二章
''' 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, '汽车之家' ...
- 路飞学城-Python开发-第三章
# 数据结构: # goods = [ # {"name": "电脑", "price": 1999}, # {"name&quo ...
- 路飞学城-Python开发-第一章
# 基础需求: # 让用户输入用户名密码 # 认证成功后显示欢迎信息 # 输错三次后退出程序 username = 'pandaboy' password = ' def Login(username ...
随机推荐
- 调用的方法里接收一个List<>类型的参数,里面是自定义的EC类, 我要通过反射构建这List对象
public static object CreateGeneric(Type generic, Type innerType, params object[] args) ...
- elasticsearch 权威指南入门阅读笔记(一)
相关文档 esapi:https://es.xiaoleilu.com/010_Intro/10_Installing_ES.html https://esdoc.bbossgroups.co ...
- 转载 - 算法实践——舞蹈链(Dancing Links)算法求解数独
出处:http://www.cnblogs.com/grenet/p/3163550.html 在“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”一文中介绍了舞蹈链(Dan ...
- JAVA的输入输出基本操作样例
这些类的继承关系有些类似,弄一个作为样例,理解一下其中的机制. package cc.openhome; import java.io.*; public class Member { private ...
- linux 线程切换效率与进程切换效率相差究竟有多大?
Author:DriverMonkey Mail:bookworepeng@Hotmail.com Phone:13410905075 QQ:196568501 Are Linux threads t ...
- 推断一个点是否在某个区域内。百度,高德,腾讯都能用。(php版)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- Warning: File `src/core/nginx.h' has modification time 1.2e+07 s in the future
Nginx安装时Warning: File `src/core/nginx.h' has modification time 1.2e+07 s in the future问题的解决方法 问题场景: ...
- Java-Maven:Maven清单
ylbtech-Java-Maven:Maven清单 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http ...
- 框架-Eureka:初识 Eureka
ylbtech-框架-Eureka:初识 Eureka 1.返回顶部 1. 1.1. http://localhost:2100/ 1.2. 2. Eureka - Last N events 3. ...
- [牛客挑战赛 30D] 小A的昆特牌 解题报告 (组合数学)
interlinkage: https://ac.nowcoder.com/acm/contest/375/D description: solution: 我们枚举步兵的数量$x$,还剩下$S-x$ ...