AMcoder - javascript, python, java, html, php, sql

CORS-ը չի աշխատում Django-ում, բայց կարգավորումները ճիշտ են թվում

Ես փորձում եմ POST զանգ կատարել Django-ին React Native Web ճակատից տարբեր ենթադոմեյնների վրա:

Կարծում էի, որ CORS-ը ճիշտ է կարգավորել, բայց կարծես թե այդպես չէ:

Ահա թե ինչ տեսք ունի իմ Django settings.py-ը.

CORS_ALLOW_CREDENTIALS = True

CORS_ALLOW_HEADERS = ['*']

CORS_ALLOWED_ORIGINS = ['https://api.example.com', 'https://example.com', 'https://www.example.com' ]

CSRF_TRUSTED_ORIGINS = [
    'https://api.example.com', 'https://example.com', 'https://www.example.com'
]

ALLOWED_HOSTS = ["0.0.0.0", "api.example.com", "example.com"]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
]

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

Կոնկրետ ի՞նչ եմ ես այստեղ սխալ անում: Սխալը, որը ես ստանում եմ, սա է.

Access to XMLHttpRequest at 'https://api.example.com/api/v1/pagescreate/' from origin 'https://example.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Եվ սա իմ Ջանգոյի տեսակետն է.

class PageCreateView(generics.CreateAPIView):
    queryset = Page.objects.all()
    serializer_class = PageSerializer

Ի՞նչը կարող է դա առաջացնել: Արդյո՞ք ես բացակայում եմ React-ում որոշ կարգավորումներ: Ես օգտագործում եմ axios զանգեր կատարելու համար, որի միակ վերնագիրը "Content-Type": "application/json" է

ԽՄԲԱԳՐԵԼ. Կարո՞ղ է սա պայմանավորված լինել իմ սերվերի որոշ nginx կանոններով: Կամ գուցե իմ Kubernetes կոնֆիգուրացիան: Ես օգտագործում եմ Docker-ը այն կոնտեյները կարգավորելու համար և կարող եմ հեշտությամբ կապել Dockerfile-ը կամ իմ Kubernetes-ի կարգավորումներից որևէ տեղեկություն


  • դուք լուծել եք այս խնդիրը 01.05.2021
  • @MahmoudAdel Ես չունեմ, ոչ 01.05.2021
  • Ես մտածեցի, որ ավելի լավ կլինի, եթե ինչ-որ մեկն ավելի լավ պատասխան ունենա, ես նախկինում ունեի այս խնդիրը, բայց այն շտկեցի՝ ճիշտ կարգավորելով իմ կոնֆֆֆը, չգիտեմ, թե ինչու ձերը չի աշխատում, բայց այն ամենը, ինչ ես կարող եմ անել, իմ Django conf-ով կիսվելն է։ , և react-ի համար դա կարող է բացակայող վերնագրի խնդիր լինել 01.05.2021
  • @MahmoudAdel Այո, ես նույնպես կասկածում եմ գլխի բացակայման մասին: Ես կարող եմ սրա համար պարգևատրել երկու ժամից, այնպես որ, հավանաբար, կավարտվեմ դա անել 02.05.2021
  • միգուցե այս պատասխանը կարող է օգնել? stackoverflow.com/a/50949631/4984493 02.05.2021
  • @MahmoudAdel Այո, դա կարող է պայմանավորված լինել ինչ-որ nginx կանոնով 02.05.2021
  • Ո՞րն է axios-ի ուղարկած հարցումի ծագման վերնագիրը և հարցման մեթոդը: 02.05.2021
  • Իմ միակ վերնագիրը հավելված/json-ն է, իսկ մեթոդը, որը դժվարանում է, POST-ն է: GET-ը խնդիր չունի: Ես բացահայտորեն չեմ փորձարկել PUT կամ PATCH, չնայած անհրաժեշտության դեպքում կարող եմ 02.05.2021
  • Ո՞րն է պատասխանի HTTP կարգավիճակի կոդը: Դուք կարող եք օգտագործել Ցանցի վահանակը դիտարկիչի մշակող գործիքներում՝ ստուգելու համար: Եթե ​​Chrome-ը ձեզ ցույց չի տալիս այն, ստուգելու համար օգտագործեք ցանցի վահանակը Firefox-ի մշակող գործիքներում: Արդյո՞ք դա 4xx կամ 5xx սխալ է, այլ ոչ թե 200 OK հաջող պատասխան: 02.05.2021
  • @sideshowbarker Իրականում CORS-ի խնդիրը կարծես թե վերացել է: Ես լիովին վստահ չեմ, թե ինչպես, քանի որ ես ոչինչ չեմ փոխել իմ կարգավորումներում: Ես կվերադառնամ այս մասին, և եթե խնդիրներ ունենամ, կպիտակեմ ձեզ: 02.05.2021
  • Իմ միակ վերնագիրը հավելվածն է/json, իսկ մեթոդը, որը դժվարանում է, POST-ն է:: Ոչ, դա այդպես չէ: Սա միակ վերնագիրն է, որը դուք փոխանցել եք Axios-ին, բայց այն հարցումը, որն իրականում ուղարկում է զննարկիչը, շատ ավելին է պարունակում: Նայեք ձեր ցանցի պատուհանին: 02.05.2021
  • Կարո՞ղ եք տեղադրել այն վերնագրերը, որոնք իրականում ուղարկվել է ձեր սերվերի կողմից՝ գործարկելով http head https://api.example.com/api/v1/pagescreate/-ի նման բան: http հրամանը գալիս է httpie փաթեթի հետ: Բացի այդ, քանի որ դուք նշեցիք, որ օգտագործում եք nginx, կարո՞ղ եք հրապարակել հարցումը անմիջապես ձեր django սերվերի դեմ, ինչպես նաև այն nginx-ով անցնելուց հետո: 04.05.2021
  • Դուք օգտագործում եք CSRF նշանը (այսինքն՝ թխուկներ): Կամ JWT? 05.05.2021
  • Երբ ասում եք React Native Web front end, դա բնի՞կ հավելված է: XMLHttpRequest-ի անվտանգության մոդելը տարբերվում է համացանցից, քանի որ բնիկ հավելվածներում CORS հասկացություն չկա: 08.05.2021

