“No 'Access-Control-Allow-Origin' header is present on the requested resource” in django

前端 未结 11 602
隐瞒了意图╮
隐瞒了意图╮ 2020-12-02 16:44

I am newbie to django and using it as back end for an application that creates users. In front end the code for posting the user name is :

var xobj = new XM         


        
相关标签:
11条回答
  • 2020-12-02 17:15

    i was using python 2.7 and due to some reasons i cannot change the python version to version 3 and it took me 3 hours to find a solution which is :

    response =  HttpResponse(json.dumps(result), content_type="application/json")
    response["Access-Control-Allow-Origin"] = '*'
    response["Access-Control-Allow-Methods"] = 'GET,PUT, OPTIONS'
    response["Access-Control-Max-Age"] = '1000'
    response["Access-Control-Allow-Headers"] = 'X-Requested-With, Content-Type'
    return response
    
    0 讨论(0)
  • 2020-12-02 17:18

    Here's what I did when I got the same error from Django Rest Framework while sending an API request from Restangular. What this does is add CORS (Cross-Origin Resource Sharing) headers to responses from Django Rest Framework. Not having CORS headers was the cause of the error.

    In the Django Project root folder (where the manage.py file is located), do:

    pip install django-cors-headers
    

    I tried it using virtualenv but was not able to get it to work, so I installed it without switching to virtualenv and got it installed.

    After installing it, you have to make some edits to your django settings.py

    INSTALLED_APPS = (
        ...
        'corsheaders',
        ...
    )
    
    MIDDLEWARE_CLASSES = (
        ...
        'corsheaders.middleware.CorsMiddleware',
        'django.middleware.common.CommonMiddleware',
        ...
    )
    
    CORS_ORIGIN_ALLOW_ALL = True   
    

    Setting above to true allows all origins to be accepted.

    References: https://github.com/ottoyiu/django-cors-headers

    0 讨论(0)
  • 2020-12-02 17:19

    Old question, but I'm not seeing this solution, which worked for me, anywhere. So hoping this can be helpful for someone.

    Cross-origin requests in this context are only possible if the partner site's server allows it through their response headers.

    I got this to work in Django without any CORS middleware by setting the following headers on the response:

    response["Access-Control-Allow-Origin"] = "requesting_site.com"
    response["Access-Control-Allow-Methods"] = "GET"
    response["Access-Control-Allow-Headers"] = "requesting_site.com"
    

    Most answers on StackOverflow seem to mention the first one, but not the second two. I've just confirmed they are all required. You'll want to modify as needed for your framework or request method (GET, POST, OPTION).

    p.s. You can try "*" instead of "requesting_site.com" for initial development just to get it working, but it would be a security hole to allow every site access. Once working, you can restrict it for your requesting site only to make sure you don't have any formatting typos.

    0 讨论(0)
  • 2020-12-02 17:20

    Your front and back end are on different ports which means your ajax requests are subject to cross origin security.

    You need to set up the back end to accept requests from different origins (or just different port numbers).

    Try reading up on CORS and more specifically looking at django cors headers

    0 讨论(0)
  • 2020-12-02 17:24

    I faced the same issue.

    user3785412's answer will work. but, first time it may not work directly because of browser cache. either try in another browser or clear cache before loosing hope.

    I had API server in Django 2 hosted on Heroku and Angular 7 Client on Firebase. I made all changes in settings.py as per user3785412 and still it would not work, wasted almost 3 hours. Then came across on post which suggested cache could be issue. opened in chrome and voila!

    Hope this helps! (My first answer here, please go easy)

    0 讨论(0)
  • 2020-12-02 17:25

    In my case, I had simply forgotten to add a trailing slash at the end of the REST API URL. ie, I had this:

    http://127.0.0.1:8000/rest-auth/login
    

    Instead of this:

    http://127.0.0.1:8000/rest-auth/login/
    
    0 讨论(0)
提交回复
热议问题