python Josnp(跨域)

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

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

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

一、设置本地配置和Django配置文件

1、设置本机的C:\Windows\System32\drivers\etc路径下的域名   

# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host # localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
127.0.0.1 www.s4.com
127.0.0.1 www.s5.com

2、设置Django配置文件的内容

ALLOWED_HOSTS = ['www.s4.com',]

二、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

python Josnp(跨域)的更多相关文章

  1. python - Django 跨域配置

    一:settings 中间件配置路径 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.s ...

  2. python基础-跨域问题

    跨域 -- 浏览器的同源策略 阻止ajax请求 不阻止src请求 -- jsonp -- 我们利用src发送请求 -- core -- class MyCore(MiddlewareMixin): d ...

  3. 关于python的bottle框架跨域请求报错问题的处理

    在用python的bottle框架开发时,前端使用ajax跨域访问时,js代码老是进入不了success,而是进入了error,而返回的状态却是200.url直接在浏览器访问也是正常的,浏览器按F12 ...

  4. 日志服务Python消费组实战(三):实时跨域监测多日志库数据

    解决问题 使用日志服务进行数据处理与传递的过程中,你是否遇到如下监测场景不能很好的解决: 特定数据上传到日志服务中需要检查数据内的异常情况,而没有现成监控工具? 需要检索数据里面的关键字,但数据没有建 ...

  5. python全栈开发day103-python垃圾回收机制、mro和c3算法解析、跨域jsonp\CORS、Content-Type组件

    Python垃圾回收 -- 引用计数 -- Python为每个对象维护一个引用计数 -- 当引用计数为0的 代表这个对象为垃圾 -- 标记清除 -- 解决孤立的循环引用 -- 标记根节点和可达对象 - ...

  6. python 跨域处理方式

    因为浏览器的同源策略限制,不是同源的脚本不能操作其他源下面的资源,想操作另一个源下面的资源就属于跨域了,这里说的跨域是广义跨域,我们常说的代码中请求跨域,是狭义的跨域,即在脚本代码中向非同源域发送ht ...

  7. element-ui + vue + node.js 与 服务器 Python 应用的跨域问题

    跨越问题解决的两种办法: 1. 在 config => index.js 中配置 proxyTable 代理: proxyTable: { '/charts': { target: 'http: ...

  8. Python自动化之跨域访问jsonp

    这里提到了JSONP,那有人就问了,它同JSON有什么区别不同和区别呢,接下我们就来看看,百度百科有以下说明: ''' 1. JSON(JavaScript Object Notation) 是一种轻 ...

  9. python使用web.py开发httpserver,解决post请求跨域问题

    使用web.py做http server开发时,遇到postman能够正常请求到数据,但是浏览器无法请求到数据,查原因之后发现是跨域请求的问题. 跨域请求,就是在浏览器窗口中,和某个服务端通过某个 “ ...

随机推荐

  1. java语言环境jdk的安装和环境变量的配置

    一.jdk的安装 我安装的为64位的1.7.0_17版本的jdk,双击运行,全部默认下一步就行 此处可整改安装目录,然后点击下一步进行安装. 二.环境变量的配置 1.右键点击我的电脑à点击属性,出现如 ...

  2. Angular-Mobile介绍

    陆续更新中 1. 介绍: * Angular-Mobile是使用Angular和Bootstrap3为手机端网页和App提供支持的前端UI框架.

  3. linux常用命令汇总(更新中...)

    文本查看与编辑 1.文本编辑命令 vi/vim 2.查看文件内容命令 命令 说明 命令格式 参数 cat 将一个文件的内容连续输出在屏幕上 cat [-option]  文件名 -n:将行号一起显示在 ...

  4. Javscript的函数链式调用基础篇

    我们都很熟悉jQuery了,只能jQuery中一种非常牛逼的写法叫链式操作: $('#div').css('background','#ccc').removeClass('box').stop(). ...

  5. python3 爬虫开发 学习总结一

    virtualenv 安装虚拟环境的   pip install  virtualenv安装慢的话,可以指定源    pip install  -i  源地址  xxx  就可以安装xxxvirtua ...

  6. 【Django】 rest-framework和RestfulAPI的设计

    [rest-framework] 这是一个基于django才能发挥作用的组件,专门用于构造API的. 说到API,之前在其他项目中我也做过一些小API,不过那些都是玩票性质,结构十分简单而且要求的设计 ...

  7. 网络通信 --> socket通信

    socket通信 socket是应用层与TCP/IP协议族通信的中间软件抽象层,是一组接口.工作原理如下: 具体过程:服务器端先初始化socket,然后与端口绑定(bind),对端口进行监听(list ...

  8. logback常用配置详解及logback简介

    logback 简介(一) Ceki Gülcü在Java日志领域世界知名.他创造了Log4J ,这个最早的Java日志框架即便在JRE内置日志功能的竞争下仍然非常流行.随后他又着手实现SLF4J 这 ...

  9. JAVA关于一些变量的技巧

    如果一个变量的值不变,而且他还要被多次用到 另建一个类,把变量定义到里面   注意  private static      public class JexlConfig {     private ...

  10. GLES2学习VBO和VAO的使用

    在GLES2中使用VBO和VAO对象,已经简单vs,ps绘制一个三角形. 1. 初始化操作代码,创建VBO.VAO,编译和链接shader program. void DebugApplication ...