2025, Oct 31 11:32
Django में रीडायरेक्ट के बाद messages गायब होने की वजह और समाधान
जानें क्यों Django में रीडायरेक्ट के बाद messages गायब हो जाते हैं: messages.get_messages कतार को पहले खपा देता है। डिबगिंग व सही व्यू लॉजिक से लॉगिन त्रुटि दिखाएं.
रीडायरेक्ट के बाद Django के संदेश (messages) दिखाई न देना बेहद झुंझलाहट पैदा कर सकता है, खासकर तब जब बाकी सब कुछ सही लग रहा हो। यदि आपकी लॉगिन व्यू गलत क्रेडेंशियल्स पर messages.error कॉल करती है, लेकिन लॉगिन पेज पर चेतावनी कभी दिखती ही नहीं, तो एक सूक्ष्म जाल है जो टेम्पलेट तक पहुँचने से पहले ही संदेश को मिटा देता है।
लक्षण
गलत क्रेडेंशियल्स सबमिट करने के बाद ऐप लॉगिन स्क्रीन पर वापस रीडायरेक्ट करता है, पर अपेक्षित त्रुटि बैनर गायब रहता है। सर्वर लॉग सामान्य प्रवाह दिखाते हैं—POST पर 302 मिलता है, उसके बाद लॉगिन पेज का GET।
समस्या पैदा करने वाला कोड उदाहरण
समस्या उस व्यू लॉजिक में छिपी है जो डिबगिंग के दौरान message queue को जाँचता है। भले ही messages फ्रेमवर्क और टेम्पलेट सेटअप ठीक हों, केवल एक पंक्ति Django को समय से पहले message storage खाली कर देने पर मजबूर कर देती है।
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.contrib import messages
import logging
def auth_view(req):
    logging.debug(f"Method: {req.method}")
    if req.method == 'POST':
        uname = req.POST['username']
        pwd = req.POST['password']
        logging.debug(f"BODY: {req.POST}")
        acct = authenticate(req, username=uname, password=pwd)
        if acct is not None:
            login(req, acct)
            logging.debug("OK: authenticated, redirecting to home")
            return redirect('home')
        else:
            messages.error(req, "Invalid username or password. Please try again.")
            logging.debug("FAIL: invalid credentials, flagging error")
            logging.debug(f"Messages: {list(messages.get_messages(req))}")
            return redirect('login')
    else:
        logging.debug("Render login page")
        return render(req, "registration/login.html", {})
ऐसा क्यों होता है
messages.get_messages(request) कॉल message storage से पढ़ती है और उसकी सामग्री का उपभोग कर लेती है। यह व्यवहार जानबूझकर है, ताकि संदेश एक बार दिखें और फिर साफ हो जाएँ। जब यह कॉल डिबगिंग के लिए व्यू के अंदर चलती है, तो रीडायरेक्ट पूरा होने से पहले ही कतार में लगी त्रुटि हट जाती है। इसके बाद टेम्पलेट खाली messages संग्रह के साथ रेंडर होता है।
समाधान
वह कोड हटा दें जो message storage को खाली कर देता है। पहले की तरह messages.error सेट करें और रीडायरेक्ट करें। संदेश रीडायरेक्ट के बाद भी बना रहेगा और टेम्पलेट के लिए उपलब्ध होगा।
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from django.contrib import messages
import logging
def auth_view(req):
    logging.debug(f"Method: {req.method}")
    if req.method == 'POST':
        uname = req.POST['username']
        pwd = req.POST['password']
        logging.debug(f"BODY: {req.POST}")
        acct = authenticate(req, username=uname, password=pwd)
        if acct is not None:
            login(req, acct)
            logging.debug("OK: authenticated, redirecting to home")
            return redirect('home')
        else:
            messages.error(req, "Invalid username or password. Please try again.")
            logging.debug("FAIL: invalid credentials, flagging error")
            return redirect('login')
    else:
        logging.debug("Render login page")
        return render(req, "registration/login.html", {})
यह क्यों मायने रखता है
वे डिबग स्टेटमेंट जो stateful API को छूते हैं, ऐप का व्यवहार अप्रत्याशित तरीकों से बदल सकते हैं। Django का messages फ्रेमवर्क single-consumption मॉडल अपनाता है, इसलिए लॉग स्टेटमेंट के हिस्से के रूप में कतार पढ़ना उसी डेटा को मिटा देता है जिसकी आप बाद में रेंडर होने की उम्मीद करते हैं। यह समझ होने पर टेम्पलेट या URL रूटिंग में गैर-मौजूद समस्याओं के पीछे घंटों भटकने से बचा जा सकता है।
सीख
यदि रीडायरेक्ट से पहले सेट किया गया संदेश दिखाई नहीं दे रहा है, तो सुनिश्चित करें कि व्यू में आप message queue पर इटरेशन या एक्सेस नहीं कर रहे हैं। संदेश सेट करें, रीडायरेक्ट करें, और उसे टेम्पलेट पर छोड़ दें। यही छोटा बदलाव अपेक्षित प्रवाह बहाल करता है और आपके लॉगिन UX को सुसंगत रखता है।
यह लेख StackOverflow के प्रश्न (लेखक: user31098877) और Mahrez BenHamad के उत्तर पर आधारित है।