Flask CORS 问题 - OPTION 请求未通过
Flask CORS issue - OPTION request is not passed
我花了三天时间修复这个 CORS 错误,但没有成功。
你能指导我如何解决这个问题吗?
我在具有 docker 容器的同一台本地机器上配置了 Angular(前端)+ Flask(后端 api)。 (Ubuntu 16.04)
Docker#1 :暴露端口 5000 的烧瓶。
-> 运行 和 manage.py --host 0.0.0.0
用于外部访问。
Docker#2 : angular 暴露端口 4200 的应用程序。
-> 运行 和 ng serve --port 0.0.0.0
用于外部访问。
curl --user username:password http://127.0.0.1:5000/v1/classes/
在我的主机和 angular docker 容器中成功。
同样在chrome浏览器中导航url即可。
但是当我尝试在 angular 代码中调用 get api 时遇到了 OPTION 的 CORS 错误;
OPTIONS http://127.0.0.1:5000/v1/classes/ 401 (UNAUTHORIZED)
Access to XMLHttpRequest at 'http://127.0.0.1:5000/v1/classes/' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
这是我的 angular 服务代码;
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { delay, map, catchError, tap } from 'rxjs/operators';
const endpoint = 'http://127.0.0.1:5000/v1/';
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'Basic ' + btoa('username:password')
})
};
@Injectable()
export class ExampleCRUDService {
constructor(private http: HttpClient) {}
private extractData(res: Response) {
let body = res;
return body || { };
}
getClasses(): Observable<any> {
return this.http.get(endpoint + 'classes/', httpOptions).pipe(
map(this.extractData));
}
}
测试
以下是我从烧瓶方面进行的试验,但没有成功。
CORS(app)
@app.route("/")
@cross_origin()
CORS(app, resources={r"/*": {"origins": "*"}})
@app.after_request
def after_request(response):
response.headers.add('Access-Control-Allow-Origin', '*')
response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE')
return response
app.config['CORS_HEADERS'] = 'Content-Type'
cors = CORS(app, resources={r"/v1": {"origins": "http://localhost:4200"}})
@app.route('/')
@cross_origin(origin='localhost',headers=['Content-Type','Authorization'])
CORS(app, expose_headers='Authorization')
令我惊讶的是,即使您使用以下内容,您仍面临 CORS 问题:
CORS(app)
请尝试以下操作:
CORS(app, origins=['127.0.0.1:4200'])
希望这能解决您的问题。如果您仍然遇到此问题,请告诉我。
我花了三天时间修复这个 CORS 错误,但没有成功。 你能指导我如何解决这个问题吗?
我在具有 docker 容器的同一台本地机器上配置了 Angular(前端)+ Flask(后端 api)。 (Ubuntu 16.04)
Docker#1 :暴露端口 5000 的烧瓶。
-> 运行 和 manage.py --host 0.0.0.0
用于外部访问。
Docker#2 : angular 暴露端口 4200 的应用程序。
-> 运行 和 ng serve --port 0.0.0.0
用于外部访问。
curl --user username:password http://127.0.0.1:5000/v1/classes/
在我的主机和 angular docker 容器中成功。
同样在chrome浏览器中导航url即可。
但是当我尝试在 angular 代码中调用 get api 时遇到了 OPTION 的 CORS 错误;
OPTIONS http://127.0.0.1:5000/v1/classes/ 401 (UNAUTHORIZED)
Access to XMLHttpRequest at 'http://127.0.0.1:5000/v1/classes/' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
这是我的 angular 服务代码;
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { delay, map, catchError, tap } from 'rxjs/operators';
const endpoint = 'http://127.0.0.1:5000/v1/';
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'Basic ' + btoa('username:password')
})
};
@Injectable()
export class ExampleCRUDService {
constructor(private http: HttpClient) {}
private extractData(res: Response) {
let body = res;
return body || { };
}
getClasses(): Observable<any> {
return this.http.get(endpoint + 'classes/', httpOptions).pipe(
map(this.extractData));
}
}
测试 以下是我从烧瓶方面进行的试验,但没有成功。
CORS(app)
@app.route("/")
@cross_origin()
CORS(app, resources={r"/*": {"origins": "*"}})
@app.after_request
def after_request(response):
response.headers.add('Access-Control-Allow-Origin', '*')
response.headers.add('Access-Control-Allow-Headers', 'Content-Type,Authorization')
response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE')
return response
app.config['CORS_HEADERS'] = 'Content-Type'
cors = CORS(app, resources={r"/v1": {"origins": "http://localhost:4200"}})
@app.route('/')
@cross_origin(origin='localhost',headers=['Content-Type','Authorization'])
CORS(app, expose_headers='Authorization')
令我惊讶的是,即使您使用以下内容,您仍面临 CORS 问题:
CORS(app)
请尝试以下操作:
CORS(app, origins=['127.0.0.1:4200'])
希望这能解决您的问题。如果您仍然遇到此问题,请告诉我。