ساخت CustomManager

  • محمد هادی حاجی حسینی
  • 1403/04/13
(قسمت 2) ساخت CustomManager
OTP Code, CustomAuthenticationBackend, Web service REST

ساخت CustomManager

مقدمه

با سلام خدمت تمام دوستان عزیز وب سایت کدینگ یار، در قسمت دوم سری بلاگ پست های آموزش پیاده سازی اعتبارسنجی کاربر با استفاده از شماره تلفن و ارسال OTP Code قصد داریم تا Custom Manager خودمون رو بسازیم و به مدل User سفارشی  خودمون که در بلاگ پست قبلی ساختیم معرفی کنیم تا مدلUser ما به جای استفاده از منیجر پیشفرض خودش از این به بعد از منیجر سفارشی ما استفاده کنه.

خب بدون معطلی بریم که دست به کد شیم!

اصلا Manager چیه؟!

Manager همینطور که خود داکیومنتیشن جنگو گفته  یک Interface(رابط) بین مدل های جنگو و دیتابیسه و هر مدل به صورت پیشفرض یک منیجر داره که query ها و عملیات های مربوط به دیتابیس رو مدیریت میکنه این منیجر دیفالت خود جنگو همون objects که بار ها وبارها ازش برای اعمال دستورات خودمون به دیتابیس استفاده

کردیم.

مثل همین query که به دیتابیس زدیم و اون آبجکت هایی از مدل Person رو درخواست کردیم که سنشون بیشتر یا مساوی 18 سال باشه:

 

Person.objects.filter(age__get=18)

خب حالا که از پایه فهمیدیم منیجر چیه بریم سراغ ساخت منیجر سفارشی خودمون.

ساخت Custom Manager

  • داخل اپ accounts خودمون یک فایل پایتونی به اسم managers میسازیم.
  • جنگو یک کلاس به اسم BaseUserManager داره که یک سری فانکشنالیتی های بیسیک رو داره که باعث میشه ما لازم نباشه بیاییم دوباره کد تکراری بزنیم پس در اول فایلی که ساختیم اونو از این آدرس import میکنیم.

 

 

بعد یک کلاس به اسم CustomUserManager میسازیم و در این کلاس از کلاسی که در بالا import  کردیم ارث بری میکنیم.

 

داخل این کلاس میتونیم هر متود دلخواهی که خواستیم رو بسازیم یا از متود هایی که در کلاس BaseUserManager وجود داره استفاده کنیم یا اون هارو override کنیم.

 

اما در اینجا ما دوتا متود نیاز داریم تا بسازیم:

  • ()Create_user
  • ()Create_superuser

 

همینطور که از اسمشون پیداست متود اول یک کاربر معمولی میسازه متود دوم یک سوپرuser یا همون ادمین رو میسازه!

 

و اینها تنها تفاوتشون اینه که میاییم داخل create_superuser ادمین رو برابر true قرارمیدیم:

“is_admin=True".

 

خب بریم اولین متود رو پیاده سازی کنیم:

create_user

در این متود پارامتر های phone_number ،  password و سایر فیلد های مورد نظرمون رو دریافت میکنیم و اونارو اعتبار سنجی میکنیم(شما میتونین فیلد هایی که به صورت دلخواه برای مدلتون تعریف کردین مثل ایمیل رو به همین صورت اعتبار سنجی کنین البته چون در اینجا صحبت از فیلد ایمیل شد بهتره برای اعتبار سنجی اون از متود normalize_email خود کلاس BaseUserManager استفاده کنین مثل set_password که در ادامه بهتون معرفیش میکنم.)

 

  • پسورد رو None قراردادیم که برای ساخت user معمولی اجباری نباشه چون قراره با OTP کاربر رو Register کنیم!

 

