python-跨域问题

跨域:因为浏览器的同源策略,在你请求返回的时候会进行拦截
        jsonp   只能发 get 请求
        cors    可以发任何请求  ,在响应时加个响应头就行
        同源策略对ajax阻拦
        同源策略对src或href属性的不阻拦
    
    
        ajax的本质:
            xhr = new XMLHttpRequest();
            xhr.open...
            xhr.send(...)
        
       解决方案:
            - JSONP   :原理 面试必问
                点击按钮:
                    动态添加一个
                        <script src='http://www.baidu.com/users/'></script>
                        <script>
                            function func(arg){
                                alert(arg)
                            }
                        </script>
                    获取数据之后要删除 script标签
                        <script src='http://www.baidu.com/users/'></script>
                
                
                                        
            - CORS
                
                - 加响应头
    
                简单与复杂请求的区分:http://www.cnblogs.com/wupeiqi/p/5703697.html
            
                a. 简单请求
                    
                    A网站:
                        <input type="button" value="获取用户数据" onclick="getUsers()">

                        <script src="jquery-1.12.4.min.js"></script>
                        <script>
                            function getUsers() {
                                $.ajax({
                                    url: 'http://127.0.0.1:8000/users/',
                                    type:'GET',
                                    success:function (ret) {
                                        console.log(ret)
                                    }
                                })
                            }
                        </script>
                    
                    服务商:
                        class UsersView(views.APIView):
                            def get(self,request,*args,**kwargs):

                                ret = {
                                    'code':1000,
                                    'data':'老男孩'
                                }
                                response = JsonResponse(ret)
                                response['Access-Control-Allow-Origin'] = "*"
                                return response
            
                b. 复杂请求(性能上的损耗,options预检,真实的请求,所以要尽量避免发送复杂的请求)
                    A网站:
                        <input type="button" value="获取用户数据" onclick="getUsers()">

                        <script src="jquery-1.12.4.min.js"></script>
                        <script>
                            function getUsers() {
                                $.ajax({
                                    url: 'http://127.0.0.1:8000/users/',
                                    type:'POST',
                                    data: {'k1':'v1'},
                                    headers:{
                                        'h1':'asdfasdfasdf'
                                    },
                                    success:function (ret) {
                                        console.log(ret)
                                    }
                                })
                            }
                        </script>
                    
                    服务商:
                                        
                        class UsersView(views.APIView):
                            def get(self,request,*args,**kwargs):

                                ret = {
                                    'code':1000,
                                    'data':'老男孩'
                                }
                                response = JsonResponse(ret)
                                response['Access-Control-Allow-Origin'] = "*"
                                return response

                            def post(self,request,*args,**kwargs):
                                print(request.POST)
                                ret = {
                                    'code':1000,
                                    'data':'老男孩'
                                }
                                response = JsonResponse(ret)
                                response['Access-Control-Allow-Origin'] = "*"
                                return response

                            def options(self, request, *args, **kwargs):
                                # self.set_header('Access-Control-Allow-Origin', "http://www.xxx.com")
                                # self.set_header('Access-Control-Allow-Headers', "k1,k2")
                                # self.set_header('Access-Control-Allow-Methods', "PUT,DELETE")
                                # self.set_header('Access-Control-Max-Age', 10)

                                response = HttpResponse()
                                response['Access-Control-Allow-Origin'] = '*'        #允许的跨域名
                                response['Access-Control-Allow-Headers'] = 'h1'      #允许的请求头
                                # response['Access-Control-Allow-Methods'] = 'PUT'   #允许的请求方法
                                return response

 

posted @ 2018-02-28 19:11  Cool·  阅读(6731)  评论(0编辑  收藏  举报