دکوراتور در پایتون
دکوراتور ها یه ابزار قدرتمند و کاربردی تو زبان پایتون هستند که به ما اجازه میدن رفتار یه کلاس یا تابع رو تغییر بدیم. دکوراتور ها این امکان رو به ما میدن که قابلیت های تابعمون رو بدون دستکاری خود تابع افزایش بدیم.
در ادامه مطلب یه مثال ازش میبینیم:
فرض کنید که برای متد post یه وبسرویس یه تابع نوشتیم، این وبسرویس قراره نام کاربری و کلمه عبور کاربر رو دریافت کنه و کااربر رو داخل دیتابیس ثبت کنه.. تابعمون یه همچین شکلی خواهد داشت:
فرض کنید که یه کلاس User هم تعریف کردیم که همین دوتا ویژگی رو در خودش نگه میداره.. اگه با فریمورک جنگو آشنا باشید احتمالا میدونید که اول از همه اومدیم یه شی از کلاسمون با ویژگیهایی(نام و رمز عبور) که کاربر وارد کرده ساختیم که وارد دیتابیسمون باشه. و بعد در پاسخ به کاربر میگیم که مشخصات وارد شده شما فلان و فلان بودن و یه پیغام موفقیت آمیز هم نشونش میدیم، بدین صورت:
کد زیر را در نظر بگیرید:
def post(self, request, *args, **kwargs):
a_user = User.objects.create(
userName=request.data["username"],
pass=request.data["password"]
)
responseBody=UserSerializer(a_user).data
responseBody["message"]="[Success]"
return Response(
data=responseBody,
status=status.HTTP_201_CREATED
)
def validate_request_data(func):
def decorated(*args, **kwargs):
# args[0] == GenericView Object
userName = args[0].request.data.get("username", "")
passWord = args[0].request.data.get("password", "")
if not passWord or not userName:
return Response(
data={
"message": "[Unsuccessful] Both password and userName are required to add a use"
},
status=status.HTTP_400_BAD_REQUEST
)
return func(*args, **kwargs)
return decorated
return func(*args, **kwargs)
@validate_request_data
def post(self, request, *args, **kwargs):
a_product = Product.objects.create(
productId=request.data["productId"],
userId=request.data["userId"]
)
resBody=ProductSerializer(a_product).data
resBody["message"]="[Success]"
return Response(
data=resBody,
status=status.HTTP_201_CREATED
)
validate_request_data(post)
یعنی یکبار فیلدهاشو چک میکنه و درنهایت خود تابع رو صدا میزنه :)