【问题标题】:Cors error when accessing Django Rest API from front end Using Axios使用 Axios 从前端访问 Django Rest API 时出现 Cors 错误
【发布时间】:2019-09-28 01:19:47
【问题描述】:

使用 axios 访问 django Rest API 出现以下错误

从源“http://localhost:8080”访问“http://api.localhost:8080/auth/register-shop/”处的 XMLHttpRequest 已被 CORS 策略阻止:预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 access-control-allow-origin .

我在此链接https://pypi.org/project/django-cors-headers/ 中添加了 django cors 标头

前端页面

 axios({
                                method: 'post',
                                url: 'http://api.localhost:8080/auth/register-shop/',
                                //url: 'http://api.yuniq.ml/auth/register-shop/',

                                headers: {
                                        "Access-Control-Allow-Origin": "*",
                                        "content-type": "application/json"
                                },
                                data: {

                                        "name": Name,
                                        "address": Address,
                                        "city": City,
                                        "postalC ode": PostalCode,
                                        "telephone": Telephone,
                                        "openTime": Opentime,
                                        "closeTime": Closetime,
                                        "image_url": Image_url  //still not working 

                                }
                        }).then(function (response) {
                                console.log(response);
                        })
                                .catch(function (error) {
                                        console.log(error);
                                });


                }

settings.py

INSTALLED_APPS = ['corsheaders']


MIDDLEWARE = [

    'django_hosts.middleware.HostsRequestMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware' , #add cors middleware
    'django.middleware.common.CommonMiddleware',
    'corsheaders.middleware.CorsPostCsrfMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django_hosts.middleware.HostsResponseMiddleware',
]



CORS_ORIGIN_ALLOW_ALL = True

执行此操作后错误未解决

【问题讨论】:

  • 检查 settings.py 中的 ALLOWED_HOSTS。将其设置为此 ALLOWED_HOSTS = ["*"]
  • 还在 settings.py 中添加了 ALLOWED_HOSTS = ['*']
  • 从前端 JavaScript 代码中的 axios 调用中删除 Access-Control-Allow-Origin": "*"
  • 你不能从 django 视图中为你的响应添加访问控制吗? response = HttpResponse(json.dumps(string)) response["Access-Control-Allow-Origin"] = "*" return response
  • 仍然出现同样的错误

标签: django django-rest-framework cors axios django-cors-headers


【解决方案1】:

我遇到了同样的问题,做了以下步骤:

  • 我检查了从 Axios 发送的标头。
  • 确保已安装此软件包

'pip install django-cors-headers'

 INSTALLED_APPS = [
        ...,
        'corsheaders',
        ...
 ]

MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    ...
]

现在有两种选择:

1 - 只需在 settings.py 中添加以下变量即可允许访问所有域:

ALLOWED_HOSTS=['*']

CORS_ORIGIN_ALLOW_ALL = 真

2 - 不允许访问所有域,但您正在使用 API 的域。在settings.py中添加如下变量

ALLOWED_HOSTS=['http://localhost:5000']

CORS_ORIGIN_ALLOW_ALL = 假

CORS_ORIGIN_WHITELIST = ( 'http://localhost:5000', )

如果您想在请求中发送特定标头,您还可以在 setting.py 中定义允许收听者。

CORS_ORIGIN_ALLOW_ALL = 真

CORS_ALLOW_HEADERS = [   
    ...
    'Currency',
    ...
 ]

看看这个可以帮助你:

https://dzone.com/articles/how-to-fix-django-cors-error

【讨论】:

    【解决方案2】:

    您的 axios 请求不应包含此标头: "Access-Control-Allow-Origin": "*",

    这应该只包含在服务器的响应中。尝试从您的 axios 请求中删除它。

    【讨论】:

      【解决方案3】:

      我最近遇到了同样的问题,我已经解决了。我还使用corsheaders 来避免CORS 错误,它工作正常,直到我介绍Authentication。对于那些权限设置为IsAuthenticated 的api,同样的问题再次出现。因此,我在 settings.py 的 ALLOWED_HOSTS 列表中添加了某个主机,并且它起作用了。添加主机有两个选项。

      选项 1。ALLOWED_HOSTS=["*"]

      选项 2。ALLOWED_HOSTS=['your host1', 'your host2', 'your host3', ......]

      注意:我不喜欢选项 1,因为它会引发安全问题。所以选择选项2。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-29
        • 2021-12-21
        • 2019-11-09
        • 2020-01-19
        • 2019-12-25
        • 1970-01-01
        • 2021-03-09
        • 2015-07-22
        相关资源
        最近更新 更多