• Django drf:手撸自定义跨域


    项目需求:

      1.用域名8000向8001发送请求,用django框架解决跨域问题

      2.用上自定义中间件配置,支持get、post、put、detele和非简单请求

      3.支持版本控制

      4.在setting中配置白名单列表,在表中域名可以访问,否则返回错误信息

    # 首先8000端口url层设置路由

    from django.conf.urls import url
    from django.contrib import admin
    from app import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^index/', views.test),
    ]

    #写test视图函数

    from django.views.decorators.cache import cache_page
    import time
    from rest_framework.response import Response
    # 单页面缓存10秒
    # @cache_page(10)
    def test(request):
        print('三儿来了!')
        ctime = time.time()
    
        return render(request,'index.html',locals())

    # 模板层写index模板(这里用到ajax向后台提交数据,需要引入bootstop且在setting中配置)

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <script src="/static/jquery-3.3.1.js"></script>
        <title>Title</title>
    </head>
    <body>
    不缓存
    {{ ctime }}
    <br>
    存在的缓存
    {#{% load cache %}#}
    {#第一个是超时时间,缓存时间。第二个参数是Key值,别名。#}
    {#{% cache 10 'test' %}#}
    {#    {{ ctime }}#}
    {#{% endcache %}#}
    <button id="btn">点我发请求</button>
    
    </body>
    <script>
        $("#btn").click(function () {
            $.ajax({
                url: 'http://127.0.0.1:8001/v1/publishs/',
                {#type: 'get',#}
                type:'post',
                {#type:'put',#}
                contentType:'application/json',
                {#data:JSON.stringify({'name':'egon'}),#}
                success: function (data) {
                    console.log(data)
                }
            })
        })
    
    </script>
    </html>

    # ajax提交的路由请求http://127.0.0.1:8001/v1/publishs/

    # 由于请求的是V1版本,我们在端口8001路由层中设置版本路由

    from django.conf.urls import url
    from django.contrib import admin
    from app import views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^(?P<version>[v1|v2]+)/publishs/', views.PublishView.as_view()),
       
    ]

    # 写对应的的函数视图

    from rest_framework.views import APIView
    from rest_framework.versioning import URLPathVersioning
    from rest_framework.response import Response
    
    # 版本控制的局部使用
    class PublishView(APIView):
        # versioning_class = QueryParameterVersioning # 基于url的get传参方法
        versioning_class = URLPathVersioning # 基于url的正则方式
    
        def get(self,request,*args,**kwargs):
            print(request.version)
            return Response({'status':100})
    
        def post(self,request,*args,**kwargs):
            print(request.method)
            return Response({'status': 100, 'msg': 'post'})
    
        def delete(self,request,*args,**kwargs):
            print(request.method)
            return Response({'status':100,'msg':'delete'})
    
        def put(self,request,*args,**kwargs):
            print(request.method)
            return Response({'status':100,'msg':'put'})

    #这个时候写定义中间件

    from django.utils.deprecation import MiddlewareMixin
    from django.conf import settings
    from rest_framework.response import Response
    from django.http import JsonResponse
    
    class CORSMiddle(MiddlewareMixin):
        def process_response(self,request,response):
            #
            # print(request.META['HTTP_ORIGIN'])
            host_list = settings.OPEN_HOST
            host = request.META['HTTP_ORIGIN']
    
            response['Access-Control-Allow-Origin'] = host
            if request.method == 'OPTIONS':
                response['Access-Control-Allow-Methods'] = 'PUT,DELETE,POST,GET'
                response['Access-Control-Allow-Headers'] = 'Content-Type'
    
    
            print(host,host_list)
            if host not in host_list:
                # rep = JsonResponse({'msg':'error  非法访问!'})
                rep = Response({'msg':'error  非法访问!'})
                rep['Access-Control-Allow-Origin'] = host
                return rep
            return response

    # 自定义中间需要到setting中做配置,且把csrf注销

    MIDDLEWARE = [
        'django.middleware.security.SecurityMid'
        ''
        'dleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        # 'django.middleware.csrf.CsrfViewMiddleware',
        'app.center.CORSMiddle',# 此为自定义中间件
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]

    # 后面需要在setting中自定义白名单

    OPEN_HOST = ['http://127.0.0.1:8002','http://127.0.0.1:8003']
  • 相关阅读:
    Nginx+Keepalived实现简单的服务高可用
    搭建私有镜像仓库
    GlusterFS
    GlusterFS分布式存储系统
    GlusterFS分布式存储
    ladp日志配置
    go mod位置和自定义包引入问题
    .netcore 使用redis
    一篇技术博文引发的stylelint项目实践
    React Hooks使用避坑指南
  • 原文地址:https://www.cnblogs.com/wuzhengzheng/p/10458687.html
Copyright © 2020-2023  润新知