میدلور سفارشی Custom Middleware جنگو

میدلور ها ، میان افزار هایی هستن که بین درخواست کاربر و روت مربوطه قرار دارن برای درک بهتر این مسئله مثال زیر رو مطرح می کنم

 

کاربر با روت dash/id میخواد به داشبوردش بره و میخواد چک کنید که کاربر احراز هویت  (Auth) کرده یا نه ولی این کار نباید تو کنترلر روت dash/id انجام بشه، اینجاست که میان افزار ها (Middleware) به کمکمون میان و بین درخواست کاربر برای ورود به روت dash/id و خود این روت dash/id اجرا میشن و بسته به کدی که دارن تو این مثال  احراز هویت کاربر رو بررسی میکنن.

 

 

از اونجا که داریم با جنگو که یکی از قوینترین فریمورک هاست کار میکنیم وقتی سراغ  Middleware میریم برای ما متد هایی ایجاد کرده که کارمون رو راحت تر می کنه.

 

 

چند نکته در مورد تصویر بالا 

1-لیست زیر شامل میدلور های خود جنگو هست که داخل اپ اصلی پروژه و فایل setting قرار داده شده

  • SessionMiddleware
  • CommonMiddleware
  • CsrfViewMiddleware
  • AuthenticationMiddleware
  • MessageMiddleware
  • XFrameOptionsMiddleware

نوشته های داخل فلاش های سبز و قرمز هم متد هایی هست که جنگو برای راحتی کار ما در اختیارمون میزاره

همونطور که از تصویر بالا مشخصه هر درخواست شامل دو بخش درخواست request و پاسخ reqsponse میشه و متد های جنگو این امکان رو به ما میده که بتونیم میدلور رو در جای خودش درخواست یا پاسخ اجرا کنیم ، حتی بیشتر از اون ، بتونیم میدلور رو در سطح (برای درخواست (پردازش درخواست ، پردازش ویو و برای ریسپاسن در (خطاهای پردازش، پردازش قالب و پردازش پاسخ )) مدیریت کنیم ، بطور مثال میخواید وقتی درخواست به ویو (همون کنترلر در معماری MVC) رفت اجرا بشه کافیه از متد process_view() بهره ببرید

 

توجه : میدلور در کل پروژه اجرا میشه یعنی روی همه روت ها پس در استفاده ازش با دقت عمل کنید (میدلور های زیاد ایجاد نکنید ، همه کار های غیر لازم رو با میدلور پوشش ندید ، از بلوک های try exept استفاده کنید چون خطا در میدلور کل پروژه رو با خطا مواجه میکنه.

 

MIDDLEWARE = [

    'ادرس میدلور جدید',
]

تو این مقاله قصد دارم یک میدلور ایجاد کنم که در زمان درخواست و در سطح پردازش درخواست تنظیمات سایت رو از مدل تنظیمات دریافت و ارسال کنه.

1-در روت پروژه خود یک دایرکتوری با نام middleware ایجاد کنید سپس فایلی با نام SettingMiddleware.py رو ایجاد کنید

2-در فایل مذکور یک کلاس با نام دلخواه (برای من SettingInfoMiddleware )بسازید

3-بسته به اینکه میخواید میدلور تو چه سطحی (چرخه حیاتی ) اجرا بشه متد مورد نظرش رو صدا بزنید (برای من وقتی درخواست داره پردازش میشه پس میشه متد   process_request )

هر متد از این چرخه حیات ارگومان های متفاوتی داره که در ذیل مثال میزنم

متد های درخواست

process_request(request)
process_view(request, view_func, view_args, view_kwargs)

متد های پاسخ

process_exception(request, exception) (only if the view raised an exception)
process_template_response(request, response) (only for template responses)
process_response(request, response)

4-کلاس SettingInfoMiddleware که باید از MiddlewareMixin ارث بری کنه و متد process_request و بدنش

 

class SettingInfoMiddleware(MiddlewareMixin):

    def process_request(self, request):
         try:
            setting = SettingModel.objects.get_last_setting()
            request.settingInfo = setting
        except Exception as ex:
            print(ex)    

 

5-افزودن میدلورم به لیست میدلور های پروژه

نحوه ادرس دادن میدلور دایرکتوری میدلور که middleware هست . نام فایل که SettingMiddleware هست . نام کلاس موجود در فایل میدلور

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',

 

# Third Part middleware


    'middleware.SettingMiddleware.SettingInfoMiddleware'
]

 

 

 

 

چند قدم در چند راه

ابتدا وارد شوید یا ثبت نام کنید!

برای ثبت نظر، نقد ابتدا باید وارد شوید یا ثبت نام کنید.
سبد خرید