複習第二天
1. 為什麼會有跨域?
瀏覽器具有同源策略所有才出現跨域。
同源策略:
- 開放:src
- 禁止:ajax
解決跨域:
- jsonp,在客戶端動態建立一個script標籤
1.客戶端:建立一個
<script src='http://www.jxntv.cn/data/jmd-jxtv2.html'></script>
<script>
function func(arg){
alert(arg);
}
</script>
2.服務端:接收到請求並處理並返回值 "func('success')"
相當於:
<script>
func('success')
</script>
PS: jsonp只能傳送GET請求
- cors,設定響應響應響應響應響應頭
- 簡單請求
- 複雜請求
- options請求做預檢
- PUT/POST....
在django中解決方案:
- 中介軟體中設定響應頭
- django中的一個第三方元件:cors
補充:
jQuery Ajax:
$.ajax({
...
})
原生Ajax:XMLHttpRequest物件:
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
// 已經接收到全部響應資料,執行以下操作
var data = xhr.responseText;
console.log(data);
}
};
xhr.open('POST', "/test/", true);
// 設定請求頭
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
// 傳送請求
xhr.send('n1=1;n2=2;');
2. 你理解的http協議?
瀏覽器和吳福氣之間約定好的訊息格式(以\r\n分割)
3. 常見請求頭
- Content-Type , 媒體型別資訊
- User-Agent, 使用者資訊
- referer,可以做圖片防盜鏈。
- Host, 域名和埠號
- cookies
4. 常見的請求方法:
- GET/POST/DELETE/PUT/PATCH/OPTIONS
5. 常見的狀態碼:
- 200, 請求成功
- 301/302 永久/臨時重定向
- 403/404, 伺服器拒絕請求/請求不存在
- 500, 內部伺服器出錯
6. 序列化
class BookSerializers(serializers.ModelSerializer):
class Meta:
model = models.Book
# fields = "__all__"
fields=['nid','title','authors','publish']
# exclude=('nid',) #不能跟fields同時用
# depth = 1 #深度控制,寫 幾 往裡拿幾層,層數越多,響應越慢,官方建議0--10之間,個人建議最多3層
publish=serializers.SerializerMethodField()
def get_publish(self,obj):
return obj.publish.name
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
ret=obj.authors.all()
ss=AuthorSerializer(ret,many=True)
return ss.data
7. ORM補充:
a. 需求: 只取某n列
queryset=[ {},{}]
models.User.objects.all().values( 'id','name')
queryset=[ (),()]
models.User.objects.all().values_list( 'id','name')
queryset=[ obj,obj]
result = models.User.objects.all().only('id','name','age')
# result = models.User.objects.all().defer('id','name','age')
for item in reuslt:
print(item.id,item.name,item.age)
b. 需求: 列印所有使用者姓名以及部門名稱
class depart:
title = ....
class User:
name = ...
dp = FK(depart)
# select * from user
# result = models.User.objects.all()
# for item in result:
# print(item.name)
# select * from user left join depart on user.dp_id = depart.id
# result = models.User.objects.all().selected_related('dp')
# for item in result:
#print(item.name,item.dp.title )