জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্কে আমি কীভাবে CORS সক্ষম করতে পারি


107

আমি কীভাবে আমার জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্কে CORS সক্ষম করতে পারি? রেফারেন্স অনেক সাহায্য করেন না, এটা বলে যে, আমি একজন মিডলওয়্যার করে করতে পারেন, কিন্তু আমি কিভাবে যে কি করতে পারেন?

উত্তর:


162

আপনার প্রশ্নে আপনি যে লিঙ্কটি উল্লেখ করেছেন তা ব্যবহার করার পরামর্শ দেয় django-cors-headers, যার ডকুমেন্টেশনটি লাইব্রেরি ইনস্টল করার জন্য বলে

pip install django-cors-headers

এবং তারপরে এটি আপনার ইনস্টলড অ্যাপ্লিকেশনগুলিতে যুক্ত করুন:

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

প্রতিক্রিয়াগুলি শোনার জন্য আপনাকে মিডলওয়্যার ক্লাস যুক্ত করতে হবে:

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

বিভিন্ন সেটিংসে বিশেষ মনোযোগ দিয়ে দয়া করে এর ডকুমেন্টেশনের কনফিগারেশন বিভাগটি ব্রাউজ করুনCORS_ORIGIN_ । আপনার প্রয়োজনের ভিত্তিতে আপনাকে সেগুলির মধ্যে কিছু সেট করতে হবে।


4
নতুন নির্ভরতা ইনস্টল করার প্রয়োজন ছাড়াই আপনি কী এটি করার অন্য কোনও উপায় জানেন? আমি এখন একটি মিডওয়্যারের ক্লাস তৈরি করার চেষ্টা করছি
জুলিও মেরিনস

4
@ জুলিওমারিনস, আপনি যখন 12 টি রিলিজ, 21 অবদানকারী, 800 টিরও বেশি ও 100 টিরও বেশি কাঁটাচামচ সহ সহজেই উপলব্ধ এবং সহজেই ইনস্টলযোগ্য হবে তখন আপনি নিজের সংস্করণটি কেন লিখবেন?
ক্রিস

4
আপনার কাছে সত্যই একটি বক্তব্য রয়েছে, তবে যেহেতু একটি সরল সিওআরএসের একমাত্র প্রয়োজন শিরোনাম তাই Access-Control-Allow-Origin: *আমি কেন পুরো জিনিসটি লোড করি না, তাই আমি আপনার উত্তরে এটি করার জন্য আরও একটি উপায় রাখব যাতে উভয় পদ্ধতিই উপলব্ধ থাকে। উল্লেখ: [লিঙ্ক (] সক্ষম-cors.org/server.html )
জুলিও মেরিন্স

4
@ জুলিওমারিনস, এটিই হবে স্লেজহ্যামার পদ্ধতি approach আমি যে কনফিগারেশন লিঙ্কটি দিয়েছি তা যদি আপনি তাকান তবে আপনি দেখতে পাবেন যে এটির django-cors-headersচেয়ে অনেক বেশি নমনীয়। আপনি যদি নিজের ক্লাস তৈরি করতে পছন্দ করেন তবে আমার অতিথি হোন। তবে আমি সেই লাইব্রেরিটি ব্যবহার করব।
ক্রিস

4
@ ক্রিস আমি মনে করি আপনার CORS_ORIGIN_WHITELIST যুক্ত করা উচিত যাতে আপনি কলিং হোস্টটিকে হোয়াইটলিস্ট করতে পারেন।
হাকিম

68
pip install django-cors-headers

এবং তারপরে এটি আপনার ইনস্টলড অ্যাপ্লিকেশনগুলিতে যুক্ত করুন:

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

প্রতিক্রিয়াগুলি শোনার জন্য আপনাকে মিডলওয়্যার ক্লাস যুক্ত করতে হবে:

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

CORS_ORIGIN_ALLOW_ALL = True # If this is used then `CORS_ORIGIN_WHITELIST` will not have any effect
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = [
    'http://localhost:3030',
] # If this is used, then not need to use `CORS_ORIGIN_ALLOW_ALL = True`
CORS_ORIGIN_REGEX_WHITELIST = [
    'http://localhost:3030',
]