Պատասխանները:


1

Ես նախկինում ունեցել եմ այս խնդիրը և առաջարկում եմ օգտագործել.

CORS_ORIGIN_ALLOW_ALL = True   

որը թույլ կտա բոլոր ծագումը

այս կոնֆիգուրով, իհարկե.

MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

INSTALLED_APPS = [
     ...
    'corsheaders',
     ...
]
04.05.2021
  • Թեև սա կարճաժամկետ հեռանկարում լավ պատասխան է, այն թույլ է տալիս խաչաձև կայքերի սկրիպտավորում, ինչը CSRF-ը պետք է կանխի: Փորփրելով ձեր տեղեկամատյանները և պարզելով, թե որն է այն որակավորված տիրույթը, որը դուք մերժում էիք, այնուհետև այդ տիրույթները ձեր թույլատրելի սկզբնաղբյուրներին ավելացնելը անվտանգության բացթողում չի թողնի: 11.05.2021
  • @steven-matthews CORS-ի շրջանցումը վատ պրակտիկա է: Թեև ես չեմ փորձարկել, հուսով եմ, որ խնդիրը մատնանշել եմ իմ պատասխանում stackoverflow.com/a/67453601/4522780 12.05.2021

  • 2

    Հրաժարում. ոչ թե django dev:

    Բայց դուք օգտագործում եք ոչ սպիտակ ցուցակում նշված արժեք Content-Typeի համար նշանակում է, որ ձեր POST հարցումը նախնական թռիչքից կլինի: Կարո՞ղ եք հաստատել, որ OPTIONS հարցումը ճիշտ է մշակվել ձեր API-ի կողմից:

    04.05.2021

    3

    Եթե ​​դուք սա աշխատում եք K8-ում, տեսեք, արդյոք ALLOWED_HOSTS-ում հետևյալը ներառելը օգնում է.

    gethostname(), gethostbyname(gethostname())
    
    06.05.2021

    4

    Ես արեցի մի բան, որը շատ նման է նրան, ինչ դուք անում եք, և այս կոնֆիգուրացիան աշխատեց ինձ համար.

    INSTALLED_APPS = [
        ...
        'corsheaders',
        ...
    ]
    
    MIDDLEWARE = [
        'corsheaders.middleware.CorsMiddleware',
        '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',
    ]
    
    CORS_ORIGIN_WHITELIST = [
         'https://website.com/'
    ]
    
    06.05.2021

    5

    Կարծում եմ, սա կարող է պայմանավորված լինել պարամետրերում միջին ծրագրերի հաջորդականությամբ: (Չնայած ես լիովին վստահ չեմ)

    Կարող եք փորձել միջին ծրագրաշարի հետևյալ հաջորդականությունը

    MIDDLEWARE = [
        "django.middleware.security.SecurityMiddleware",
        "django.contrib.sessions.middleware.SessionMiddleware",
        "corsheaders.middleware.CorsMiddleware",
        "django.middleware.common.CommonMiddleware",
        "django.middleware.csrf.CsrfViewMiddleware",
        "django.contrib.auth.middleware.AuthenticationMiddleware",
        "django.contrib.messages.middleware.MessageMiddleware",
        "django.middleware.clickjacking.XFrameOptionsMiddleware",
    ]
    

    և պարզապես հեռացնել

    CORS_ALLOW_HEADERS = ['*']
    

    կարգավորումներից։

    Տեղեկացրեք ինձ, եթե դա ստացվի

    07.05.2021

    6

    CORS_ALLOW_CREDENTIALS = True-ը նշանակում է, որ CORS_ALLOW_HEADERS = ['*']ը թարգմանվում է բառացիորեն, այսինքն՝ ոչ որպես նիշ:

    Եթե ​​ցանկանում եք հատուկ վերնագրեր ավելացնել, դուք պետք է ընդլայնեք լռելյայն ցուցակը, ինչպես դա արվում է փաստաթղթում;

    from corsheaders.defaults import default_headers
    
    CORS_ALLOW_HEADERS = list(default_headers) + [
        'my-custom-header',
    ]
    

    Քանի որ հարցումն ունի Content-Typeapplication/json-ից, սա պարզ հարցում չէ ըստ MDN-ի: Այսպիսով, այս հարցումը գործարկում է CORS նախնական թռիչքի հարցումը, որը ներառում է Access-Control-Request-Headers հարցման վերնագիր: Այս հարցման վերնագիրը առաջացնում է Access-Control-Allow-Headers պատասխանի վերնագիր:

    Այս պատասխանի վերնագրի արժեքը կարող է լինել *՝ նշելու նիշի արժեքը հավատարմագրերի բացակայության դեպքում: Բայց *-ը մեկնաբանվում է բառացիորեն, երբ հարցումում առկա են HTTP թխուկներ կամ նույնականացման տեղեկատվությունը, ինչպես դա արվում է այստեղ CORS_ALLOW_CREDENTIALS = True-ով:

    Այստեղ, CORS-ում, նախնական թռիչքի Access-Control-Request-Headers արժեքը Content-Type է, բայց Access-Control-Allow-Headers_ը բառացի * է CORS_ALLOW_HEADERS = ['*']_ի պատճառով: Այսպիսով, հարցումը լիազորված չէ, այդ իսկ պատճառով սխալը Ոչ մի «Access-Control-Allow-Origin» վերնագիր չկա հայցվող ռեսուրսի վրա:

    GET-ն աշխատում է այստեղ, քանի որ դա պարզ խնդրանք է և չի հրահրում CORS-ի թռիչքը:

    CORS
    Access-Control-Allow-Headers

    09.05.2021

    7

    Կարող եք փորձել.

    CORS_ORIGIN_WHITELIST = ('https://example.com')

    09.05.2021

    8

    Ես Ջանգոյի հետ ունեցել եմ CORS-ի բազմաթիվ խնդիրներ: Ընդհանուր առմամբ, դուք կարող եք փորձել օգտագործել.

    CORS_ALLOWED_ORIGINS = ['*']
    
    CSRF_TRUSTED_ORIGINS = ['*']
    

    (Նշում. սա պարզապես կաթսա է, և դուք, հավանաբար, չեք ցանկանում դա անել արտադրության մեջ. իրական խնդրի որոնումն ի վերջո անհրաժեշտություն է)

    համոզվելու համար, որ դա ձեր Django-ի կարգավորումներում է: Այնուամենայնիվ, ինչպես ես նշեցի այստեղ՝ Ի՞նչը կարող է պատճառ դառնալ, որ Chrome-ը ցանց տրամադրի::ERR_FAILED քեշավորված բովանդակության վրա` ընդդեմ localhost-ի սերվերի: Կան բոլոր տեսակի բաներ, որոնք կարող են առաջացնել CORS սխալներ (երբեմն նույնիսկ չգրանցվել): դրանք որպես CORS սխալներ) և այն կարող է հայտնվել բոլոր տեսակի վայրերից: Իրական խնդիրը լավագույնս կարելի է գտնել՝ փորփրելով ձեր գերանները: (Նշում. այս պատասխանը ցույց է տալիս, թե ինչպես տեղադրել ձեր Django տեղեկամատյանները ֆայլերում , որը դուք հավանաբար պետք է անեք Django REST-ի ստանդարտ գործարկման տեղեկամատյանները կպարունակեն օգտակար տեղեկություններ)

    Քայլ առաջինը տեսնելն է, թե արդյոք կոնկրետ հարցումն ընդհանրապես հարվածում է ձեր Django տեղեկամատյաններին: Եթե ​​դա այդպես է, ապա խնդիրը Django-ում ձեր CORS կարգավորումներն են: Դուք կարող եք հեշտությամբ ասել, թե ինչու է այն մերժվում, քանի որ Django-ն կունենա ամբողջությամբ որակավորված (MYSUBDOMAIN.example.com) տիրույթը, որը նա մերժել է գրանցամատյանում: Սա հեշտացնում է ձեր Django կարգավորումների փոփոխությունը. պարզապես ավելացրեք մերժված տիրույթը ձեր թույլատրված սկզբնաղբյուրներին:

    Նշում․

    Այնուամենայնիվ, ես միշտ կարգաբերել եմ այս խնդիրը Apach2-ում Ubuntu-ում: Այսպիսով, ես ունեի գրանցամատյան /var/log/apache2-ում, որը ցույց էր տալիս, թե կոնկրետ որ տիրույթն է մերժվում և ինչու: (Երբ Apache-ն մերժեց հարցումը. եթե դուք վեբ սերվեր եք դնում Django-ի դիմաց, այն նույնպես հավանաբար կունենա CORS քաղաքականություններ և պլագիններ) Եթե դուք օգտագործում եք ngnix docker-ում, ապա հետևյալ հարցը (Որտե՞ղ են հոսթում պահվող docker nginx կոնտեյների մատյանները) առաջարկում է օգտագործել այս հրամանը: տող հրաման՝ գրանցամատյանների ֆայլերը դոկերից դուրս բերելու և տեսնելու, թե ինչ են նրանք անում:

    docker inspect --format='{{.LogPath}}' <nginx-containter-id>
    

    Ես անձամբ հաճախ ավարտում եմ հրամանի տողից Docker-ի օրինակը բեռնելը և այն կարգաբերելու համար BASH հուշում: Այդ մասին խորհուրդը դուրս է այս հարցի շրջանակից:

    Մի քայլ առաջ գնալով՝ հնարավոր է, որ CORS քաղաքականության այս խնդիրն ավելի հեռուն լինի ձեր ցանցի ցանցից: Կան դեպքեր, երբ անվտանգության կանոնների սխալ կազմաձևումը, վատ վերահղումները կամ ենթակառուցվածքի հետ կապված այլ խնդիրներ Chrome-ը սխալ է ընկալում որպես CORS-ի խնդիրներ: CORS-ի մեկնաբանությունը որոշ դեպքերում նույնիսկ կարող է բրաուզերի կազմաձևման խնդիր լինել: Երբեմն ես բացել եմ վիրտուալ մեքենա՝ Chrome-ում իմ անվտանգության մակարդակները բացարձակ նվազագույնի սահմանելու և փորձել, պարզապես տեսնելու համար, թե արդյոք CORS-ն իրոք խնդիրն էր:

    Երբեմն դա չէր: Երբեմն պատահում էր, որ մեկ այլ բան՝ բեռի հավասարակշռող սարք, firewall, սխալ կազմաձևված AWS անվտանգության խումբ, մեղավոր էր:

    Այսպիսով, այո, սա փորելը կարող է լինել ավելի շատ վրիպակների սաֆարի, քան պարզ որս: Բայց հիմնական բանը, որը պետք է ստուգել առաջինն այն է, թե արդյոք ձեր Django տեղեկամատյանները որևէ REST հարցումից հետո որևէ բան են թքում: Եթե ​​նրանք չեն, դուք պետք է բարձրացնեք շղթան, քանի որ դուք ընդհանրապես չեք խոսում Ջանգոյի հետ:

    Ահ, ևս մեկ նշում. մենք ստանում ենք CORS սխալներ, երբ Django-ն չի կարողանում գրել իր մատյան ֆայլերում:

    07.05.2021
  • Գաղափար չկա, թե ինչու է սա մերժվել: Այն կրկնում է որոշ այլ պատասխաններ, բայց դրանք ամբողջական չեն նրանով, որ չեն լուսաբանում, որ CORS-ը հաճախ ոչ ճշգրիտ պիտակ է: Ես շաբաթներ եմ ծախսել՝ փորփրելով այն բաները, որոնք Chrome-ն անվանում էր CORS խնդիրներ Django-ում. նրանք հաճախ CORS կամ Django չեն, բայց ինչ-որ տեղ թաղված են ՕՀ-ում: 09.05.2021

  • 9

    Վստա՞հ եք, որ CORS_ALLOW_HEADERS-ը թույլ է տալիս սահմանել «*»:

    Այստեղից ելնելով, թվում է, թե այն նախատեսված է երկարացնելու, այլ ոչ թե փոխարինելու համար. "nofollow noreferrer">https://github.com/adamchainz/django-cors-headers/blob/2d22268ff59aa0b79820ea5b8983efd1e514ec4c/README.rst#cors_allow_headers-ը նույնպես պետք է երկարաձգվի, քան կարծում եմ, որ սա փորձարկելու համար պետք է փոխարինվել է

    Ես կառաջարկեի փորձել դա լռելյայն կամ փորձել երկարացնել վերը նշված հղումից

    Կարծում եմ, որ դա գրադարանին հատուկ արժեք է, այլ ոչ բրաուզերի կամ CORS արժեքի հարցում

    խմբագրել. ավելացվել է github.com-ի փորձնական հղումը

    02.05.2021
  • ['*']-ը 1 տողի հաջորդականություն է (ենթատեսակ. ցուցակ): 02.05.2021

  • 10

    Ինչպես բացատրվում է այստեղ, CORS Access-Control-Allow-Origin գիծը սպասվում է մեկում այս երկու ձևաչափերը.

    Թույլ տվեք ամեն ինչ. հավանաբար ոչ այն, ինչ ուզում եք

    Access-Control-Allow-Origin: *
    

    Թույլատրել մեկ կոնկրետ ծագում.

    Access-Control-Allow-Origin: [SCHEME]://[HOST]:[PORT_OPTIONAL]
    

    Սխեման. AKA արձանագրություն, սա կարող է լինել HTTP, HTTPS: Հոսթ. Սա պետք է ճշգրտորեն համընկնի հայցվող ծագման հետ, ուստի subdomain.domain.com կամ domain.com նավահանգիստ՝ [կամընտիր, բայց կարևոր է ձեզ համար] Նավահանգիստը դուրս թողնելը նույնն է, ինչ լռելյայն պորտը դնելը:80, եթե ձեր սխեման HTTP է և :443 եթե ձեր սխեման HTTPS է:

    Նաև https://example.com սերվերը, որին դուք հարցում եք անում, պետք է կիրառի CORS՝ ձեր վեբ կայքից Սկրիպտ տրամադրելու համար: Ձեր սկրիպտը չի կարող իրեն այլ կայք մուտք գործելու թույլտվություն տալ:

    Ես օգտագործել եմ CORS ընդլայնում, որը կոչվում է թույլատրել- cors-access-control chrome web store-ից:

    Կամ, Դուք կարող եք օգտագործել փոփոխության ծագման քրոմի փլագինը, ինչպիսին է սա.

    Moesif Orign & CORS Changer

    Դուք կարող եք այնպես անել, որ ձեր տեղական մշակողի սերվերը (ex: localhost:8080) թվա, որ գալիս է 172.16.1.157:8002-ից կամ որևէ այլ տիրույթից:

    02.05.2021
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..