Saya telah mengomentari prosesor csrf dan baris middleware di settings.py
:
122
123 TEMPLATE_CONTEXT_PROCESSORS = (
124 'django.contrib.auth.context_processors.auth',
125 # 'django.core.context_processors.csrf',
126 'django.core.context_processors.request',
127 'django.core.context_processors.static',
128 'cyathea.processors.static',
129 )
130
131 MIDDLEWARE_CLASSES = (
132 'django.middleware.common.CommonMiddleware',
133 'django.contrib.sessions.middleware.SessionMiddleware',
134 # 'django.middleware.csrf.CsrfViewMiddleware',
135 'django.contrib.auth.middleware.AuthenticationMiddleware',
136 'django.contrib.messages.middleware.MessageMiddleware',
137 'django.middleware.locale.LocaleMiddleware',
138 # Uncomment the next line for simple clickjacking protection:
139 # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
140 )
Tetapi ketika saya menggunakan Ajax untuk mengirim permintaan, Django masih menjawab 'token csrf tidak benar atau hilang', dan setelah menambahkan X-CSRFToken ke tajuk, permintaan akan berhasil.
Apa yang terjadi disini ?
Jawaban:
Jika Anda hanya membutuhkan beberapa tampilan untuk tidak menggunakan CSRF, Anda dapat menggunakan
@csrf_exempt
:Anda dapat menemukan lebih banyak contoh dan skenario lainnya dalam dokumentasi Django:
sumber
@csrf_exemp
berfungsi seperti yang saya gunakan baru-baru ini tanpa masalah. Semoga Anda menemukan jawabannya.Untuk menonaktifkan CSRF untuk tampilan berbasis kelas, berikut ini berfungsi untuk saya.
Menggunakan django 1.10 dan python 3.5.2
sumber
Di
setting.py
MIDDLEWARE Anda cukup menghapus / mengomentari baris ini:sumber
Untuk Django 2 :
Middleware itu harus ditambahkan
settings.MIDDLEWARE
jika sesuai (dalam pengaturan pengujian Anda misalnya).Catatan: pengaturan tidak dipanggil
MIDDLEWARE_CLASSES
lagi.sumber
Jawabannya mungkin tidak tepat, tapi saya harap ini membantu Anda
Memiliki middleware seperti ini membantu untuk men-debug permintaan dan memeriksa csrf di server produksi.
sumber
Masalahnya di sini adalah SessionAuthentication melakukan validasi CSRF-nya sendiri. Itulah mengapa Anda mendapatkan kesalahan CSRF yang hilang bahkan ketika CSRF Middleware diberi komentar. Anda dapat menambahkan @csrf_exempt ke setiap tampilan, tetapi jika Anda ingin menonaktifkan CSRF dan memiliki otentikasi sesi untuk seluruh aplikasi, Anda dapat menambahkan middleware tambahan seperti ini -
Saya membuat kelas ini di myapp / middle.py Kemudian impor middleware ini di Middleware di settings.py
Itu bekerja dengan DRF pada django 1.11
sumber
Jika Anda ingin menonaktifkannya di Global, Anda dapat menulis middleware kustom, seperti ini
lalu tambahkan kelas ini
youappname.middlewarefilename.DisableCsrfCheck
keMIDDLEWARE_CLASSES
daftar, sebelumnyadjango.middleware.csrf.CsrfViewMiddleware
sumber
CSRF dapat diterapkan pada tingkat tampilan, yang tidak dapat dinonaktifkan secara global .
Dalam beberapa kasus ini menyebalkan, tapi um, "ini untuk keamanan". Harus mempertahankan peringkat AAA itu.
https://docs.djangoproject.com/en/dev/ref/csrf/#contrib-and-reusable-apps
sumber
@WoooHaaaa beberapa paket pihak ketiga menggunakan middleware 'django.middleware.csrf.CsrfViewMiddleware'. misalnya saya menggunakan django-rest-oauth dan saya memiliki masalah seperti Anda bahkan setelah menonaktifkannya. mungkin paket ini menanggapi permintaan Anda seperti kasus saya, karena Anda menggunakan dekorator otentikasi dan sesuatu seperti ini.
sumber