Tôi nghĩ bạn nên cung cấp mã cách bạn nhận mã thông báo csrf trong mã HTML/JS và cài đặt cho phần giữa của bạn.
Trước hết, bạn nên kiểm tra xem django.middleware.csrf.CsrfViewMiddleware
có được bật hay không.
Tôi gặp sự cố tương tự, khi ở mã python tôi đã sử dụng request.META.get('CSRF_COOKIE')
để nhận mã thông báo.
Khi bạn sử dụng mã thông báo này trong mẫu - {% csrf_token %}
Django lưu ý rằng mã thông báo được hiển thị và đặt Cookie theo số CsrfViewMiddleware.process_response
. Nếu bạn nhận được giá trị mã thông báo theo cách khác, Django sẽ bỏ lỡ lá cờ này. Vì vậy, nó sẽ tạo cho bạn một mã thông báo nhưng sẽ không đặt cookie tương ứng.
Tôi có 2 cách giải quyết trong mã. Bạn nên thêm nó vào các khung nhìn của bạn được sử dụng để tạo các khuôn mẫu với mã JS.
1. Bạn có thể buộc Django để thiết lập CSRF Cookie:
# Force updating CSRF cookie
request.META["CSRF_COOKIE_USED"] = True
2. Django đặt CSRF_COOKIE_USED tự động nếu bạn gọi get_token
from django.middleware.csrf import get_token
# don't use direct access to request.META.get('CSRF_COOKIE')
# in this case django will NOT send a CSRF cookie. Use get_token function
csrf_token = get_token(request)
Mỗi một trong những giải pháp này nên hoạt động riêng. Tôi khuyên bạn nên sử dụng get_token
Đã xảy ra sự cố tương tự trước đây, liên quan đến trình trang trí csrf_protect.Nếu bạn đăng từ trang này đến url khác (ajax cho Ví dụ) và Nếu bạn đang sử dụng @csrf_protect decorator, hãy đảm bảo cả chế độ xem bạn đang đăng dữ liệu từ và url nhận dữ liệu bài đăng để có trình trang trí này. – sidarcy
chế độ xem của bạn, mẫu biểu mẫu của bạn? –