AJAX和JSON學習筆記
1.關係對映 - 多對多
物件名 = db.Table(
'關聯表名',
db.Column('id',db.Integer,primary_key=True),
db.Column('外來鍵列名',db.TYPE,db.ForeignKey('主表.主鍵')),
db.Column('外來鍵列名',db.TYPE,db.ForeignKey('主表.主鍵'))
)
關聯屬性以及反向引用關係: 在任意一個實體中: 關聯屬性名=db.relationship( '關聯的實體類', secondary='關聯的第三張表名', lazy='dynamic', backref=db.backref( '反向引用屬性名', lazy='dynamic' ) )
2.cookies
1.儲存cookie到客戶端
響應物件.set_cookie(key,value,max_age)
2.獲取cookie的值
request.cookies
包含了當前站點對應的所有的cookies的值
request.cookies['key'] request.cookies.get('key') 判斷資料是否在cookies中: if key in request.cookies: 資料在cookies中 else: 資料不在cookies中 3.刪除cookie的值 響應物件.delete_cookie()
3.session
1.session在Flask中的實現
1.配置 SECRET_KEY
app.config['SECRET_KEY'] = 'xieshadouxing'
2.使用session
from flask import session
1.向session中儲存資料 session['key'] = value; 2.從session中獲取資料 value = session['key'] 3.從session中刪除資料 del session['key']
=======================================================
AJAX - 阿賈克斯
1.什麼是AJAX
Asynchronous Javascript And Xml
Asynchronous : 非同步的
同步訪問:
當客戶端向伺服器傳送請求時,伺服器在處理過程中,瀏覽器只能等待,效率偏低
非同步訪問:
當客戶端向伺服器傳送請求時,伺服器在處理過程中,客戶端可以做其他的操作,不需要一直等待,效率偏高
Xml:eXtensible Markup Language
可擴充套件的 標籤 語言
AJAX優點:
1.非同步 訪問
2.區域性 重新整理
AJAX的使用場合:
1.搜尋建議
2.表單驗證
3.前後端完全分離
2.AJAX的核心物件-非同步物件(XMLHttpRequest)
1.什麼是XMLHttpRequest
簡稱為"xhr"
稱為"非同步物件",代替瀏覽器向伺服器傳送請求並接收響應
xhr 是由JS來提供
2.建立非同步物件(xhr)
主流的非同步物件是 XMLHttpRequest 型別的,並且主流瀏覽器都支援(IE7+,Chrome,Firefox,Safari,Opera)全部支援。但在IE低版本瀏覽器中(IE6以及以下),就不支援XMLHttpRequest,需要使用 ActiveXObject() 來建立非同步物件
支援 XMLHttpRequest :
new XMLHttpRequest()
不支援 XMLHttpRequest :
new ActiveXObject("Microsoft.XMLHTTP")
練習:
1.建立Flask專案 - Ajax01
2.建立訪問路徑 /01-xhr,並去往 01-xhr.html 模板
3.在模板中
建立一個按鈕,單擊時,通過一個 js方法,根據瀏覽器建立 xhr 物件並返回
3.xhr的成員
1.方法 - open()
作用:建立請求
語法:open(method,url,async)
method : 請求方法,取值為'get'或'post'
url : 請求地址,字串
async : 是否採用非同步的方式傳送請求
true : 使用非同步方式傳送請求
false : 使用同步方式傳送請求
ex:
xhr.open('get','/server',true)
2.屬性 - readyState
作用:請求狀態,通過不同的請求狀態值來表示xhr與伺服器的互動情況
由0-4共5個值來表示5個不同的狀態
0 : 請求尚未初始化
1 : xhr已經與伺服器建立連線
2 : 伺服器端已經開始接收請求
3 : 請求正在處理中
4 : 響應已完成
3.屬性 - status
作用:表示伺服器端的響應狀態碼
200:表示伺服器正確處理所有的請求以及給出響應
404:請求資源不存在
500:伺服器內部錯誤
4.屬性 - responseText
作用:伺服器端的響應資料
5.事件 - onreadystatechange
作用:每當xhr的readyState屬性值發生改變的時候要觸發的操作 - 回撥函式
在該函式中,只有當readyState的值為4並且status的值為200的時候,就可以正常的接收 responseText 了
6.方法 - send()
作用:通知xhr向伺服器端傳送請求
語法:send(body)
body : 表示請求的主體
get請求:是沒有請求主體的,所以body的值為null
xhr.send(null)
post請求:是有請求主體的,所以body的位置處要表示請求資料
xhr.send("請求資料")
xhr.send("引數=值&引數=值")
4.AJAX的操作步驟
1.GET請求
1.建立 xhr 物件
2.建立請求 - open()
3.設定回撥函式 - onreadystatechange
判斷狀態並且接收資料
4.傳送請求 - send()
2.GET 請求傳遞引數
//1.獲取 xhr
//2.建立請求
xhr.open('get','/02-server?name=value&name=value',true)
//3.設定回撥函式
//4.傳送請求
伺服器端:
使用 request.args.get('name')接收請求引數
3.POST請求
1.請求提交的資料要作為 send() 的引數進行提交
xhr.send("引數=值&引數=值");
2. 修改請求訊息頭
在AJAX中,提交POST請求時,AJAX預設將Content-Type請求訊息頭的值修改為 "text/plain" 了,所以導致資料無法正常提交
解決方案:將Content-Type的請求訊息頭再修改回"application/x-www-form-urlencoded"即可
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
練習:
1.建立資料庫 - ajax
2.建立實體類 - Users ,對映成表
id - 主鍵,自增
loginname - 登入名稱
loginpwd - 登入密碼
uname - 使用者名稱稱
3.使用ajax驗證登入名稱是否存在
xxx
request.args.get()
AJAX:
1.AJAX核心物件 - XMLHttpRequest
function getXhr(){
if(window.XMLHttpRequest)
return new XMLHttpRequest();
else
return new ActiveXObject("Microsoft.XMLHTTP");
}
2.xhr的成員
1.方法 - open()
目的:建立請求
語法:open(method,url,async)
2.屬性 - readyState
目的:表示xhr與伺服器之間的互動狀態
取值:0-4
4:響應完成
3.屬性 - status
目的:表示伺服器自身的響應狀態碼
取值:標準的HTTP響應碼
200:伺服器正常響應所有內容
4.屬性 - responseText
目的:響應內容
5.事件 - onreadystatechange
目的:監控xhr的請求狀態
取值:函式
只有當readyState的值為4並且status的值為200的時候才正常的接收資料
6.方法 - send()
目的:傳送請求
語法:send(body)
get : send(null)
post : send("name=value&name=value")
7.方法 - setRequestHeader()
目的:設定請求訊息頭
語法:setRequestHeader(name,value)
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
3.AJAX操作步驟
1.GET請求
1.建立/獲取 xhr
2.建立請求
3.設定回撥函式
4.傳送請求
注意:如果有請求提交資料的話需要在 url 的後面拼查詢字串
2.POST請求
1.建立/獲取 xhr
2.建立請求
3.設定回撥函式
4.設定 Content-Type 的請求訊息頭
5.傳送請求
注意:如果有請求提交資料的話需要在 send() 中傳遞資料
1.JSON
1.JS 物件
語法:
1.通過一對 {} 表示一個物件
2.在 {} 中允許通過 key:value 的形式來表示屬性
3.多對的屬性和值之間使用 , 隔開
var obj = {
name:'MrWang',
age:37,
gender:'Unknown'
}
2.什麼是JSON
JavaScript Object Notation
表現形式
按照JS物件的格式所構建出來的字串就是JSON串
在ajax中,允許將複雜格式的響應資料(如列表等)構建成JSON格式的字串再進行響應輸出
3.JSON的表現
1.JSON表示單個物件
1.使用 {} 表示單個物件
2.在{}中使用key:value的格式表示資料
3.多對屬性和值之間使用 , 隔開
4.key必須使用""引起來
5.value如果是字串的話,也需要用""引起來
ex:
var obj = {
"name":"MrWang",
"age":37,
"gender":"Unknown"
}
var str = '{"name":"MrWang","age":37,"gender":"Unknown"}';
2.JSON表示多個物件
1.使用[](陣列)來表示多個物件
2.陣列中允許包含多個JSON物件 或 字串
1.使用JSON陣列來表示若干字串
var arr = ["王老師","王夫人","王小超"];
var str = '["王老師","王夫人","王小超"]';
2.使用JSON陣列來表示若干物件
var arr = [
{
"name":"王老師",
"age":37,
"gender":"男"
},
{
"name":"王夫人",
"age":15,
"gender":"男"
}
];
var str = '[
{
"name":"王老師",
"age":37,
"gender":"男"
},
{
"name":"王夫人",
"age":15,
"gender":"男"
}
]';
4.使用jq的each()迭代陣列
1. $.each();
語法:
$.each(arr,function(index,obj){
//index : 遍歷出來的元素的下標
//obj : 表示遍歷出來的元素
});
2. $obj.each();
語法:
$obj.each(function(index,obj){
//index : 遍歷出來的元素的下標
//obj : 表示遍歷出來的元素
});
該函式用於迴圈遍歷 $obj 元素
2.後臺處理JSON
在後臺查詢資料時,需要先將資料轉換為JSON格式的字串,再響應給客戶端。到了前端後再將字串轉換為JS物件再進行解析。
1.步驟
1.後臺先獲取資料
資料型別為:
1.元組
2.列表
3.字典
2.在後臺將資料轉換為符合JSON格式的字串
3.在後臺將JSON格式字串進行響應
4.在前端將JSON格式的字串解析成JS物件
2.Python中的JSON處理
使用 Python 中的 json 類可以完成轉換
import json
jsonStr = json.dumps(元組|列表|字典)
return jsonStr
3.前端中的JSON處理
通過以下方式,將JSON的串轉換為JS物件或陣列
在JS中:js物件/陣列 = JSON.parse(JSON串)
JSON:JavaScript Object Notation
1.語法
1.使用{}括起來
2.使用key:value來描述屬性(資料)
3.key必須使用""引起來
4.value如果是字串的話也必須使用""引起來
5.多個key:value之間使用 , 隔開
2.後端處理
1.允許轉換成JSON的型別
1.字典
2.列表
3.元組
在實體類中,編寫一個方法將實體物件轉換成字典,以便於方便的轉換成JSON
class Users(db.Model):
... ...
def to_dict(self):
dic = {
loginname:self.loginname
}
return dic
2.將元素裝換為JSON字串
import json
jsonStr=json.dumps(dic/tup/list)
3.前端處理
將後端得到的JSON字串轉換成JS物件,再解析
JSON.parse(str)
4.使用JQ的each函式進行陣列的迭代
1.$.each(arr,function(i,obj){})
2.$arr.each(function(i,obj){});
=======================================================
1.JQUERY AJAX
1.$obj.load(url,data,callback);
作用:非同步載入資料到$obj元素中
引數:
1.url:非同步請求的地址
2.data:傳遞給伺服器端的引數(可選),該資料將決定請求方法是什麼。
1.可以傳遞普通的字串
"name=MrWang&age=30"
2.可以是JSON物件
{
"name":"MrWang",
"age":30
}
3.callback:非同步請求成功後的回撥函式(可選)
取值為 匿名函式
function(resText,statusText){
resText : 響應資料
statusText : 響應的狀態文字
}
JSON:JavaScript Object Notation
1.語法
1.使用{}括起來
2.使用key:value來描述屬性(資料)
3.key必須使用""引起來
4.value如果是字串的話也必須使用""引起來
5.多個key:value之間使用 , 隔開
2.後端處理
1.允許轉換成JSON的型別
1.字典
2.列表
3.元組
在實體類中,編寫一個方法將實體物件轉換成字典,以便於方便的轉換成JSON
class Users(db.Model):
... ...
def to_dict(self):
dic = {
loginname:self.loginname
}
return dic
2.將元素裝換為JSON字串
import json
jsonStr=json.dumps(dic/tup/list)
3.前端處理
將後端得到的JSON字串轉換成JS物件,再解析
JSON.parse(str)
4.使用JQ的each函式進行陣列的迭代
1.$.each(arr,function(i,obj){})
2.$arr.each(function(i,obj){});
=======================================================
1.JQUERY AJAX
1.$obj.load(url,data,callback);
作用:非同步載入資料到$obj元素中
引數:
1.url:非同步請求的地址
2.data:傳遞給伺服器端的引數(可選),該資料將決定請求方法是什麼。
1.可以傳遞普通的字串
"name=MrWang&age=30"
2.可以是JSON物件
{
"name":"MrWang",
"age":30
}
3.callback:非同步請求成功後的回撥函式(可選)
取值為 匿名函式
function(resText,statusText){
resText : 響應資料
statusText : 響應的狀態文字
}
2.$.get()
1.語法:
$.get(url,data,callback,type)
2.引數詳解
1.url:非同步請求地址
2.data:非同步請求的引數
1.字串 :name=value&name=value
2.JSON :{"name":"value","name":"value"}
3.callback:請求成功時的回撥函式
function(resText){
resText:表示就是響應成功後的響應資料
}
4.type:響應回來的資料的型別
1.html :響應回來的資料是html文字
2.text :響應回來的資料是text文字
3.json :響應回來的資料是JSON物件
4.script :響應回來的資料是js指令碼程式碼
注意:如果此處指定了型別的話,那麼在callback中,就無需再做型別的轉換
3.$.post()
4.$.ajax()
作用:自定所有的ajax行為
語法:$.ajax({ajax設定的引數資料物件});
引數們:
1.url : 字串,表示非同步請求的地址
2.type : 字串,請求方式 (get,post)
3.data : 傳遞到伺服器端的引數
1.字串 :"name=value&name=value"
2.JSON物件 :{"name":"value"}
4.dataType :字串,響應回來的資料的格式
1.html
2.xml
3.text
4.script
5.json
6.jsonp :有關跨域的響應格式
5.success : 回撥函式,請求和響應成功時的回撥函式
function(data){
data : 表示伺服器端響應回來的資料
}
============================================
6.error : 回撥函式,請求或響應失敗時的回撥函式
7.beforeSend : 回撥函式,在傳送ajax請求之前的回撥函式,如果return false的話則表示終止本次請求
2.跨域 - Cross Domain
1.什麼是跨域
HTTP協議中 - 同源策略
同源:多個地址中,相同協議,相同域名,相同埠被視為“同源”
在HTTP中,必須是同源地址才能相互發送請求,非同源地址被拒絕的( 和 )
http://www.tedu.cn/a.html
http://www.tedu.cn/b.html
以上地址是 "同源"
http://www.tedu.cn/a.html
https://www.tedu.cn/b
由於協議不同,以上兩個地址"非同源"
http://localhost:5000/a.html
http://127.0.0.1:5000/b
http://192.168.121.35/c
由於域名不同,以上三個地址"非同源"
跨域:非同源的網頁,在相互發送請求時需要跨域
2.解決方案
通過 <script> 向伺服器傳送請求