一:

  from django.views.decorators.csrf import csrf_exempt
# 获取微信返回的code信息
@csrf_exempt
def wechat_auth(req):
if req.method == 'POST':
code = req.POST.get('code')
data_info = get_access_token_info(code)
return JsonResponse({'message': data_info, "status": ''})
return JsonResponse({'message': '扫码失败,请刷新重试!',"status": 0})

  scrf_exempt是用来解决视图可以进行跨域请求。

  1:什么是跨域请求呢?

假如
在http:www.aa:8080/index.html里面的js代码发起了http:api:aa:9999/index_data这个地址的请求。
那么
我们是得不到数据的?
为什么得不到数据呢?
原因:浏览器不要这个数据

理解:跨域不是服务器不给数据,也不是浏览器发现了跨域,不进行了请求。 解决:同源策略是浏览器的策略,和服务器没有关系,不过我们可以通过对服务器的响应头配置,让浏览器接收这次数据(后端解决办法)

例子:

服务器
from flask import Flask
from flask import make_response
from flask import render_template app = Flask(__name__) # 服务器代码
@app.route("/index_data", methods=["GET"])
def test1():
print("服务器接收了这次请求")
response = make_response("hello world")
return response if __name__ == '__main__':
app.run(debug=True,host="0.0.0.0",port=9999) # 端口为9999的服务器
# 后端
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route("/index", methods=["GET"])
def test1():
return render_template("csrf_test.html") if __name__ == '__main__':
app.run(debug=True) # 前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/static/jquery-1.12.4.min.js"></script>
<script>
$(function () {
$("#btn").click(function () { $.ajax({"
url:"http://127.0.0.1:9999/index_data", #从 http:127.0.0.1:5000/index的域向http:127.0.0.1:9999/index_data的域发送请求
type:"get",
success:function (dat) {
console.log(dat)
}
})
})
})
</script>
</head>
<body>
<input type="submit" value="点我试试" id="btn">
</body>
</html> # 前端运行

解决:服务器响应的时候,给请求头加入Acess-Control-Allow-Origin参数:值为:http://127.0.0.1:5000 就可以解决从5000端口向9999端口要数据的情况。

from flask import Flask
from flask import make_response
from flask import render_template app = Flask(__name__) # 服务器代码
@app.route("/index_data", methods=["GET"])
def test1():
print("服务器接收了这次请求")
response = make_response("hello world")
response.headers["Access-Control-Allow-Origin"] = "http://127.0.0.1:5000" # 服务器告诉浏览器,允许5000端口进行数据传输。
return response if __name__ == '__main__':
app.run(debug=True,host="0.0.0.0",port=9999) 5000端口运行的结果


同源策略:同协议、同域名、同端口

结论:服务器通过响应头设置:跨域浏览器的host:port,保证跨域浏览器的能够顺利的拿到服务器的数据。

二:浏览器的请求头中

  更复杂的跨区请求:浏览器还会先发送options请求,然后在发送正常的get请求,因此还要对response.headers中添加更过的字段

  # TODO 后面会进行测试。

三:django中的跨域请求的解决方法

  方法一:普通的视图函数

# 获取微信返回的code信息
@csrf_exempt
def wechat_auth(req):
if req.method == 'POST':
code = req.POST.get('code')
data_info = get_access_token_info(code)
return JsonResponse({'message': data_info, "status": ''})
return JsonResponse({'message': '扫码失败,请刷新重试!',"status": 0})

  方法二:继承视图类的类视图

from django.views.decorators.csrf import csrf_exempt

class MyView(View):

    def get(self, request):
return HttpResponse("hi") def post(self, request):
return HttpResponse("hi") @csrf_exempt
def dispatch(self, *args, **kwargs):
return super(MyView, self).dispatch(*args, **kwargs)

  方法三:在urls.py中设置

from django.conf.urls import url
from django.views.decorators.csrf import csrf_exempt
import views urlpatterns = [
url(r'^myview/$', csrf_exempt(views.MyView.as_view()), name='myview'),
]

