python第一百一十八天---ajax--图片验证码 + Session

原生AJAX  
Ajax主要就是使用 【XmlHttpRequest】对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE),Ajax首次出现IE5.5中存在(ActiveX控件)。
1、XmlHttpRequest对象介绍
XmlHttpRequest对象的主要方法:

 1 XmlHttpRequest对象的主要方法:
 2     a. void open(String method,String url,Boolen async)
 3    用于创建请求
 4
 5    参数:
 6        method: 请求方式(字符串类型),如:POST、GET、DELETE...
 7        url:    要请求的地址(字符串类型)
 8        async:  是否异步(布尔类型)
 9
10 b. void send(String body)
11     用于发送请求
12
13     参数:
14         body: 要发送的数据(字符串类型)
15
16 c. void setRequestHeader(String header,String value)
17     用于设置请求头
18
19     参数:
20         header: 请求头的key(字符串类型)
21         vlaue:  请求头的value(字符串类型)
22
23 d. String getAllResponseHeaders()
24     获取所有响应头
25
26     返回值:
27         响应头数据(字符串类型)
28
29 e. String getResponseHeader(String header)
30     获取响应头中指定header的值
31
32     参数:
33         header: 响应头的key(字符串类型)
34
35     返回值:
36         响应头中指定的header对应的值
37
38 f. void abort()
39
40     终止请求

XmlHttpRequest对象的主要属性:

 1 a. Number readyState
 2    状态值(整数)
 3
 4    详细:
 5       0-未初始化,尚未调用open()方法;
 6       1-启动,调用了open()方法,未调用send()方法;
 7       2-发送,已经调用了send()方法,未接收到响应;
 8       3-接收,已经接收到部分响应数据;
 9       4-完成,已经接收到全部响应数据;
10
11     b. Function onreadystatechange
12        当readyState的值改变时自动触发执行其对应的函数(回调函数)
13
14     c. String responseText
15        服务器返回的数据(字符串类型)
16
17     d. XmlDocument responseXML
18        服务器返回的数据(Xml对象)
19
20     e. Number states
21        状态码(整数),如:200、404...
22
23     f. String statesText
24        状态文本(字符串),如:OK、NotFound...

2、跨浏览器支持  
XmlHttpRequest    IE7+, Firefox, Chrome, Opera, etc.ActiveXObject("Microsoft.XMLHTTP")    IE6, IE5
基于原生AJAX - Demo

 1 <!DOCTYPE html>
 2     <html>
 3     <head lang="en">
 4         <meta charset="UTF-8">
 5         <title></title>
 6     </head>
 7     <body>
 8
 9         <h1>XMLHttpRequest - Ajax请求</h1>
10         <input type="button" onclick="XmlGetRequest();" value="Get发送请求" />
11         <input type="button" onclick="XmlPostRequest();" value="Post发送请求" />
12
13         <script src="/statics/jquery-1.12.4.js"></script>
14         <script type="text/javascript">
15
16             function GetXHR(){
17                 var xhr = null;
18                 if(XMLHttpRequest){
19                     xhr = new XMLHttpRequest();
20                 }else{
21                     xhr = new ActiveXObject("Microsoft.XMLHTTP");
22                 }
23                 return xhr;
24
25             }
26
27             function XhrPostRequest(){
28                 var xhr = GetXHR();
29                 // 定义回调函数
30                 xhr.onreadystatechange = function(){
31                     if(xhr.readyState == 4){
32                         // 已经接收到全部响应数据,执行以下操作
33                         var data = xhr.responseText;
34                         console.log(data);
35                     }
36                 };
37                 // 指定连接方式和地址----文件方式
38                 xhr.open(‘POST‘, "/test/", true);
39                 // 设置请求头
40                 xhr.setRequestHeader(‘Content-Type‘, ‘application/x-www-form-urlencoded; charset-UTF-8‘);
41                 // 发送请求
42                 xhr.send(‘n1=1;n2=2;‘);
43             }
44
45             function XhrGetRequest(){
46                 var xhr = GetXHR();
47                 // 定义回调函数
48                 xhr.onreadystatechange = function(){
49                     if(xhr.readyState == 4){
50                         // 已经接收到全部响应数据,执行以下操作
51                         var data = xhr.responseText;
52                         console.log(data);
53                     }
54                 };
55                 // 指定连接方式和地址----文件方式
56                 xhr.open(‘get‘, "/test/", true);
57                 // 发送请求
58                 xhr.send();
59             }
60
61         </script>
62
63     </body>
64     </html>


