Django में कस्टम मिडिलवेयर कैसे सेट करें


80

मैं एक स्थिति से मिलने वाले हर दृश्य के लिए वैकल्पिक रूप से एक kwarg पास करने के लिए मिडलवेयर बनाने की कोशिश कर रहा हूं।

समस्या यह है कि मुझे मिडलवेयर सेट अप करने का एक उदाहरण नहीं मिल रहा है। मैंने उन कक्षाओं को देखा है जो उस विधि को ओवरराइड करते हैं जो मैं करना चाहता हूं process_view:

Class CheckConditionMiddleware(object):  
    def process_view(self, request):  

        return None  

लेकिन मैं यह क्लास कहां लगाऊं? क्या मैं एक मिडलवेयर ऐप बनाता हूं और इस वर्ग को इसके अंदर रखता हूं और फिर इसे संदर्भित करता हूं settings.middleware?


2
आप यहाँ मेरे एक उत्तर का अनुसरण कर सकते हैं: stackoverflow.com/questions/17751163/…
Hieu Nguyen

जबकि यह एक बेहतरीन उत्तर है, आप
कार्तिकार

आप ऐसा कर सकते हैं: stackoverflow.com/questions/17751163/…
Atma

@karthrr आपके द्वारा दिया गया लिंक टूटा हुआ है: /
फेडोरक्वी 'SO रोकना नुकसान पहुँचा रहा है'

जवाबों:


139

पहला: पथ संरचना

यदि आपके पास यह नहीं है, तो आपको संरचना के बाद अपने ऐप के भीतर मिडलवेयर फ़ोल्डर बनाने की आवश्यकता है :

yourproject/yourapp/middleware

फ़ोल्डर मिडलवेयर को सेटिंगहोल्ड, यूआरएल, टेम्प्लेट के समान फ़ोल्डर में रखा जाना चाहिए ...

महत्वपूर्ण: मिडलवेयर फ़ोल्डर के अंदर __init__.py खाली फ़ाइल बनाना न भूलें ताकि आपका ऐप इस फ़ोल्डर को पहचान सके

दूसरा: मिडलवेयर बनाएं

अब हमें अपने कस्टम मिडलवेयर के लिए एक फ़ाइल बनानी चाहिए, इस उदाहरण में आइए हम एक मिडलवेयर चाहते हैं जो उपयोगकर्ताओं को उनके आईपी के आधार पर फ़िल्टर करें, हम इस कोड के साथ मिडलवेयर फ़ोल्डर के अंदर filter_ip_middleware.py नामक एक फ़ाइल बनाते हैं :

class FilterIPMiddleware(object):
    # Check if client IP is allowed
    def process_request(self, request):
        allowed_ips = ['192.168.1.1', '123.123.123.123', etc...] # Authorized ip's
        ip = request.META.get('REMOTE_ADDR') # Get client IP
        if ip not in allowed_ips:
            raise Http403 # If user is not allowed raise Error

       # If IP is allowed we don't do anything
       return None

तीसरा: हमारी 'सेटिंग' में मिडलवेयर जोड़ें

हमें देखने की जरूरत है:

  • MIDDLEWARE_CLASSES (django <1.10)
  • MIDDLEWARE (django> = 1.10)

सेटिंग्स के अंदर और वहां हमें अपना मिडलवेयर ( अंतिम स्थिति में जोड़ें ) जोड़ना होगा । यह इस तरह होना चाहिए:

MIDDLEWARE = ( #  Before Django 1.10 the setting name was 'MIDDLEWARE_CLASSES'
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
     # Above are django standard middlewares

     # Now we add here our custom middleware
     'yourapp.middleware.filter_ip_middleware.FilterIPMiddleware'
)

किया हुआ ! अब हर ग्राहक का प्रत्येक अनुरोध आपके कस्टम मिडलवेयर को कॉल करेगा और आपके कस्टम कोड को प्रोसेस करेगा!


क्या फ़ाइल के लिए रास्ता सही है? इसके बजाय यह आपके उत्पाद / Yourapp / मिडलवेयर नहीं होना चाहिए?
तियागोवर्ट

हाँ @tiagovrtr पथ होना चाहिए yourproject/yourapp/middleware। मुझे लगता है कि यह बहुत स्पष्ट था, लेकिन मैं इसे अपडेट कर दूंगा यदि आप इसे
हटा दें

11
इस उत्तर की जाँच करें यदि आप में भाग:TypeError: object() takes no parameters
टी। क्रिश्चियन

3

बस दो कदम। यह मेरे साथ काम करता है django2.1

1. अपने खुद के मिडलवेयर वर्ग का निर्माण करें।

आधिकारिक मैनुअल से एक अच्छा डेमो है।

https://docs.djangoproject.com/en/2.1/ref/request-response/#django.http.HttpRequest.get_host

    from django.utils.deprecation import MiddlewareMixin

    class MultipleProxyMiddleware(MiddlewareMixin):
        FORWARDED_FOR_FIELDS = [
            'HTTP_X_FORWARDED_FOR',
            'HTTP_X_FORWARDED_HOST',
            'HTTP_X_FORWARDED_SERVER',
        ]

        def process_request(self, request):
            """
            Rewrites the proxy headers so that only the most
            recent proxy is used.
            """
            for field in self.FORWARDED_FOR_FIELDS:
                if field in request.META:
                    if ',' in request.META[field]:
                        parts = request.META[field].split(',')
                        request.META[field] = parts[-1].strip()

2. अपने MIDDLEWAREप्रोजेक्ट setting.pyफ़ाइल की सूची में अपने मिडलवेयर वर्ग को हटाएं ।

मिडिलवेयर संदर्भ के लिए नियम आपकी परियोजना की मूल निर्देशिका से आपकी कक्षा का मार्ग है।

उदाहरण के लिए, नाम की एक परियोजना में mysite, पेड़ इस प्रकार है।

├── mysite
│   ├── manage.py
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── middleware.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py

हम फ़ाइल MultipleProxyMiddlewareमें सिर्फ अपना मिडलवेयर वर्ग जोड़ते हैं middleware.py। हमें निम्नलिखित संदर्भ नाम मिलता है।

MIDDLEWARE = [
    'mysite.middleware.MultipleProxyMiddleware',  
     ...
]

-3

जब आप जानते हैं कि विचारों में किस प्रकार का अपवाद होता है, तो यह मददगार होगा। ऊपर से मैंने अपनी तरह की कस्टम क्लास बनाई है

from .models import userDetails

class customMiddleware(object):

    def process_request(self,request):
        result=''
        users = userDetails.objects.all()
        print '-->',users ,'---From middleware calling ---'

        username=request.POST.get("username")
        salary = request.POST.get("salary")
        if salary:
            try:
                result = username+int(salary)
            except:
                print "Can't add"

स्ट्रिंग और पूर्णांक जोड़ के मामले में अपवाद होने पर इसे निष्पादित किया जाएगा।

आप मिडलवेयर क्लास के ऊपर कॉरस्पॉन्डिंग विचार लिख सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.