بعد اعتبار سنجی فیلد های مورد نظر میریم سراغ ساخت آبجکت User خودمون:

  • شماره تلفن و سایر فیلد های مورد نظر (**other_fields) بهش میدیم.
  • به غیر از password چون اگر پسورد رو مثل سایر فیلد ها بهش معرفی کنیم اونو به صورت خام ذخیره میکنه و این اصلا از نظر امنیتی درست نیست پس میاییم از متود کلاس BaseUserManager استفاده میکنیم(set_password) که بالاتر بهتون گفتم یک سری فانکشنالیتی پایه داره! این متود میاد پسورد رو دریافت و اون رو به صورت هش شده در اختیار ما میزاره تا در دیتابیس به صورت امن ذخیره اش کنیم.

 

  • درنهایت آبجکت User رو ذخیره میکنیم(این using=self._db برای اینه که جنگو داخل داکیومنتشیشن پیشنهاد میکنیه این آرگومان رو برای متود سیو صدا بزنیم تا اون دیتابیسی که فعاله فراخوانی بشه که اجباری نیست!)
  • و درنهایت User ساخته شده رو return میکنیم.

 

خب بریم سراغ متود بعدی یعنی create_superuser:

create_superuser

خب در ابتدا پارامتر های ضروری رو دریافت میکنیم + به علاوه فیلد هایی که خودتون به دلخواه در مدل اضافه کردین.

 

بعد قراره از داخل other_fields بیاییم سه فیلد رو که هممون باهاش آشنایی داریم و برای ساخت یک کاربر ادمین واجبه رو دریافت میکنیم و مقدارشون رو به صورت پیشفرض برای کاربر ادمین True قرار میدیم و مجددا میاییم اعتبارسنجی میکنیم که حتما این فیلد ها مقدارشون True باشه و که اگر نبود یک ارور رو raise میکنیم و به کاربر نمایش میدیم.

در نهایت با همون متود ساخت کاربر عادی میاییم یک آبجکت User میسازیم و اونو return میکنیم!

نکته

  • این متود create_superuser برای زمانیه که ما میخواییم از طریق کامند لاین بیاییم یک کاربر ادمین بسازیم و وقتی این کامند رو صدا میزنیم در واقع این متود مدل user فعال میشه.
  • چرا اومدیم از متود ساخت کاربر عادی برای مدل superuser استفاده کردیم؟! خب مشخصه دوست من چون فرق کاربر معمولی و ادمین در همین دوتا فیلده is_admin و is_staff دیگه که در اینجا مقدارشو true قرار دادیم!
  • وقتی ما model رو صدا زدیم این کلاس از کجا میفهمه که منظورمون مدل CustomUser هستش؟!

از اینجا که بعد ساخت منیجر سفارشی خودمون اونو باید به مدلمون معرفی کنیم!

یادتونه در بلاگ پست قبلی گفتم مقدار objects رو None قرار بدین تا جلسه بعد؟ درسته دقیقا باید در همون قسمت بیاییم و منیجر سفارشی خودمون رو به مدل معرفی کنیم:

()Objects = CustomUserManager

 

درنهایت

دوتا کامند همیشگی یعنی makemigrations و migrate رو ران میکنیم و آماده میشیم تا در بلاگ پست بعدی بریم سراغ CustomAuthenticationBackend خودمون :)

امیدوارم که از این بلاگ پست نهایت استفاده رو برده باشین، منم تا جایی که امکان داشت سعی کردم که خلاصه و مفید و مختصر مطالب رو در اختیارتون بذارم

فقط یادتون نره که نظرخودتون رو راجع به  این بلاگ پست با ما یعنی تیم کدینگ یار به اشتراک بذارین چون همین بازخورد مثبت شماست که باعث قوت قلب ما میشه تا بتونیم هرروز مطالب جدید و کاربردی بیشتری رو باهاتون به اشتراک بگذاریم.

اگر فکر می کنید که ما چیزی را در این مقاله جا انداخته ایم و یا در مورد پست های بعدی ایده و یا نظری دارید، خوشحال می شویم که این مورد را با ما در میان بگذارید. تنها کافیست روی دکمه زیر کلیک کنید و پیشنهاد خود را ارسال کنید.

ارسال نظر :
این نام در کامنت ها و پروفایل عمومی شما نمایش داده خواهد شد.