jQuery Ajax jQuery其实就是一个JavaScript的类库,其将复杂的功能做了上层封装,使得开发者可以在其基础上写更少的代码实现更多的功能。 jQuery 不是生产者,而是大自然搬运工。 jQuery Ajax本质 XMLHttpRequest 或 ActiveXObject 注:2.+版本不再支持IE9以下的浏览器

 1 jQuery Ajax 方法列表
 2     jQuery.get(...)
 3                 所有参数:
 4                      url: 待载入页面的URL地址
 5                     data: 待发送 Key/value 参数。
 6                  success: 载入成功时回调函数。
 7                 dataType: 返回内容格式,xml, json,  script, text, html
 8
 9
10             jQuery.post(...)
11                 所有参数:
12                      url: 待载入页面的URL地址
13                     data: 待发送 Key/value 参数
14                  success: 载入成功时回调函数
15                 dataType: 返回内容格式,xml, json,  script, text, html
16
17
18             jQuery.getJSON(...)
19                 所有参数:
20                      url: 待载入页面的URL地址
21                     data: 待发送 Key/value 参数。
22                  success: 载入成功时回调函数。
23
24
25             jQuery.getScript(...)
26                 所有参数:
27                      url: 待载入页面的URL地址
28                     data: 待发送 Key/value 参数。
29                  success: 载入成功时回调函数。
30
31
32             jQuery.ajax(...)
33
34                 部分参数:
35
36                         url:请求地址
37                        type:请求方式,GET、POST(1.9.0之后用method)
38                     headers:请求头
39                        data:要发送的数据
40                 contentType:即将发送信息至服务器的内容编码类型(默认: "application/x-www-form-urlencoded; charset=UTF-8")
41                       async:是否异步
42                     timeout:设置请求超时时间(毫秒)
43
44                  beforeSend:发送请求前执行的函数(全局)
45                    complete:完成之后执行的回调函数(全局)
46                     success:成功之后执行的回调函数(全局)
47                       error:失败之后执行的回调函数(全局)
48
49
50                     accepts:通过请求头发送给服务器,告诉服务器当前客户端课接受的数据类型
51                    dataType:将服务器端返回的数据转换成指定类型
52                                    "xml": 将服务器端返回的内容转换成xml格式
53                                   "text": 将服务器端返回的内容转换成普通文本格式
54                                   "html": 将服务器端返回的内容转换成普通文本格式,在插入DOM中时,如果包含JavaScript标签,则会尝试去执行。
55                                 "script": 尝试将返回值当作JavaScript去执行,然后再将服务器端返回的内容转换成普通文本格式
56                                   "json": 将服务器端返回的内容转换成相应的JavaScript对象
57                                  "jsonp": JSONP 格式
58                                           使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数
59
60                                   如果不指定,jQuery 将自动根据HTTP包MIME信息返回相应类型(an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string
61
62                  converters: 转换器,将服务器端的内容根据指定的dataType转换类型,并传值给success回调函数
63                          $.ajax({
64                               accepts: {
65                                 mycustomtype: ‘application/x-some-custom-type‘
66                               },
67
68                               // Expect a `mycustomtype` back from server
69                               dataType: ‘mycustomtype‘
70
71                               // Instructions for how to deserialize a `mycustomtype`
72                               converters: {
73                                 ‘text mycustomtype‘: function(result) {
74                                   // Do Stuff
75                                   return newresult;
76                                 }
77                               },
78                             });

基于jQueryAjax - Demo

 1 <!DOCTYPE html>
 2     <html>
 3     <head lang="en">
 4         <meta charset="UTF-8">
 5         <title></title>
 6     </head>
 7     <body>
 8
 9         <p>
10             <input type="button" onclick="XmlSendRequest();" value=‘Ajax请求‘ />
11         </p>
12
13
14         <script type="text/javascript" src="jquery-1.12.4.js"></script>
15         <script>
16
17             function JqSendRequest(){
18                 $.ajax({
19                     url: "http://c2.com:8000/test/",
20                     type: ‘GET‘,
21                     dataType: ‘text‘,
22                     success: function(data, statusText, xmlHttpRequest){
23                         console.log(data);
24                     }
25                 })
26             }
27
28
29         </script>
30     </body>
31     </html>

图片验证码 + Session

check_code.py

  1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3
  4 import random
  5 from PIL import Image, ImageDraw, ImageFont, ImageFilter
  6
  7 _letter_cases = "abcdefghjkmnpqrstuvwxy"  # 小写字母,去除可能干扰的i,l,o,z
  8 _upper_cases = _letter_cases.upper()  # 大写字母
  9 _numbers = ‘‘.join(map(str, range(3, 10)))  # 数字
 10 init_chars = ‘‘.join((_letter_cases, _upper_cases, _numbers))
 11
 12
 13 def create_validate_code(size=(120, 30),
 14                          chars=init_chars,
 15                          img_type="GIF",
 16                          mode="RGB",
 17                          bg_color=(255, 255, 255),
 18                          fg_color=(0, 0, 255),
 19                          font_size=18,
 20                          font_type="Monaco.ttf",
 21                          length=4,
 22                          draw_lines=True,
 23                          n_line=(1, 2),
 24                          draw_points=True,
 25                          point_chance=2):
 26     """
 27     @todo: 生成验证码图片
 28     @param size: 图片的大小,格式(宽,高),默认为(120, 30)
 29     @param chars: 允许的字符集合,格式字符串
 30     @param img_type: 图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG
 31     @param mode: 图片模式,默认为RGB
 32     @param bg_color: 背景颜色,默认为白色
 33     @param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
 34     @param font_size: 验证码字体大小
 35     @param font_type: 验证码字体,默认为 ae_AlArabiya.ttf
 36     @param length: 验证码字符个数
 37     @param draw_lines: 是否划干扰线
 38     @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
 39     @param draw_points: 是否画干扰点
 40     @param point_chance: 干扰点出现的概率,大小范围[0, 100]
 41     @return: [0]: PIL Image实例
 42     @return: [1]: 验证码图片中的字符串
 43     """
 44
 45     width, height = size  # 宽高
 46     # 创建图形
 47     img = Image.new(mode, size, bg_color)
 48     draw = ImageDraw.Draw(img)  # 创建画笔
 49
 50     def get_chars():
 51         """生成给定长度的字符串,返回列表格式"""
 52         return random.sample(chars, length)
 53
 54     def create_lines():
 55         """绘制干扰线"""
 56         line_num = random.randint(*n_line)  # 干扰线条数
 57
 58         for i in range(line_num):
 59             # 起始点
 60             begin = (random.randint(0, size[0]), random.randint(0, size[1]))
 61             # 结束点
 62             end = (random.randint(0, size[0]), random.randint(0, size[1]))
 63             draw.line([begin, end], fill=(0, 0, 0))
 64
 65     def create_points():
 66         """绘制干扰点"""
 67         chance = min(100, max(0, int(point_chance)))  # 大小限制在[0, 100]
 68
 69         for w in range(width):
 70             for h in range(height):
 71                 tmp = random.randint(0, 100)
 72                 if tmp > 100 - chance:
 73                     draw.point((w, h), fill=(0, 0, 0))
 74
 75     def create_strs():
 76         """绘制验证码字符"""
 77         c_chars = get_chars()
 78         strs = ‘ %s ‘ % ‘ ‘.join(c_chars)  # 每个字符前后以空格隔开
 79
 80         font = ImageFont.truetype(font_type, font_size)
 81         font_width, font_height = font.getsize(strs)
 82
 83         draw.text(((width - font_width) / 3, (height - font_height) / 3),
 84                   strs, font=font, fill=fg_color)
 85
 86         return ‘‘.join(c_chars)
 87
 88     if draw_lines:
 89         create_lines()
 90     if draw_points:
 91         create_points()
 92     strs = create_strs()
 93
 94     # 图形扭曲参数
 95     params = [1 - float(random.randint(1, 2)) / 100,
 96               0,
 97               0,
 98               0,
 99               1 - float(random.randint(1, 10)) / 100,
100               float(random.randint(1, 2)) / 500,
101               0.001,
102               float(random.randint(1, 2)) / 500
103               ]
104     img = img.transform(size, Image.PERSPECTIVE, params)  # 创建扭曲
105
106     img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)  # 滤镜,边界加强(阈值更大)
107
108     return img, strs


				
时间: 2024-08-25 07:21:45

