Django 跨域访问POST请求需预先发送option请求问题处理方案

简介: Django 跨域访问POST请求需预先发送option请求问题处理方案

跨域访问POST请求需预先发送option请求问题处理方案

 


实践环境

Win 10

 

Python 3.5.4

 

Django-2.0.13.tar.gz

官方下载地址:

https://www.djangoproject.com/download/2.0.13/tarball/

 

问题描述

使用POST请求访问Django后端API时自动先发送option请求,然后才执行POST请求

 

原因分析

跨域资源共享(CORS)机制导致。

 

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

只要同时满足以下两大条件,就属于简单请求,否则就是非简单请求。

1、请求方法是以下三种方法之一:

HEAD

GET

POST  

 

2、HTTP的头信息不超出以下几种字段:

Accept

Accept-Language

Content-Language

Last-Event-ID

Content-Type(其值只限于application/x-www-form-urlencoded、multipart/form-data、text/plain)

 

当请求存在跨域资源共享(CORS),并且是非简单请求,就会触发CORS的预检请求(preflight);"预检"请求用的请求方法是OPTIONS,如果请求OK,才会再次发送目标操作请求。

 

实际开发过程中,后台采用token检验机制,前台发送请求必须将token放到Request Header中,那么就需要传输自定义Header信息、或则请求头中的Content-Type设置为"application/json",就会形成非简单请求。 但是很多时候,我们并不希望浏览器这么做,重复的请求,一方面是增加服务器压力,另一方面,相当于增加了请求响应时间。

 

解决方法

一种比较合适的解决方法就是增加响应头“Access-Control-Max-Age”来控制浏览器在多长时间内(单位为秒)无需在请求时发送预检请求,从而减少不必要的预检请求。

 

中间件代码如下:

#!/usr/bin/env python

# -*- coding:utf-8 -*-

 

__author__ = '授客'

 

from django.utils.deprecation import MiddlewareMixin

 

class PublicAccessControlMiddleware(MiddlewareMixin):

   def process_request(self, request):

       pass

 

   def process_response(self, request, response):

       response['Access-Control-Max-Age'] = 86400 #3600*24h = 86400秒,即告诉浏览器,缓存预检结果24小时,即针对同一URL请求,发送第一个OPTION请求往后24小时内不再发送OPTION请求。

   return response

 

参考链接

https://juejin.im/post/5c889e136fb9a049d37ff768

 

 

目录
相关文章
|
7月前
|
前端开发 数据库 Python
使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
【1月更文挑战第13天】使用 Python 的 Web 框架(如 Django 或 Flask)来建立后端接口,用于处理用户的请求,从数据库中查找答案并返回给前端界面
260 7
|
4月前
|
存储 前端开发 Serverless
中后台前端开发问题之Django项目中接收和处理用户的抽奖请求如何解决
中后台前端开发问题之Django项目中接收和处理用户的抽奖请求如何解决
23 0
|
6月前
|
前端开发 Python
Django框架中Ajax GET与POST请求的实战应用
Django框架中Ajax GET与POST请求的实战应用
|
6月前
|
JSON 缓存 前端开发
Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
|
6月前
|
前端开发 JavaScript 安全
跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护
跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护
|
6月前
|
JSON 前端开发 JavaScript
Django——Ajax请求
Django——Ajax请求
|
7月前
|
JSON 前端开发 数据格式
如何在Django中正确解析POST请求参数
如何在Django中正确解析POST请求参数
155 1
|
7月前
|
前端开发 UED Python
Wagtail-基于Python Django的内容管理系统CMS实现公网访问
Wagtail-基于Python Django的内容管理系统CMS实现公网访问
112 0
|
7月前
|
JSON 前端开发 JavaScript
Django实践-04静态资源和Ajax请求
Django实践-04静态资源和Ajax请求
Django实践-04静态资源和Ajax请求
|
7月前
|
前端开发 JavaScript Python
Django 模板中使用 Ajax POST
Django 模板中使用 Ajax POST
68 0