Python中如何实现详细的跨域资源共享(CORS)处理?
- 内容介绍
- 文章标签
- 相关推荐
本文共计834个文字,预计阅读时间需要4分钟。
由于浏览器的同源策略限制,非同源的脚本不能直接操作其他源下面的资源。若想操作另一个源下的资源,就属于跨域了,这里的跨域是指广义的跨域,我们常说的请求跨域,其实是狭义的跨域,只是广义跨域中的一种。
因为浏览器的同源策略限制,不是同源的脚本不能操作其他源下面的资源,想操作另一个源下面的资源就属于跨域了,这里说的跨域是广义跨域,我们常说的代码中请求跨域,是狭义的跨域,即在脚本代码中向非同源域发送test.com/getRemoteDate?callback=HandleRemote" var script = document.createElement("script"); script.setAttribute("src", url) document.getElementByTagName("head")[0].appendChild(script);
最后将上面的代码封装成通用的ajax形式:
url = "test.com/getRemoteDate/"; $.ajax({ url:url, type:"GET", dataType:"JSONP", jsonp:"callback", #将会作为参数传给服务器,用于获得回调函数的参数名 jsonCallback:"test", # 自定义的jsonp的回调函数参数名,默认为jQuery自动生成的函数名,也可以自定义,jQuery会自动为你处理的。 success:function(data){ 此处data即为返回的json数据了,前端根据需要自行处理 } });
服务端代码 :
def getData(): return {"title":"哈哈", "name":"这又是一个测试数据哦!"} def getRemote(request): funcName = request.GET.get("callback") result = getData() # 将结果以json形式返回,与前端的jsonp交互 return funcName+"("+json.dumps(result)+")"
配置url:
url(r"^getRemoteData/$", getRemote)
到这里,jsonp就完成了,虽然jsonp不受同源策略的限制,但是jsonp有个问题,就是它只支持GET请求,其他请求不支持。
2、在响应头加上响应的允许跨域的参数,告诉浏览器当前请求被服务器接受,这种跨域方式也是通用的。
3、python Django中最常用的另一种处理跨域的方式:
使用Django提供的 Django-cors-headers 来处理跨域
从GitHub上面下载Django-cors-headers
pip install Django-cors-headers.zip
在settings.py中的中间件中配置 记得这个中间件一定要写在CSRF之前,为了方便处理,一般写在最前面
设置 CORS_ORIGIN_ALLOW_ALL = True,即允许所有的跨域请求,当然,这里也可以设置为False,然后配合 CORS_ORIGIN_WHITELIST 白名单来使用
如此,我们的跨域处理即完成,支持所有的请求。
补充知识:python WSGI 解决跨域问题
import json from wsgiref.simple_server import make_server # application()函数是Python中符合WSGI标准的一个HTTP处理函数,返回是一个字符串 def application(environ, start_response): # start_response 如下调用就会发送HTTP响应的Header,注意只能调用一次start_response()函数发送Header。 # start_response 函数两个参数,一是HTTP响应码,一是一组list表示的HTTP Header,每个Header用一个包含两个str的数组表示 status = '200 OK' # response_headers 中添加请求头部 ,解决跨域问题 response_headers = [('Content-type', 'application/json'), ('Access-Control-Allow-Origin', '*'), ('Access-Control-Allow-Methods', 'POST'), ('Access-Control-Allow-Headers', 'x-requested-with,content-type'), ] # json start_response(status, response_headers) result = {'code': 200, 'message': "You get the flag"} return [result.encode()] if __name__ == "__main__": port = 8091 httpd = make_server("127.0.0.1", port, application) print("serving http on port {0}...".format(str(port))) httpd.serve_forever()
以上这篇关于python 跨域处理方式详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。
本文共计834个文字,预计阅读时间需要4分钟。
由于浏览器的同源策略限制,非同源的脚本不能直接操作其他源下面的资源。若想操作另一个源下的资源,就属于跨域了,这里的跨域是指广义的跨域,我们常说的请求跨域,其实是狭义的跨域,只是广义跨域中的一种。
因为浏览器的同源策略限制,不是同源的脚本不能操作其他源下面的资源,想操作另一个源下面的资源就属于跨域了,这里说的跨域是广义跨域,我们常说的代码中请求跨域,是狭义的跨域,即在脚本代码中向非同源域发送test.com/getRemoteDate?callback=HandleRemote" var script = document.createElement("script"); script.setAttribute("src", url) document.getElementByTagName("head")[0].appendChild(script);
最后将上面的代码封装成通用的ajax形式:
url = "test.com/getRemoteDate/"; $.ajax({ url:url, type:"GET", dataType:"JSONP", jsonp:"callback", #将会作为参数传给服务器,用于获得回调函数的参数名 jsonCallback:"test", # 自定义的jsonp的回调函数参数名,默认为jQuery自动生成的函数名,也可以自定义,jQuery会自动为你处理的。 success:function(data){ 此处data即为返回的json数据了,前端根据需要自行处理 } });
服务端代码 :
def getData(): return {"title":"哈哈", "name":"这又是一个测试数据哦!"} def getRemote(request): funcName = request.GET.get("callback") result = getData() # 将结果以json形式返回,与前端的jsonp交互 return funcName+"("+json.dumps(result)+")"
配置url:
url(r"^getRemoteData/$", getRemote)
到这里,jsonp就完成了,虽然jsonp不受同源策略的限制,但是jsonp有个问题,就是它只支持GET请求,其他请求不支持。
2、在响应头加上响应的允许跨域的参数,告诉浏览器当前请求被服务器接受,这种跨域方式也是通用的。
3、python Django中最常用的另一种处理跨域的方式:
使用Django提供的 Django-cors-headers 来处理跨域
从GitHub上面下载Django-cors-headers
pip install Django-cors-headers.zip
在settings.py中的中间件中配置 记得这个中间件一定要写在CSRF之前,为了方便处理,一般写在最前面
设置 CORS_ORIGIN_ALLOW_ALL = True,即允许所有的跨域请求,当然,这里也可以设置为False,然后配合 CORS_ORIGIN_WHITELIST 白名单来使用
如此,我们的跨域处理即完成,支持所有的请求。
补充知识:python WSGI 解决跨域问题
import json from wsgiref.simple_server import make_server # application()函数是Python中符合WSGI标准的一个HTTP处理函数,返回是一个字符串 def application(environ, start_response): # start_response 如下调用就会发送HTTP响应的Header,注意只能调用一次start_response()函数发送Header。 # start_response 函数两个参数,一是HTTP响应码,一是一组list表示的HTTP Header,每个Header用一个包含两个str的数组表示 status = '200 OK' # response_headers 中添加请求头部 ,解决跨域问题 response_headers = [('Content-type', 'application/json'), ('Access-Control-Allow-Origin', '*'), ('Access-Control-Allow-Methods', 'POST'), ('Access-Control-Allow-Headers', 'x-requested-with,content-type'), ] # json start_response(status, response_headers) result = {'code': 200, 'message': "You get the flag"} return [result.encode()] if __name__ == "__main__": port = 8091 httpd = make_server("127.0.0.1", port, application) print("serving http on port {0}...".format(str(port))) httpd.serve_forever()
以上这篇关于python 跨域处理方式详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。