python第一百一十八天---ajax--图片验证码 + Session的相关文章

图片验证码+session

生成随机验证码 #!/usr/bin/env python # -*- coding:utf-8 -*- import random from PIL import Image, ImageDraw, ImageFont, ImageFilter _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z _upper_cases = _letter_cases.upper() # 大写字母 _numbers = ''.

python第一百一十一天 --Django 6

创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 1 import MySQLdb 2 3 def GetList(sql): 4 db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost') 5 cursor = db.cursor() 6 cursor.execute(sql) 7 data = cursor.

python第一百一十天--Django 5

#####################################中间件################################################ settings.py 1 -- MIDDLEWARD=[ 2 '......', 3 '..... ....', 4 '..... ..... .....', 5 6 ] 7 class Row1(MiddlewareMixin): 8 def process_request(self,request): 9 prin

python第一百一十七天-----ModelForm组件

Model + Form => 验证 + 数据库操作 - class LoginModelForm(xxxxx): 利用model.A中的字段 1. 生成HTML标签:class Meta: ... 2. mf = xxxModelForm(instance=ModelObj) 3. 额外的标签, is_rmb = Ffields.CharField(widget=Fwidgets.CheckboxInput()) 4. 各种验证 is_valid() -> 各种钩子... 5. mf.sav