django之csrf_exempt解决跨域请求的问题的更多相关文章

  1. Django使用jsonp和cors解决跨域请求问题

    1.使用jsonp的方式解决跨域请求的问题 我启动两个django项目,然后使用的端口不一样,在项目1中通过ajax发请求给项目2,然后接受项目2发送过来的数据 先看项目1的ajax的代码 $(&qu ...

  2. js中ajax如何解决跨域请求

    js中ajax如何解决跨域请求,在讲这个问题之前先解释几个名词 1.跨域请求 所有的浏览器都是同源策略,这个策略能保证页面脚本资源和cookie安全 ,浏览器隔离了来自不同源的请求,防上跨域不安全的操 ...

  3. Ajax 调用webservice 解决跨域请求和发布到服务器后本地调用成功外网失败的问题

        webservice 代码 /// <summary> /// MESService 的摘要说明 /// </summary> [WebService(Namespac ...

  4. XMLHttpRequest.withCredentials 解决跨域请求头无Cookie的问题

    查看原文 XMLHttpRequest.withCredentials  属性是一个Boolean类型,它指示了是否该使用类似cookies,authorization headers(头部授权)或者 ...

  5. 外部调用mvc的api方法时,如何解决跨域请求问题?

    首先,创建一个mvc项目(包含webapi),我们模拟一个场景 1)在项目的Controller 创建一个WeiXinApiController public class WeiXinApiContr ...

  6. 使用SpringMVC的@CrossOrigin注解解决跨域请求问题

    跨域问题,通俗说就是用ajax请求其他站点的接口,浏览器默认是不允许的.同源策略(Same-orgin policy)限制了一个源(orgin)中加载脚本或脚本与来自其他源(orgin)中资源的交互方 ...

  7. JSONP方法解决跨域请求

    Ajax跨域请求的问题 跨域:跨域名, 一个域名下的文件去请求了和他不一样的域名下的资源文件(注意是请求文件,而不是数据接口),那么就会产生跨域请求,下面来写一个ajax来跨域请求的例子 <!D ...

  8. SpringBoot解决跨域请求拦截

    前言 同源策略:判断是否是同源的,主要看这三点,协议,ip,端口. 同源策略就是浏览器出于网站安全性的考虑,限制不同源之间的资源相互访问的一种政策. 比如在域名https://www.baidu.co ...

  9. django解决跨域请求的问题

    跨域请求可以用jsonp来解决,不过今天我发现一个很好用的包:django-cors-headers 只需要简单地配置一下就可 被请求方的setting.py中的配置如下: INSTALLED_APP ...

随机推荐

  1. mui初级入门教程(六)— 模板页面实现原理及多端适配指南

    文章来源:小青年原创发布时间:2016-07-26关键词:mui,webview,template,os,多端适配转载需标注本文原始地址: http://zhaomenghuan.github.io. ...

  2. 快速获取批量处理Docker镜像SQL语句

    .获取批量pull语句 select concat('docker pull develop-harbor.geostar.com.cn/', t.name, ':', t1.tag) name fr ...

  3. ERROR 1366 (HY000): Incorrect string value:MySQL数据库、表的字符集为GBK

    mysql> update userinfo set MEDIASOURCE = 'CS02-北京' where IMPORTNO = 'IMP201640613101206';ERROR 13 ...

  4. linux的find和grep区别?

    为什么会把 grep和find 这两个命令拿在一起来讨论? 是因为他们之间有一个容易混淆的地方, [在我的记忆中] : -name ? 它是find的选项! 不是grep的选项! 实际上, find基 ...

  5. Vue知识整理4:v-html标签

    可以在数据绑定中使用html标签,这样在变量里可以使用html标签输出结果,如下所示:

  6. python 操作openpyxl导出Excel 设置单元格格式以及合并处理

    贴上一个例子,里面设计很多用法,根据将相同日期的某些行合并处理. from openpyxl import Workbook from openpyxl.styles import Font, Fil ...

  7. web 前端2 CSS

    CSS CSS是Cascading Style Sheets的简称,中文称为层叠样式表,用来控制网页数据的表现,可以使网页的表现与数据内容分离. 一 css的四种引入方式 1.行内式          ...

  8. 第七周实验报告&课程总结

    一.完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: (3)卖票过程延时1秒钟: (4)不能出现一票多卖或卖出负数号票的情况. 代码: public cla ...

  9. linux驱动模型——platform(2)

    一. platform 组织架构 1.1. platform工作体系都定义在drivers/base/platform.c中 1.2. platform相关函数声明在include/linux/pla ...

  10. MFC框架各部分指针获取方式

    MFC框架各部分指针获取方式 前人在CSDN总结的,曾经帮助过我,整理总结一下,希望也能帮助一下别人. 获得CWinApp 获得CMainFrame 获得CChildFrame 获得CDocument ...