1. 程式人生 > >複習第二天

複習第二天

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 )