博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
017---Django的中间件解决跨域
阅读量:5020 次
发布时间:2019-06-12

本文共 2328 字,大约阅读时间需要 7 分钟。

跨域
  • 跨域是什么?
    浏览器从一个域名的网页去请求另一个域名的资源的时候,如果不同源、请求的响应结果就会被浏览器的同源策略所拦截
  • 同源策略是什么?
    同源:协议 + 域名 + 端口
    特点:阻止ajax请求、不阻止src请求
    所以不同源就会被拦截
  • 解决方式
    • JSONP
      • 新建项目CORS
      # urls.pyfrom django.contrib import adminfrom django.urls import pathfrom app01 import viewsurlpatterns = [    path('admin/', admin.site.urls),    path('index/',views.index),    path('service/',views.CORSView.as_view()),]# views.pyfrom django.shortcuts import render, HttpResponsefrom django.views import Viewdef index(request):    return render(request,'index.html')class CORSView(View):    def get(self,request):        return HttpResponse('get--ok')
      • 新建html文件,写js,发送请求
        1392812-20190124152553243-994380355.jpg
      • 单独运行html文件和在走index视图再发生请求,会有两个结果,一个被拦截。一个没拦截。

        1392812-20190124152620072-1536303218.jpg
        1392812-20190124152626314-1305235869.jpg

      • 怎么解决呢?可以根据src请求不拦截的特点。在点击获取服务器数据的按钮的时候生成一个script标签,属性src就是我们要请求的url,可以携带一个回调函数过去。服务器返回数据之后执行回调函数。获取之后再删除script标签。

        1392812-20190124152748294-1452603682.jpg
        1392812-20190124152755922-1086784349.jpg

    • CORS添加响应头
      • 先了解两个概念:简单请求和复杂请求
        • 简单请求:
          1. HTTP方法(之一):HEAD, GET,POST
          2. HTTP头信息(不得超出):Accept, Accept-Language, Content-Language, Last-Event-ID
          3. Content-Type(之一):application/x-www-from-urlencoded multipart/form-data text/plain
        • 复杂请求:
          1. 先发送预检请求 OPTIONS
      • 这个比jsonp简单多了。只要我们后端写个中间件。允许通过的域名和方法即可
      # views.pyfrom django.shortcuts import render, HttpResponsefrom django.views import Viewfrom django.views.decorators.csrf import csrf_exemptfrom django.utils.decorators import method_decoratordef index(request):    return render(request, 'index.html')@method_decorator(csrf_exempt, name='dispatch')class CORSView(View):    def get(self, request):        # func = request.GET.get('callback')        # print(func)        # data = 'get--ok'        # return HttpResponse("%s('%s')" % (func, data))        return HttpResponse('get--ok')    def post(self, request):        return HttpResponse('post--ok')    def put(self, request):        return HttpResponse('put--ok')# app01\middlewares\cors.pyfrom django.utils.deprecation import MiddlewareMixinclass MyCors(MiddlewareMixin):    """    跨域中间件    """    def process_response(self, request, response):        response['Access-Control-Allow-Origin'] = '*'        # 如果是简单请求这样即可,但是我们一般方送json格式的数据,还有可能会有其他method,所有还要进一步判断        if request.method == 'OPTIONS':            # 复杂请求会先发预检            response["Access-Control-Allow-Headers"] = "Content-Type"            response["Access-Control-Allow-Methods"] = "PUT,PATCH,DELETE"        return response
      • 单独打开我们的html文件发送ajax请求。get、post、put都可以获取数据
        1392812-20190124152831703-132684924.jpg
        1392812-20190124152838983-2060117819.jpg

转载于:https://www.cnblogs.com/xjmlove/p/10314678.html

你可能感兴趣的文章
【数据库】SQL两表之间:根据一个表的字段更新另一个表的字段
查看>>
四六级作文常见错误解析(转载)
查看>>
Tomcat
查看>>
./是当前目录 ../是当前的上一级目录。上上级就是../../一般绝对路径时候常用...
查看>>
linux支持FTP和SFTP服务【1】
查看>>
树的递归与非递归遍历方法
查看>>
每天一个Linux命令(6):rmdir命令
查看>>
oracle连接的三个配置文件(转)
查看>>
Vim配置文件(Vimrc)
查看>>
RecyclerView 局部刷新(获取viewHolder 去刷新)
查看>>
PHP表单(get,post)提交方式
查看>>
使用vbs或者bat脚本修改IE浏览器安全级别和选项
查看>>
Silverlight入门
查看>>
Silverlight动态调用WEBSERVICE,WCF方法
查看>>
LeetCode 895. Maximum Frequency Stack
查看>>
模仿segmentfault 评论
查看>>
一个简单的日志函数C++
查看>>
Java 8 中如何优雅的处理集合
查看>>
IOS程序的启动过程
查看>>
连接Linux下 XAMPP集成环境中部署的禅道的数据库MariaDB
查看>>