1. 程式人生 > >python第一百一十八天---ajax--圖片驗證碼 + Session

python第一百一十八天---ajax--圖片驗證碼 + Session

console lte 狀態 狀態碼 創建 ins .py 上層 成功

原生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 終止請求
View Code
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...
View Code
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>
View Code



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                             });
View Code

基於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>
View Code

圖片驗證碼 + 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
View Code





python第一百一十八天---ajax--圖片驗證碼 + Session