• cors的跨域问题解决


    简单请求

    cors解决跨域问题方法:  解决方法是在客户端给服务端发送请求时,加上一个响应头.

    简单请求:也就是一次请求,没有第二次请求,

    客户端代码:

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/', views.IndexView.as_view()),
    ]
    url
    from django.shortcuts import render
    from rest_framework import views
    from django.http import JsonResponse
    
    
    class IndexView(views.APIView):
    
        def get(self,request,*args,**kwargs):
            ret={
                'code':1000,
                'data':'老男孩'
            }
            res=JsonResponse(ret)
            res['Access-Control-Allow-Origin']='http://127.0.0.1:8001'  #只允许这一个域名跨域
            res['Access-Control-Allow-Origin']='*'          #允许所有的域名跨域
            #最好的办法是加一个中间件
            return res
    views

    服务端

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^in/', views.index),
    ]
    def index(request):
        return render(request,'index.html')
    views
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js"></script>
    </head>
    <body>
    
    <input type="button" value="按钮" class="c1">
    
    <script>
        $('.c1').click(function () {
            $.ajax({
                url:'http://127.0.0.1:8000/index/',  #给别的网站发送请求
                type:'GET',
                success:function (data) {
                    console.log(data)
                }
    
            })
        })
    </script>
    templates
    复杂请求

    复杂请求:也就是在发送请求之前,会先发送一个预检Options请求,如果预检通过,则再次发送真实的数据

    缺点:会造成资源浪费,影响向效率.

    所以发送真实的数据之前,自己定义一个options函数.

    客户端:

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/', views.IndexView.as_view()),
    ]
    url
    from django.shortcuts import render,HttpResponse
    from rest_framework import views
    from django.http import JsonResponse
    
    
    class IndexView(views.APIView):
    
        def get(self,request,*args,**kwargs):
            ret={
                'code':1000,
                'data':'老男孩'
            }
            res=JsonResponse(ret)
            res['Access-Control-Allow-Origin']='http://127.0.0.1:8001'  #只允许这一个域名跨域
            res['Access-Control-Allow-Origin']='*'          #允许所有的域名跨域
            #最好的办法是加一个中间件
            return res
    
    
        def post(self,request,*args,**kwargs):
            ret = {
                'code': 1000,
                'data': '老男孩'
            }
            res = JsonResponse(ret)
            res['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8001'  # 只允许这一个域名跨域
            res['Access-Control-Allow-Origin'] = '*'  # 允许所有的域名跨域
            # 最好的办法是加一个中间件
            return res
    
        def options(self, request, *args, **kwargs):
            #tornado操作
            # self.set_header('Access-Control-Allow-Origin', "http://www.xxx.com")
            # self.set_header('Access-Control-Allow-Headers', "k1,k2")
            # self.set_header('Access-Control-Allow-Methods', "PUT,DELETE")
            # self.set_header('Access-Control-Max-Age', 10)
            
            #django操作
            res=HttpResponse()
            res['Access-Control-Allow-Origin']='*'
            res['Access-Control-Allow-Headers']='h1'
            # 如果是复杂的操作,如put,delete请求
            # res['Access-Control-Allow-Methods']='PUT'
            #设置超时时间
            # res['ccess-Control-Max-Age']=10
            return res
    Views

    服务端:

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^in/', views.index),
    ]
    url
    from django.shortcuts import render
    
    # Create your views here.
    
    def index(request):
        return render(request,'index.html')
    views
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js"></script>
    </head>
    <body>
    
    <input type="button" value="按钮" class="c1">
    
    <script>
        $('.c1').click(function () {
            $.ajax({
                url:'http://127.0.0.1:8000/index/',
                type:'POST',
                data:{'k1':'v1'},
                headers:{'h1':'h2'},  #复杂请求
                success:function (data) {
                    console.log(data)
                }
            })
        })
    </script>
    
    </body>
    </html>
    templates

    PS:如果要传输cookie时,也要在options中加上相应的键值对.详情点击

  • 相关阅读:
    关于AutoResetEvent和ManualResetEvent
    (转)使用 ODP.NET 和引用游标优化结果集
    胰腺
    SQL Cache Dependency
    败犬的远吠?
    吃亏和付出经常是必须的(转)
    AutoResetEvent 与 ManualResetEvent送花例子
    linux yum install
    SpringMVC+JPA+SpringData配置
    Spring AOP 实现原理
  • 原文地址:https://www.cnblogs.com/52forjie/p/8470410.html
Copyright © 2020-2023  润新知