python Josnp(跨域)

python Josnp(跨域)

所谓的跨域就是进行不用域名内的请求,好比如说我在A域名想访问B域名的内容就是一种跨域的行为。

但是在我们浏览器端会有一个同源策略的设置,这个同源策略只对Ajax请求有限制,如果你通过Ajax请求发送数据,在被访问的一端能够接受访问请求并且进行处理后返回给浏览器,但是浏览器不进行接收,所以不能进行跨域请求。

我们机智的人类想到了一个方法可以解决这个同源策略的问题,他们采用的方法是:
    我们知道浏览器会对Ajax请求进行同源策略但是对带有src功能的标签没有进行限制,我们就可以设置通过带有src的标签去访问其他域名的内容

一、JOSNP(自动动态生成标签)

1.JOSNP自动动态生成带有src的标签(html)(通过带有src的标签进行访问)

==============================================通过src进行访问 html=========================================
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#这个是josnp采用的方式   要求客户端和服务端进行约束 自己动态创建标签#}
function getUsers() {
{#定义一个点击函数#}
    var tag =document.createElement(‘script‘);
{#创建一个script标签,name=tag#}
    tag.src=‘http://www.s4.com:8010/users/?callback=bbb‘;
{#通过tag.src设置访问路劲,这个是get请求把数据放在url上#}
{#    tag.src=‘http://www.s4.com:8010/users/?funcname=bbb‘;#}
    document.head.appendChild(tag);
{#在把名字等于tag的标签添加到请求头中#}
}
</script>
</body>
</html>

  

2、JOSNP自动动态生成带有src的标签(views)

from django.shortcuts import render,redirect,HttpResponse
import json
# Create your views here.

def users(request):
    v =request.GET.get(‘callback‘)
    # v =request.GET.get(‘funcname‘)
    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)

二、JOSNP(JQuery)

1、JOSNP 通过JQuery本身的方式访问(html)

====================================通过JQuery访问 html===================================================
<!DOCTYPE html
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#通过JQuery进行跨域请求,只要遵循JQuery标准就能成功访问#}
function getUsers() {
{#定义一个点击函数#}
    $.ajax({
{#通过Ajax 向http://www.s4.com:8010/users/发送请求#}
        url: ‘http://www.s4.com:8010/users/‘,
        type: ‘POST‘,
{#发送方式#}
        dataType: ‘JSONP‘,
{#设置JSONP模式#}
        jsonp: ‘funcname‘,
{#Jsonp的值是funcname#}
        jsonpCallback: ‘bbb‘
{#设置后台的函数名#}
    })

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

</script>
</body>
</html>

2、JOSNP 通过JQuery本身的方式访问(views)

from django.shortcuts import render,redirect,HttpResponse
import json
# Create your views here.

def users(request):
    v =request.GET.get(‘callback‘)
    # v =request.GET.get(‘funcname‘)
    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(一种不需要通过别的方式去访问其他域名的方式)

cors 的原理是访问其他域名的内容,在执行完成后返回给浏览器时,告知浏览器不对Ajax请求进行同源限制

1、cors简单访问(html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="button" value="获取用户列表" onclick="getUsers()">
<ul id="user_list"></ul>
<script src="/static/jquery-3.2.1.js"></script>
<script>
    function getUsers() {
        $.ajax({
            url:‘http://www.s4.com:8010/lsd_users/‘,
            type:‘GET‘,
            success:function (arg) {
                console.log(arg)
            }
        })
    }
</script>
</body>
</html>

2、cors简单的访问(views)

在访问其他域名的内容并执行完成后,返回一个响应头,响应头内有告知浏览器不进行Ajax的同源策略的方法。

from django.shortcuts import render,redirect,HttpResponse
import json
# Create your views here.def lsd_users(request):
    user_list = [
        ‘alex‘, ‘eric‘, ‘egon‘
    ]
    print(‘请求来了!‘)
    user_list_str=json.dumps(user_list)
    obj=HttpResponse(user_list_str)
    obj[‘Access-Control-Allow-Origin‘]="http://www.s5.com:8100"
    #  反会给浏览器已给响应头,告诉浏览器这个API不执行同源策略
    return obj

3、cors复杂的访问(html)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <input type="button" value="获取用户列表" onclick="getUsers()">
<ul id="user_list"></ul>
<script src="/static/jquery-3.2.1.js"></script>
<script>
    function getUsers() {
        $.ajax({
            url:‘http://www.s4.com:8010/new_users/‘,
            type:‘DELETE‘,

            success:function (arg) {
                console.log(arg)
            }
        })
    }
</script>
</body>
</html>

4、cors复杂的访问(views)

复杂的访问请求要先进行一个预检,看下什么样的请求方式和请求域名可以进行访问,返回给浏览器浏览器在判断是不是和预检的需求一致,如果一致就可以访问,再次返回给浏览器时设置响应头,响应头内有告知浏览器不进行Ajax的同源策略的方法。

from django.shortcuts import render,redirect,HttpResponse
import json
# Create your views here
def new_users(request):
    print(request.method)
    # 打印请求方式
    user_list = [
        ‘alex‘, ‘eric‘, ‘egon‘
    ]
    if request.method==‘OPTIONS‘:
        # 判断请方式是不是一种options请求
        print(‘预检....‘)
        obj=HttpResponse()
        obj[‘Access-Control-Allow-Origin‘]=‘*‘
        # 所有域名的都可以进行访问
        obj[‘Access-Control-Allow-Methods‘]=‘DELETE‘
        # 返回请求的方式,并告知浏览器不进行同源策略
        return obj
    obj = HttpResponse(‘asdfasdf‘)
    # 再次请求来的时候返回内容
    obj[‘Access-Control-Allow-Origin‘] = "*"
    # 允许所有的域名进行访问
    return obj
时间: 2024-10-13 14:12:25

python Josnp(跨域)的相关文章

python Django 跨域解决方案

django解决跨域请求的问题 解决方案 1.安装django-cors-headers pip install django-cors-headers 内容详见:https://github.com/ottoyiu/django-cors-headers 其他解决方 1.使用JSONP 使用Ajax获取json数据时,使用JSONP,JSONP只能用于GET请求,红色部分是注意事项 $.ajax({ url:'http://localhost:8000/hello/', data:data,

【Python】Bottle框架下Python Web开发的跨域访问

上一篇文章中介绍了Python应用Bottle轻量级框架进行Web开发,这次介绍Bottle框架下的跨域访问的问题. 当前台跨域访问时,会无法从后台得到数据,也就是说跨域访问失败. 解决办法如下: 在程序中定义一个函数代码如下: #!/usr/bin/python # -*- conding:utf-8 -*- from bottle import * #decorator def allow_cross_domain(fn): def _enable_cors(*args, **kwargs)

百万年薪python之路 -- 请求跨域和CORS协议详解

楔子 什么是同源策略 同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.当一个浏览器的两个tab页中分别来自127.0.0.1:8000和127.0.0.1:8001的页面,当浏览器的127.0.0.1:8000的tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和127.0.0.1:8000同源的脚本才会被执行.如果非同源,那么在请求数据时,浏览器会在控制台中报一

JSonP跨域请求

我们在通过自己的页面或程序通过ajax请求其它网站或服务时,会存在一个ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面.动态网页.web服务.WCF,只要是跨域请求,一律不准.不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>.<img>.<iframe>).   于是可以判断,当前阶段如果想通过纯web端(ActiveX控件.服

同源策略和跨域问题

1 同源策略 所谓同源策略,指的是浏览器对不同源的脚本或者文本的访问方式进行的限制.比如源a的js不能读取或设置引入的源b的元素属性. 那么先定义下什么是同源,所谓同源,就是指两个页面具有相同的协议,主机(也常说域名),端口,三个要素缺一不可. 可以看下面的几个示例来更加清楚的了解一下同源的概念: URL1 URL2 说明 是否允许通信 http://www.foo.com/js/a.js http://www.foo.com/js/b.js 协议.域名.端口都相同 允许 http://www.

同源策略和跨域-总结

目录: 1.同源策略 2.跨域 3.几种跨域技术 1.同源策略 什么叫同源? URL由协议.域名.端口和路径组成,如果两个URL的协议.域名和端口相同,则表示他们同源.相反,只要协议,域名,端口有任何一个的不同,就被当作是跨域. e.g. 对于http://store.company.com/dir/page.html进行同源检测: URL 结果 原因 http://store.company.com/dir2/other.html 成功 仅路径不同 http://store.company.c

AJAX请求和跨域请求详解(原生JS、Jquery)

一.概述 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = 异步 JavaScript 和 XML,是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新.传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面. 本博客实验环境: python:2.7.11 web框架:tonado jquery:2.1.1 二.“伪”AJAX 由于

flask 跨域问题

在Flask开发RESTful后端时,前端请求会遇到跨域的问题.下面是解决方法.Python版本:3.5.1 下载flask_cors包 pip install flask-cors使用flask_cors的CORS,代码示例 from flask_cors import * app = Flask(__name__)CORS(app, supports_credentials=True) 如果还有其他问题可以查看flask_cors的文档.

html 跨域问题-引用别人

http://www.jb51.net/article/43248.htm Json和Jsonp理论实例代码详解 JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方跨域数据交互协议,本文从理论到实践详细的讲解了JSON和JSONP的使用 什么是Json?JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December 199