python运维开发(二十一)----文件上传和验证码+session

内容目录: 文件上传 HTML Form表单提交 ajax提交 原生ajax提交 jQuery Ajax提交 验证码+session 文件和图片的上传功能

字符型图片验证码识别完整过程及Python实现

1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻.本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义. 2   关键词 关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL 3   免责声明 本文研究所用素材来自于某旧Web框架的网站 完全对外公开 的公共图片资源. 本文只做了该网站对外公开的公共图片资源进行了爬取, 并未越权 

Python 实现简单图片验证码登录

朋友说公司要在测试环境做接口测试,登录时需要传入正确的图片的验证码,本着懒省事的原则,推荐他把测试环境的图片验证码写死,我们公司也是这么做的^_^.劝说无果/(ㄒoㄒ)/~~,只能通过 OCR 技术来识别图片验证码了,看了一下他们的验证码,长这样,还好挺容易识别(背景色是透明的,有个坑需要处理). Python 实现了图片验证码登录 demo,用到的第三方模块有 requests, PIL, pytesseract. 1 # coding: utf-8 2 import requests 3 f

Python简单的制作图片验证码

-人人可以学Python--这里示范的验证码都是简单的,你也可以把字符扭曲 人人可以学Python.png Python第三方库无比强大,PIL 是python的一个d第三方图片处理模块,我们也可以使用它来生成图片验证码PIL安装命令安装: pip install pillow 下载源码安装:复制地址 :https://github.com/python-pillow/Pillow PIL使用 例子:生成图片,并填充文字 #!/usr/bin/python #-*-coding:utf-8-*-

Python 实现识别弱图片验证码

目前,很多网站为了防止爬虫肆意模拟浏览器登录,采用增加验证码的方式来拦截爬虫.验证码的形式有多种,最常见的就是图片验证码.其他验证码的形式有音频验证码,滑动验证码等.图片验证码越来越高级,识别难度也大幅提高,就算人为输入也经常会输错.本文主要讲解识别弱图片验证码. 1 图片验证码强度 图片验证码主要采用加干扰线.字符粘连.字符扭曲方式来增强识别难度. 加干扰线 加干扰线也分为两种,一种是线条跟字符同等颜色,另一种则线条的颜色是五颜六色. 字符粘连 各个字符之间的间隔比较小,互相依靠,能以分割.