আরও বিশদ: https://github.com/ottoyiu/django-cors-headers/# কনফিগারেশন

অফিসিয়াল ডকুমেন্টেশন পড়ুন প্রায় সমস্ত সমস্যা সমাধান করতে পারে


4
আপনার জন্য ক্রিসের উত্তরটিতে যুক্ত হওয়া চারটি লাইন যুক্ত করা আমার পক্ষে এটি কাজ করার জন্য প্রয়োজনীয় ছিল।
ম্যাট ডি

4
কেন CORS_ORIGIN_ALLOW_ALL = True, তবে CORS_ORIGIN_WHITELISTএখনও সেট করা আছে? দস্তাবেজগুলি মনে হয় এটি দেখে মনে হচ্ছে এটি এর প্রয়োজন নেই এবং উত্তরটির জন্য বিভ্রান্তিকর বলে মনে হচ্ছে।
ফিনিক্স

CORS_ORIGIN_ALLOW_ALL যদি সত্য হয় তবে শ্বেত তালিকাটি ব্যবহার করা হবে না এবং সমস্ত উত্স গ্রহণ করা হবে।
BjornW

4
এছাড়াও 'corsheaders.middleware.CorsMiddleware',তালিকার শীর্ষে থাকা উচিত মনে রাখবেন অন্যথায় সংযোগটি নামার আগে তা প্রত্যাখ্যান করা যেতে পারে।
সেবাস্তিয়ান ভ্যানস্টিনকিস্তে

16

সেরা বিকল্পটি প্যাকেজের পরীক্ষিত পদ্ধতির ব্যবহার করা হচ্ছে তা জেনেও আপনি একটি কাস্টম মিডলওয়্যার ব্যবহার করে করতে পারেন django-cors-headers। যা বলেছিল, এখানেই সমাধান:

নিম্নলিখিত কাঠামো এবং ফাইলগুলি তৈরি করুন:

- myapp/middleware/__init__.py

from corsMiddleware import corsMiddleware

- myapp/middleware/corsMiddleware.py

class corsMiddleware(object):
    def process_response(self, req, resp):
        resp["Access-Control-Allow-Origin"] = "*"
        return resp

যোগ settings.pyহিসাবে চিহ্নিত লাইন:

MIDDLEWARE_CLASSES = (
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",

    # Now we add here our custom middleware
     'app_name.middleware.corsMiddleware' <---- this line
)

ধন্যবাদ জুলিও! আপনার মিডলওয়্যার কোডটি @ মাসনুন কোড নমুনার সাথে আপডেট করা উচিত। এছাড়াও, আমদানি আমার পক্ষে কাজ করে না, আমদানি করে। ইস্যুটি সমাধান করে: from . import corsMiddleware
পাভেল ডায়নায়ক

14

যদি কেউ এই প্রশ্নে ফিরে আসে এবং তাদের নিজস্ব মিডলওয়্যারটি লেখার সিদ্ধান্ত নিয়েছে তবে এটি জাঙ্গোর নতুন স্টাইলের মিডলওয়্যারের জন্য একটি কোড নমুনা -

class CORSMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        response["Access-Control-Allow-Origin"] = "*"

        return response

7

জাজানো সংস্করণ> ১.১০ এর জন্য ডকুমেন্টেশন অনুসারে একটি কাস্টম মিডলওয়্যার একটি ফাংশন হিসাবে লেখা যেতে পারে, আসুন ফাইলটিতে বলা যাক: yourproject/middleware.py(এর ভাইবোন হিসাবে settings.py):

def open_access_middleware(get_response):
    def middleware(request):
        response = get_response(request)
        response["Access-Control-Allow-Origin"] = "*"
        response["Access-Control-Allow-Headers"] = "*"
        return response
    return middleware

এবং পরিশেষে, এই প্রকল্পের অজগর পথটি (আপনার প্রকল্পের মূলটি অন্তর্ভুক্ত করুন) আপনার প্রকল্পের মিডলওয়্যার তালিকায় যুক্ত করুন settings.py:

