ฉันจะเปิดใช้งาน CORS บน Django REST Framework ได้อย่างไร การอ้างอิงไม่ได้ช่วยอะไรมากนักมันบอกว่าฉันสามารถทำได้โดยมิดเดิลแวร์ แต่ฉันจะทำเช่นนั้นได้อย่างไร
ฉันจะเปิดใช้งาน CORS บน Django REST Framework ได้อย่างไร การอ้างอิงไม่ได้ช่วยอะไรมากนักมันบอกว่าฉันสามารถทำได้โดยมิดเดิลแวร์ แต่ฉันจะทำเช่นนั้นได้อย่างไร
คำตอบ:
ลิงก์ที่คุณอ้างถึงในคำถามของคุณแนะนำให้ใช้django-cors-headers
ซึ่งมีเอกสารระบุว่าให้ติดตั้งไลบรารี
pip install django-cors-headers
จากนั้นเพิ่มลงในแอพที่คุณติดตั้ง:
INSTALLED_APPS = (
...
'corsheaders',
...
)
คุณจะต้องเพิ่มคลาสมิดเดิลแวร์เพื่อรับฟังคำตอบ:
MIDDLEWARE_CLASSES = (
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
โปรดเรียกดูส่วนการกำหนดค่าของเอกสารประกอบโดยให้ความสนใจเป็นพิเศษกับการCORS_ORIGIN_
ตั้งค่าต่างๆ คุณจะต้องตั้งค่าบางส่วนตามความต้องการของคุณ
Access-Control-Allow-Origin: *
ฉันไม่เห็นว่าทำไมต้องโหลดทั้งหมดฉันจะใส่วิธีอื่นในการตอบคำถามของคุณเพื่อให้ทั้งสองวิธีสามารถใช้ได้ อ้างอิง: [link (] enable-cors.org/server.html )
django-cors-headers
มีความยืดหยุ่นมากกว่านั้นมาก หากคุณต้องการสร้างชั้นเรียนของคุณเองเป็นแขกของฉัน แต่ฉันจะใช้ห้องสมุดนั้น
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/#configuration
อ่านเอกสารอย่างเป็นทางการสามารถแก้ไขปัญหาได้เกือบทั้งหมด
CORS_ORIGIN_ALLOW_ALL = True
แต่CORS_ORIGIN_WHITELIST
ยังคงตั้งค่าอยู่? เอกสารดูเหมือนจะไม่จำเป็นต้องใช้และดูเหมือนจะสับสนสำหรับคำตอบที่นี่
'corsheaders.middleware.CorsMiddleware',
ต้องอยู่ด้านบนสุดของรายการมิฉะนั้นการเชื่อมต่ออาจถูกปฏิเสธก่อนที่จะไปถึง
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
ในกรณีที่ใครก็ตามกลับมาที่คำถามนี้และตัดสินใจที่จะเขียนมิดเดิลแวร์ของตัวเองนี่คือตัวอย่างโค้ดสำหรับมิดเดิลแวร์สไตล์ใหม่ของ Django -
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
สำหรับ Django เวอร์ชัน> 1.10 ตามเอกสารประกอบ MIDDLEWARE ที่กำหนดเองสามารถเขียนเป็นฟังก์ชันได้สมมติว่าในไฟล์: 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
และสุดท้ายเพิ่มเส้นทาง python ของฟังก์ชันนี้ (เขียนรูทของโปรเจ็กต์ของคุณ) ไปยังรายการ MIDDLEWARE ในโปรเจ็กต์ของคุณsettings.py
:
MIDDLEWARE = [
.
.
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'yourproject.middleware.open_access_middleware'
]
peasy ง่าย!
open_access_middleware
ด้วย
ด้านล่างนี้เป็นขั้นตอนการทำงานโดยไม่ต้องใช้โมดูลภายนอกใด ๆ :
ขั้นตอนที่ 1:สร้างโมดูลในแอปของคุณ
เช่นสมมติว่าเรามีแอปชื่อuser_registration_app user_registration_appสำรวจ user_registration_app และสร้างไฟล์ใหม่
ให้เรียกสิ่งนี้ว่า custom_cors_middleware.py
วางคำจำกัดความของคลาสด้านล่าง:
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:ลงทะเบียนมิดเดิลแวร์
ในไฟล์ settings.py โปรเจ็กต์ของคุณให้เพิ่มบรรทัดนี้
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware'
เช่น:
MIDDLEWARE = [
'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
...
'django.middleware.common.CommonMiddleware',
]
อย่าลืมแทนที่user_registration_appด้วยชื่อแอปของคุณที่คุณสร้างโมดูล custom_cors_middleware.py
ตอนนี้คุณสามารถตรวจสอบได้ว่าจะเพิ่มส่วนหัวการตอบกลับที่จำเป็นในมุมมองทั้งหมดในโครงการ!
ฉันไม่รู้จักผู้ชาย แต่:
โดยใช้ python 3.6 และ django 2.2 ที่นี่
เปลี่ยนชื่อ MIDDLEWARE_CLASSES เป็น MIDDLEWARE ใน settings.py ใช้งานได้
Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 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',
),
}