【发布时间】:2021-04-03 21:12:47
【问题描述】:
我使用 Django 构建我的 API 并尝试从 Angular 使用这个 API,但我得到一个 CORS 策略错误。 下面是我的代码。由于我是 Django 和 Angular 的新手,如果有人能帮助我解决这个问题,我将不胜感激。
Django 设置.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'bd_api',
'rest_auth',
'rest_framework.authtoken' ,
'django.contrib.sites' ,
'allauth' ,
'allauth.account',
'rest_auth.registration',
'django_filters',
'corsheaders' ,
]
CORS_ALLOW_CREDENTIALS = True
ALLOWED_HOSTS = ['*']
CORS_ALLOWED_ORIGINS = [
'http://localhost:4200',
]
SITE_ID = 1
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
...
Angular 代码文件
环境.ts
export const environment = {
production: false,
api_url: "http://127.0.0.1:8000/op-api"
};
intercept.ts
import { Injectable } from '@angular/core';
import {
HttpRequest,
HttpHandler,
HttpEvent,
HttpInterceptor,
HttpHeaders
} from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable()
export class HttpHeaderInterceptor implements HttpInterceptor {
constructor() {}
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
const headers = new HttpHeaders({
// 'Access-Control-Allow-Origin': '*',
'Accept': 'application/json',
});
const reqWithToken = request.clone({headers});
return next.handle(reqWithToken);
}
}
http.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { environment } from '../../environments/environment';
@Injectable({
providedIn: 'root'
})
export class HttpserviceService {
baseUrl = environment.api_url;
// headers = {Authorization: true}
constructor(private http: HttpClient) { }
public getContries(cond=''){
if(cond != '')
return this.http.get(this.baseUrl+'/country?'+cond);
else
return this.http.get(this.baseUrl+'/country');
}
}
从我的 main.component.ts 中的这个方法调用 api
constructor(private fb: FormBuilder, private httpService: HttpserviceService) { }
this.httpService.getContries().subscribe((resp) =>{
console.log('getcontriessss', resp);
if(resp['result'].length > 0){
this.dropdownOptions = [];
resp['result'].forEach(element => {
this.dropdownOptions = [...this.dropdownOptions, {id: element.short_name, name: element.name}]
});
}else{
}
});
但我收到此错误。
Access to XMLHttpRequest at 'http://127.0.0.1:8000/op-api/country' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
zone.js:3324 GET http://127.0.0.1:8000/op-api/country net::ERR_FAILED
core.js:4127 ERROR
HttpErrorResponse {headers: HttpHeaders, status: 0, statusText: "Unknown Error", url: "http://127.0.0.1:8000/op-api/country", ok: false, …}
error: ProgressEvent {isTrusted: true, lengthComputable: false, loaded: 0, total: 0, type: "error", …}
headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, headers: Map(0)}
message: "Http failure response for http://127.0.0.1:8000/op-api/country: 0 Unknown Error"
name: "HttpErrorResponse"
ok: false
status: 0
statusText: "Unknown Error"
url: "http://127.0.0.1:8000/op-api/country"
__proto__: HttpResponseBase
我试图找出解决方案,但不明白问题出在哪里。是来自我的 Django 文件还是 Angular 文件。
【问题讨论】: