Django框架基础之跨域

由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性。

特别的:由于同源策略是浏览器的限制,所以请求的发送和响应是可以进行,只不过浏览器不接受罢了。

浏览器同源策略并不是对所有的请求均制约:

制约: XmlHttpRequest

不约束: img、iframe、script等具有src属性的标签

开发需求:向其他网站发http请求
         -- 浏览器直接发送请求(考虑同源)
                         --制造含有src属性的标签,绕过同源策略机制(jsonp)
                         --加响应头,使浏览器允许跨域(core)
         -- 浏览器--服务端---发送请求

JSONP(JSONP - JSON with Padding是JSON的一种“使用模式”),利用script标签的src属性(浏览器允许script标签跨域)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a onclick="show()">发送</a>
<input type="button" value="获取用户列表" onclick="getUsers()">
<head></head>
<script src="/static/jquery-3.2.1.js"></script>
<script>

    function show(){
        var tag=document.createElement(‘script‘);
        tag.src="http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&_=1454376870403";
        document.head.appendChild(tag);
    }

//自己写动态创建script
    function getUsers(){
        var tag=document.createElement(‘script‘);
        tag.src=‘http://www.s4.com:8000/users/?callback=bbb‘;
        document.head.appendChild(tag)

    }
    function bbb(data){
        console.log(data)
    }

    //利用jquery发送jsonp请求
    function getUsers(){
       $.ajax({
           url:‘http://www.s4.com:8000/users/‘,
           type:‘GET‘,
           dataType:‘JSONP‘,
           jsonp:‘callback‘,
           jsonpCallback:‘bbb‘
       })
    }
    function bbb(data){
        console.log(data);
    }
</script>
</body>
</html>
#jsonp 实现跨域请求
def users(request):
    v=request.GET.get(‘callback‘)
    print(‘请求来了‘)
    user_list=[
        ‘alex‘,‘eric‘,‘egon‘
    ]
    user_list_str=json.dumps(user_list)
    temp=‘%s(%s)‘%(v,user_list_str)
    print(temp)
    return HttpResponse(temp)

随着技术的发展,现在的浏览器可以支持主动设置从而允许跨域请求,即:跨域资源共享(CORS,Cross-Origin Resource Sharing),其本质是设置响应头,使得浏览器允许跨域请求。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="button" value="获取用户列表" onclick="getUsers()">
<script src="/static/jquery-3.2.1.js"></script>
<script>

    //cors跨站资源共享--直接发送请求获取资源
    function getUsers(){
        $.ajax({
            url:‘http://www.s4.com:8000/newusers/‘,
            type:‘GET‘,
            success:function (data) {
                console.log(data);
            }
        })
    }
  //core 复杂请求
    function getUsers(){
        $.ajax({
            url:‘http://www.s4.com:8000/core/‘,
            type:‘DELETE‘,
            success:function (data) {
                console.log(data);
            }
        })
    }

</script>
</body>
</html>
#core 添加响应头 实现跨域简单请求
def newusers(request):
    user_list = [
        ‘alex‘, ‘eric‘, ‘egon‘
    ]
    user_list_str = json.dumps(user_list)
    obj = HttpResponse(user_list_str)

    obj[‘Access-Control-Allow-Origin‘] = ‘http://127.0.0.1:8001‘
    return obj
#core 添加响应头 实现跨域复杂请求
def core(request):
    if request.method==‘OPTIONS‘:
        obj=HttpResponse()
        obj[‘Access-Control-Allow-Origin‘]=‘http://127.0.0.1:8001‘
        obj[‘Access-Control-Allow-Methods‘]=‘DELETE‘
        return obj
    obj=HttpResponse(‘jjjjjj‘)
    obj[‘Access-Control-Allow-Origin‘] = ‘http://127.0.0.1:8001‘
    return obj

* 简单请求 OR 非简单请求

条件:
    1、请求方式:HEAD、GET、POST
    2、请求头信息:
        Accept
        Accept-Language
        Content-Language
        Last-Event-ID
        Content-Type 对应的值是以下三个中的任意一个
                                application/x-www-form-urlencoded
                                multipart/form-data
                                text/plain

