मैं django में प्रतिसाद निषिद्ध कैसे बढ़ाऊं


168

मैं निम्नलिखित करना चाहूंगा:

raise HttpResponseForbidden()

लेकिन मुझे त्रुटि मिलती है:

exceptions must be old-style classes or derived from BaseException, not HttpResponseForbidden

मुझे यह कैसे करना चाहिए?

जवाबों:


183

किसी अन्य प्रतिक्रिया के रूप में इसे उस दृश्य से लौटाएं।

from django.http import HttpResponseForbidden

return HttpResponseForbidden()

30
क्यों एक अपवाद वर्ग मौजूद है Http404लेकिन नहीं Http403? असंगति क्यों?
फ्लिम

@Flimm stackoverflow.com/questions/3297048/... rest_framework आयात स्थिति status.HTTP_403_FORBIDDEN से 403: मुझे यकीन है कि Django के बारे में नहीं हूँ, लेकिन Django बाकी फ्रेमवर्क है
डेविड वाटसन

15
वास्तव में उपयोग raise PermissionDeniedकरने से आपको अपने कस्टम 403 दृश्य
निर्देशित जूल

376

यदि आप एक अपवाद उठाना चाहते हैं, जिसका आप उपयोग कर सकते हैं:

from django.core.exceptions import PermissionDenied

def your_view(...):
    raise PermissionDenied()

यह यहाँ प्रलेखित है:

https://docs.djangoproject.com/en/stable/ref/views/#the-403-http-forbidden-view

के रूप में returing करने का विरोध किया HttpResponseForbidden, ऊपर उठाने PermissionDeniedका उपयोग कर त्रुटि प्रदान करने का कारण बनता है 403.htmlटेम्पलेट, या आप मिडलवेयर का उपयोग एक कस्टम दृश्य "निषिद्ध" दिखाने के लिए कर सकते हैं।


2
क्या हम PermissionDenied में एक कस्टम संदेश जोड़ सकते हैं?
एजे

2
जैक, हाँ आप कर सकते हैं - कुछ ऐसा करें: PermissionDenied ("उपयोगकर्ता में कोई लॉग इन नहीं किया गया"
बढ़ाएँ

1
निश्चित नहीं है कि यह मायने रखता है, लेकिन डॉक्स कहते throw PermissionDeniedहैं कि फ़ंक्शन कॉल के रूप में नहीं, ()अंत में बिना ।
15

2
HttpResponseForbidden पर इस का उपयोग करने का क्या फायदा है?
फ्लिेम

3
@ फ़ीलम: यह स्वचालित रूप से मिडलवेयर स्तर पर 403 को ट्रिगर करता है, जिससे आप अपने कस्टम "फॉरबिडन" दृश्य को दिखा सकते हैं।
ऑर्गेनिक

11

आप वैकल्पिक रूप से 403 HTTP त्रुटियों के प्रतिपादन को नियंत्रित करने के लिए "403.html" नामक एक कस्टम टेम्पलेट की आपूर्ति कर सकते हैं।

जैसा कि @ dave-halter द्वारा सही ढंग से बताया गया है, 403 टेम्पलेट का उपयोग केवल तभी किया जा सकता है जब आप PermissionDenied बढ़ाते हैं

नीचे एक नमूना दृश्य है जिसका उपयोग कस्टम टेम्प्लेट "403.html", "404.html" और "500.html" का परीक्षण करने के लिए किया जाता है; कृपया प्रोजेक्ट की सेटिंग में DEBUG = गलत सेट करना सुनिश्चित करें या फ्रेमवर्क 404 और 500 के बजाय एक ट्रेसबैक दिखाएगा।

from django.http import HttpResponse
from django.http import Http404
from django.core.exceptions import PermissionDenied


def index(request):

    html = """
<!DOCTYPE html>
<html lang="en">
  <body>
    <ul>
        <li><a href="/">home</a></li>
        <li><a href="?action=raise403">Raise Error 403</a></li>
        <li><a href="?action=raise404">Raise Error 404</a></li>
        <li><a href="?action=raise500">Raise Error 500</a></li>
    </ul>
  </body>
</html>
"""

    action = request.GET.get('action', '')
    if action == 'raise403':
        raise PermissionDenied
    elif action == 'raise404':
        raise Http404
    elif action == 'raise500':
        raise Exception('Server error')

    return HttpResponse(html)

2
यह काम नहीं करता। 403 टेम्प्लेट का उपयोग केवल तभी किया जा सकता है, जब आप PermissionDenied बढ़ाते हैं।
डेव हाल्टर

शुक्रिया @ dave-halter, your right मैंने इसे ठीक करने के लिए अपनी टिप्पणी अपडेट की।
मारियो ऑरलैंडी

2

इस तरीके को आज़माएं, त्रुटि के साथ संदेश भेज रहा है

from django.core.exceptions import PermissionDenied
raise PermissionDenied("You do not have permission to Enter Clients in Other Company, Be Careful")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.