MIDDLEWARE = [
  .
  .
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
  'yourproject.middleware.open_access_middleware'
]

সহজ কিছু!


এর আগে পোস্ট করা পদ্ধতিটি MIDDLEWARE_CLASSES ব্যবহার করে, মিডল নেই not এই কৌশলটি কাজ করে তাই ডাউনটাভোটের জন্য বন্ধ ছিল :) :) জুলিওমারিনস
ধ্রুব বাথেজা

4
ডুড, সমাধান একই। আপনি জ্যাঙ্গো সংস্করণে প্রয়োগের বিষয়ে তর্ক করছেন। আপনার কোডটি ভুল ইনডেন্টেশন সহ রয়েছে open_access_middleware
জুলিও মেরিন্স

4

ভাল, আমি ছেলেদের জানি না তবে:

এখানে পাইথন ৩.6 এবং জ্যাঙ্গো ২.২ ব্যবহার করে

MIDDLEWARE_CLASSES এর নাম পরিবর্তন করে MIDDLEWARE এ সেটিংস.পি কাজ করেছে py


4

নীচে কোনও বাহ্যিক মডিউলগুলির প্রয়োজন ছাড়াই কাজের পদক্ষেপগুলি দেওয়া হল:

পদক্ষেপ 1: আপনার অ্যাপে একটি মডিউল তৈরি করুন।

উদাহরণস্বরূপ, ধরে নিই আমাদের কাছে ইউজার_রেগেশন_এপ নামে একটি অ্যাপ রয়েছে । ব্যবহারকারী_ নিবন্ধকরণ_এ্যাপ অন্বেষণ করুন এবং একটি নতুন ফাইল তৈরি করুন।

একে কাস্টম_কর্স_মিডালওয়্যার.পি হিসাবে কল করুন

নীচের শ্রেণীর সংজ্ঞাটি আটকে দিন:

class CustomCorsMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)
        response["Access-Control-Allow-Origin"] = "*"
        response["Access-Control-Allow-Headers"] = "*"

        # Code to be executed for each request/response after
        # the view is called.

        return response

পদক্ষেপ 2: একটি মিডওয়্যারের নিবন্ধন করুন

আপনার প্রজেক্টস সেটিংস.পি ফাইল এ, এই লাইনটি যুক্ত করুন

'ব্যবহারকারীর রেজিস্ট্রেশন_এপ.কাস্টম_কার্স_মিডলওয়ার.কাস্টমকর্সমিডলওয়্যার'

যেমন:

  MIDDLEWARE = [
        'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
         ...
        'django.middleware.common.CommonMiddleware',

    ]

প্রতিস্থাপন করতে মনে রাখুন user_registration_app যেখানে আপনি আপনার custom_cors_middleware.py মডিউল তৈরি করেছেন আপনার অ্যাপের নাম দিয়ে।

আপনি এখন যাচাই করতে পারেন এটি প্রকল্পের সমস্ত দর্শনগুলিতে প্রয়োজনীয় প্রতিক্রিয়া শিরোনাম যুক্ত করবে!


ধন্যবাদ! আমি অ্যাক্সেস-নিয়ন্ত্রণ-অনুমতি-শিরোনাম শিরোনাম অনুপস্থিত ছিল।
ড্যান

0

জ্যাঙ্গো = 2.2.12 জ্যাঙ্গো-কর্স-শিরোনাম = 3.2.1 জ্যাঙ্গোরস্ট্রেফ্র্যাম্ক = 3.11.0

সরকারী নির্দেশনা অনুসরণ করুন কাজ করে না

শেষ পর্যন্ত এটি বের করার জন্য পুরানো উপায়টি ব্যবহার করুন।

যোগ করুন:

# proj/middlewares.py
from rest_framework.authentication import SessionAuthentication


class CsrfExemptSessionAuthentication(SessionAuthentication):

    def enforce_csrf(self, request):
        return  # To not perform the csrf check previously happening

#proj/settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'proj.middlewares.CsrfExemptSessionAuthentication',
    ),
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.