注意:同时满足以上两个条件时,则是简单请求,否则为复杂请求
* 简单请求和非简单请求的区别?

   简单请求:一次请求
非简单请求:两次请求,在发送数据之前会先发一次请求用于做“预检”,只有“预检”通过后才再发送一次请求用于数据传输。
* 关于“预检”

- 请求方式:OPTIONS
- “预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息
- 如何“预检”
     => 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过
        Access-Control-Request-Method
     => 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
        Access-Control-Request-Headers
时间: 2024-08-01 17:51:55

Django框架基础之跨域的相关文章

Django框架基础(一)

Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 1 安装 1 pip3 install django 2 # 创建Django程序 3 django-admin startproject mysite 4 # 进入程序目录 5 cd mysite 6 # 启动socket服务端,等待用户发送请求 7 python manage.py runse

Django框架基础

Django基础-Lesson1 web框架概念 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统. 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端.  socket模拟服务端 最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回. 如果要动态生成HTML,就需要把上述步骤自己来实现.不过,接受HTTP

Django ContentType 及 corf跨域

ContentType是什么? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Django驱动的model提供了更高层次的抽象接口. ContentTypes能做什么 当使用django-admin初始化一个django项目的时候,可以看到在默认的INSTALL_APPS已经包含了django.contrib.contenttypes: INSTALLED_APPS = [ 'django.contrib.admin', 'django.co

contenttype组件、Django缓存机制以及跨域请求

1 昨日回顾 版本控制 *** (1)url=127.0.0.1/course/?version=v100000 1 versioning_class=QueryParameterVersioning 'VERSION_PARAM':'version', 'DEFAULT_VERSION':'v2', 'ALLOWED_VERSIONS':['v1','v2'] 2 配置成全局:在setting里:QueryParameterVersioning (2)重要(以后建议用这种):127.0.0.1

django + vue.js 解决跨域问题

浏览器跨域报错:"No: Access-Control-Allow-Origin":  解决方案1: 在view视图函数中 给封装好的list_查看这个方法这个函数给父类 clss Oldboy (ModelViewset): queryst =Course.objects.all() serializer_Class =CoureSerializer def list(self,request,*args,**kwargs) response = super().list(reque

django 实现全局支持跨域请求

Django 允许跨域请求 一.django 实现支持跨域请求,本人所了解到的方法有两种: 1.视图中进行配置,只实现当前视图支持跨域请求 2.进行全局配置,实现所有视图均支持跨域请求 这里对第二种方法进行一下说明: 1.安装django-cors-headers pip install django-cors-headers 2.配置settings.py文件 INSTALLED_APPS = [ ... 'corsheaders', ... ] MIDDLEWARE_CLASSES = (

django中配置允许跨域请求

对于django 安装django-cors-headers,详情请看官方文档 pip install django-cors-headers 配置settings.py文件 a.在INSTALLED_APPS里添加"corsheaders" INSTALLED_APPS = [ ... 'corsheaders', ... ] b.在MIDDLEWARE_CLASSES添加 'corsheaders.middleware.CorsMiddleware', 'django.middle

django应用之corsheaders[跨域设置]

安装 pip install django-cors-headers 注册应用 INSTALLED_APPS = ( ... 'corsheaders', ... ) 中间层设置 MIDDLEWARE = [ ... 'corsheaders.middleware.CorsMiddleware', 'django.middleware.common.CommonMiddleware', ... ] 添加白名单 # CORS 设置跨域域名 CORS_ORIGIN_WHITELIST = ( '12

Django前后端分离跨域请求问题

一.问题背景 之前使用django+vue进行前后端分离碰到跨域请求问题,跨域(域名或者端口不同)请求问题的本质是由于浏览器的同源策略导致的,当请求的响应不是处于同一个域名和端口下,浏览器不会接受响应,同源策略也是浏览器针对请求的安全问题所作出的一种保护行为.针对跨域问题,可以有下面的解决方式: JSONP方式 自定义中间件,设置响应头 使用django-cors-headers包 二.解决方式 (一)自定义中间件 JSONP本质上是利用html的一些不受同源策略影响的标签属性src,例如:<a