Thứ tự MIDDLEWARE quyết định thứ tự bao bọc — middleware ở top chạy đầu tiên trên request và cuối cùng trên response. Đặt sai thì middleware sau không thấy thứ middleware trước đã set, hoặc tệ hơn là check security bị bypass.
Thứ tự mặc định của Django, kèm lý do:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', # HTTPS redirect sớm nhất
'django.contrib.sessions.middleware.SessionMiddleware', # set request.session
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', # cần session đã set
'django.contrib.auth.middleware.AuthenticationMiddleware', # set request.user, cần session
'django.contrib.messages.middleware.MessageMiddleware', # cần session
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]Hai bug điển hình: đặt AuthenticationMiddleware trước SessionMiddleware thì request.user luôn là AnonymousMiddleware vì không đọc được session. Đặt logger custom trước SecurityMiddleware thì log nhận luôn cả request đáng lẽ bị redirect HTTPS.
Quy tắc đơn giản: custom middleware đụng request.user phải đặt sau AuthenticationMiddleware; đụng request.session phải sau SessionMiddleware. Nếu có dependency lẫn nhau, viết comment ngắn ngay trong settings.py để người sau không vô tình đổi thứ tự.