我使用Django REST Framework编写了一个API.对于身份验证,我使用的是django-oauth2-provider:https://github.com/caffeinehit/django-oauth2-provider
我在我的设置页面中配置了cors(使用Corsheaders中间件).
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
CORS_ORIGIN_ALLOW_ALL = True # Dangerous (using for testing purposes)
Run Code Online (Sandbox Code Playgroud)
我的客户端应用程序是使用Angular JS构建的.但是,每次我们发出任何请求(包括GET请求)时,都会发出一个选项请求.此选项请求需要约50 - 500 ms,具体取决于请求.
api调用看起来像" https://example.com/api/v1/posts/?page=1(2,3,4 ......等)"
我需要了解为什么要提出此请求,以及如何提高应用程序的性能.
javascript django angularjs django-rest-framework django-cors-headers
我正在尝试在我的应用程序中允许CORS,以便我的跨域javascript客户端可以访问我的API,我已经安装了django-cors-headers.我现在正在尝试添加中间件:
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # Remove this and it works
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
Run Code Online (Sandbox Code Playgroud)
但是这给了我一个TypeError:
TypeError:object()不带参数
这在django 1.10更新之前运行良好.有任何想法吗?
我真的被困住了。这就是我想要做的。
一切都很好本地化。一旦我将其投入生产,我就开始收到 CSRF 错误。这就是一切的运作方式。
我已经看到了从关闭 CSRF 到允许所有事情的所有答案。我想正确地做到这一点,而不仅仅是关闭和打开所有东西并最终导致安全漏洞。
所以,这就是我所拥有的。
已安装:django-cors-headers django-rest-framework drf-nested-routers ...等
我的 api 在 api.websitename.com 上运行,Vue.js 应用程序在 websitename.com 上运行。
GET 请求效果很好。OPTION 请求似乎有效。
任何有风险的请求都不起作用。
对于我的 CORS,我'corsheaders.middleware.CorsMiddleware',在其他MIDDLEWARE.
然后我的 CORS 设置是:
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
'*.websitename.com',
)
Run Code Online (Sandbox Code Playgroud)
我的 CSRF 设置是:
CSRF_TRUSTED_ORIGINS = [
"api.websitename.com",
]
Run Code Online (Sandbox Code Playgroud)
无论我如何使用这些,最终都会出现 CSRF 令牌错误。
我已经尝试过在我的 Vue App.vue 文件中做这样的事情的方法:
mounted () {
this.getCSRFToken() …Run Code Online (Sandbox Code Playgroud) django django-csrf django-rest-framework vue.js django-cors-headers
我正在尝试找出一种方法,根据后端端点前端的命中情况来制定不同的 CORS 规则。
所以我可以拥有
/api 端点具有 CORS 域白名单和
/public-api 没有 CORS 域白名单。
这是必需的,因为我有两个用于自己前端的内部端点,以及一个可以安装在任何第三方域中的公共 JS 小部件。
我看过django-cors-headers库,但它是正则表达式配置
CORS_ORIGIN_REGEX_WHITELIST = []
Run Code Online (Sandbox Code Playgroud)
致力于让来自域列表的请求通过。
就我而言,我需要一种方法来使用正则表达式(或其他方法)来让对我的端点的请求通过或不通过。
我收到以下错误:
Access to XMLHttpRequest at 'http://127.0.0.1:8000/' from origin 'http://localhost:62570' has been blocked by CORS policy: Request header field access-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response.
我尝试添加django-cors-headers中间件,并且CORS_ALLOW_ALL_ORIGINS = True我也做了ALLOWED_HOSTS = ['*']但仍然遇到相同的 CORS 错误。我在 NestJS 中遇到了同样的错误,但添加后app.enableCors();它得到了解决。
这是我的settings.py文件:
from pathlib import Path
BASE_DIR = Path(__file__).resolve(strict=True).parent.parent
DEBUG = True
ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'corsheaders',
'rest_framework',
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', …Run Code Online (Sandbox Code Playgroud) python django cors django-rest-framework django-cors-headers
ALLOWED_HOSTS和CORS有什么区别。如果定义了ALLOWED_HOSTS,是否还需要定义CORS?我没有使用django模板。我还可以动态定义这两个吗?(我想不是)
我正在使用django作为后端,并且在不同的主机上使用了多个reactjs前端应用程序。
我有一个问题,尝试使用rest api时会收到响应:“ 从原始地址“ https://kollektivet.app ” 获取到' https://kollektivet.app:8082/api/login/ '的访问权限已被CORS政策阻止:对预检请求的响应未通过访问控制检查:预检请求不允许重定向。”
当我尝试使用任何其他api时,就会发生这种情况。从我所阅读的内容来看,此错误表示我正在尝试重定向,但不是。
后端是Django,看起来像这样:
@csrf_exempt
@api_view(["POST"])
@permission_classes((AllowAny,))
def register(request,):
password = request.data.get("password", "")
email = request.data.get("email", "")
if not email and not password and not email:
return Response(
data={
"message": "username, password and email is required to register a user"
},
status=status.HTTP_400_BAD_REQUEST
)
new_user = User.objects.create_user(
email=email, password=password
)
return Response(status=status.HTTP_201_CREATED)
Run Code Online (Sandbox Code Playgroud)
前端处于反应状态,如下所示:
createUser(event) {
event.preventDefault();
let data = {
name: this.state.name,
password: this.state.password,
repeatPassword: this.state.repeatPassword,
email: this.state.email
};
if (this.state.name !== '' && …Run Code Online (Sandbox Code Playgroud) 我正在使用 Django 和 React 使用 Rest Framework 进行项目。我已经CORS_ALLOW_ALL_ORIGINS=True在 settings.py 中设置了,但仍然出现错误Access to XMLHttpRequest at 'http://127.0.0.1:8000/api/encrypt/' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
我正在使用 axios 来发布和获取请求。令人惊讶的是,即使发出错误后请求但获取请求失败。这是使用 axios 的 React 文件
sendImage =()=> {
this.activateSpinner()
let formData = new FormData()
formData.append('to_be_hidden', this.state.files[0], this.state.files[0].name)
formData.append('used_to_hide', this.state.files[1], this.state.files[1].name)
axios.post('http://127.0.0.1:8000/api/encrypt/', formData, {
headers: {
'accept': 'application/json',
'content-type': 'multipart/form-data'
}
})
.then(resp=>{
this.getImageClass(resp)
console.log(resp.data.id)
})
.catch(err=>{
console.log("Code broke at send image")
console.log(err)
}) …Run Code Online (Sandbox Code Playgroud) django cross-domain django-rest-framework reactjs django-cors-headers
一段时间以来,我一直在尝试从 Vue 前端向 Django 后端发送 POST 或 DELETE 请求。
我在 localhost:3000 上运行 Vue.js,在 localhost:8000 上运行 Django。我已经使用django-cors-headers设置了 CORS ,并且能够获取请求。但是,一旦我尝试删除或发布,就会收到此错误:
Forbidden (CSRF cookie not set.)
据我了解,我需要在请求标头中传递 CSRF 令牌,我有:
deleteImage() {
const url = this.serverURL + 'images/delete/' + this.image_data.pk;
const options = {
method: "DELETE",
headers: {'X-CSRFToken': this.CSRFtoken}
};
fetch(url, options)
.then(response => {
console.log(response);
if (response.ok){
// if response is successful, do something
}
})
.catch(error => console.error(error));
}
Run Code Online (Sandbox Code Playgroud)
我从 GET 请求获取,如果我使用Django 文档this.CSRFtoken 中显示的方法,令牌是相同的。
我的姜戈settings.py看起来像这样:
rom …Run Code Online (Sandbox Code Playgroud) 我尝试打开端口以在“http://localhost:3000”处使用 django 后端作为 API
这是我的工具
CORS_ALLOWED_ORIGINS = (
'http://localhost:3000'
)
Run Code Online (Sandbox Code Playgroud)
INSTALLED_APPS = [
*
'corsheaders',
]
Run Code Online (Sandbox Code Playgroud)
MIDDLEWARE = [
*
"corsheaders.middleware.CorsMiddleware",# new
"django.middleware.common.CommonMiddleware", # new
*
]
Run Code Online (Sandbox Code Playgroud)
但我不断收到这样的错误消息
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:
ERRORS:
?: (corsheaders.E013) Origin '/' in CORS_ALLOWED_ORIGINS is missing scheme or netloc
HINT: Add a scheme (e.g. https://) or netloc (e.g. example.com).
?: (corsheaders.E013) Origin '/' in CORS_ALLOWED_ORIGINS is missing scheme or netloc
HINT: Add a scheme (e.g. https://) or netloc (e.g. example.com).
?: (corsheaders.E013) …Run Code Online (Sandbox Code Playgroud) django ×10
cors ×3
django-csrf ×2
python ×2
reactjs ×2
vue.js ×2
angularjs ×1
apache2 ×1
cross-domain ×1
csrf-token ×1
javascript ×1