WEBVTT

1
00:00:01.710 --> 00:00:03.220
<v ->Hi, guys, and welcome back.</v>

2
00:00:03.220 --> 00:00:04.630
In this video, we're going to learn

3
00:00:04.630 --> 00:00:06.753
about decorators with parameters.

4
00:00:06.753 --> 00:00:09.110
Now, this is slightly different than the last video

5
00:00:09.110 --> 00:00:11.750
where we looked at decorating functions with parameters,

6
00:00:11.750 --> 00:00:13.310
now we're going to add parameters

7
00:00:13.310 --> 00:00:15.400
to the decorators themselves.

8
00:00:15.400 --> 00:00:16.300
Let's get started.

9
00:00:17.220 --> 00:00:19.880
Here, we have our make_secure decorator.

10
00:00:19.880 --> 00:00:23.530
And now, we are looking at two different functions.

11
00:00:23.530 --> 00:00:26.310
One get_admin_password that is decorated,

12
00:00:26.310 --> 00:00:29.510
and get_dashboard_password, which is also decorated.

13
00:00:29.510 --> 00:00:31.600
But now, I want the get_admin_password

14
00:00:31.600 --> 00:00:33.840
function to only be accessible by admins

15
00:00:33.840 --> 00:00:35.700
and the get_dashboard_password to only

16
00:00:35.700 --> 00:00:38.170
be accessible by users.

17
00:00:38.170 --> 00:00:41.180
So if you're a guest, you will get access to neither,

18
00:00:41.180 --> 00:00:43.740
but if you're a user, you'll get access to this one.

19
00:00:43.740 --> 00:00:46.490
And if you're an admin, you'll get access to this one.

20
00:00:46.490 --> 00:00:48.023
So how do we do this?

21
00:00:48.023 --> 00:00:52.040
Well, we have a make_secure decorator here,

22
00:00:52.040 --> 00:00:55.840
and notice that when this gets called,

23
00:00:55.840 --> 00:00:58.480
what happens is the make_secure decorator

24
00:00:58.480 --> 00:01:01.450
gets applied to get_admin_password.

25
00:01:01.450 --> 00:01:05.180
But there are no brackets after this make_secure.

26
00:01:05.180 --> 00:01:07.530
Now, what we're going to do is we're going to create

27
00:01:07.530 --> 00:01:11.660
a function that will return the decorator,

28
00:01:11.660 --> 00:01:14.680
but it will allow us to check for the access level.

29
00:01:14.680 --> 00:01:15.800
Now, here's that's gonna go.

30
00:01:15.800 --> 00:01:17.300
It's a little bit complicated.

31
00:01:18.210 --> 00:01:22.260
We're going to create another decorator,

32
00:01:22.260 --> 00:01:25.057
and this one is going to take in an access_level.

33
00:01:26.364 --> 00:01:30.390
The rest of all of this is going to go inside that.

34
00:01:30.390 --> 00:01:34.253
And this one here is going to return make_secure.

35
00:01:35.440 --> 00:01:38.870
So we have added a third level of function,

36
00:01:38.870 --> 00:01:40.869
and I know this is quite confusing,

37
00:01:40.869 --> 00:01:45.350
but now what we've got is not really a decorator.

38
00:01:45.350 --> 00:01:46.970
Now, I'm going to actually change the name

39
00:01:46.970 --> 00:01:49.800
of these functions because the outer function,

40
00:01:49.800 --> 00:01:52.400
it's not really a decorator anymore.

41
00:01:52.400 --> 00:01:55.040
This one here is a decorator now.

42
00:01:55.040 --> 00:01:57.640
This one is a factory, essentially,

43
00:01:57.640 --> 00:02:00.870
a function that is used to create a decorator.

44
00:02:00.870 --> 00:02:03.200
But what we have is a function call,

45
00:02:03.200 --> 00:02:05.040
that we give it an access_level,

46
00:02:05.040 --> 00:02:07.530
and then it creates a decorator and returns it.

47
00:02:07.530 --> 00:02:10.720
So now we have to put the brackets in here.

48
00:02:10.720 --> 00:02:13.240
And the order is very important.

49
00:02:13.240 --> 00:02:15.970
The function call happens first,

50
00:02:15.970 --> 00:02:19.690
and then the result is applied as a decorator.

51
00:02:19.690 --> 00:02:21.630
So the function call happens first.

52
00:02:21.630 --> 00:02:23.940
This will run in its entirety.

53
00:02:23.940 --> 00:02:26.330
We will define the decorator function,

54
00:02:26.330 --> 00:02:28.180
and we will return it.

55
00:02:28.180 --> 00:02:31.460
Oh, sorry, this should be decorator there,

56
00:02:31.460 --> 00:02:33.600
because we wanna return that function.

57
00:02:33.600 --> 00:02:36.830
So this will run and return the decorator,

58
00:02:36.830 --> 00:02:41.490
and that is the result of calling make_secure,

59
00:02:41.490 --> 00:02:45.770
and then we will apply that decorator into this function.

60
00:02:45.770 --> 00:02:48.610
At the end of the day, the result is the same,

61
00:02:48.610 --> 00:02:53.310
but now we can pass in something like admin in there,

62
00:02:53.310 --> 00:02:56.630
and something like guest in there.

63
00:02:56.630 --> 00:03:01.200
Notice that because this factory does take in a argument,

64
00:03:01.200 --> 00:03:04.313
you need to put the argument and the brackets in there.

65
00:03:05.180 --> 00:03:07.810
The benefit of that is now inside here,

66
00:03:07.810 --> 00:03:09.620
we can check that access level.

67
00:03:09.620 --> 00:03:11.690
So we can say that if the user's access level

68
00:03:11.690 --> 00:03:16.690
is equal to the access level that we want to secure for,

69
00:03:17.460 --> 00:03:19.340
then we have access to the function.

70
00:03:19.340 --> 00:03:21.980
Otherwise, we can say that this user

71
00:03:21.980 --> 00:03:25.520
has no access level permissions, or for that.

72
00:03:25.520 --> 00:03:28.720
So there are no access level permissions for that user.

73
00:03:28.720 --> 00:03:31.010
Now if we want to run these functions, we can do.

74
00:03:31.010 --> 00:03:33.001
Here I've got the get_admin_password

75
00:03:33.001 --> 00:03:34.227
and get_dashboard_password.

76
00:03:34.227 --> 00:03:37.032
We should get no access for either of those.

77
00:03:37.032 --> 00:03:39.212
And then I'm going to change the user to an admin

78
00:03:39.212 --> 00:03:41.730
and run them again, and now we should allow this one,

79
00:03:41.730 --> 00:03:43.216
but not that one.

80
00:03:43.216 --> 00:03:45.419
Let me save that and run it,

81
00:03:45.419 --> 00:03:49.022
and you'll see that you get that problem exactly.

82
00:03:49.022 --> 00:03:51.593
Indeed, we actually have access to the user dashboard there.

83
00:03:51.593 --> 00:03:54.750
We wanna change that, make sure that's for users only

84
00:03:54.750 --> 00:03:56.900
since that was the original intention.

85
00:03:56.900 --> 00:03:58.040
Let's run that again.

86
00:03:58.040 --> 00:04:00.700
And you get no admin permissions for Jose,

87
00:04:00.700 --> 00:04:02.379
no user permissions for Jose.

88
00:04:02.379 --> 00:04:04.980
But Anna does have admin permissions,

89
00:04:04.980 --> 00:04:06.743
but no user permissions.

90
00:04:08.130 --> 00:04:09.730
something that you may wanna look into

91
00:04:09.730 --> 00:04:12.470
to improve this further is, instead of using strings

92
00:04:12.470 --> 00:04:14.520
for your access levels, you can use integers.

93
00:04:14.520 --> 00:04:17.280
So guest can be zero, user can be one,

94
00:04:17.280 --> 00:04:18.650
and admin can be two.

95
00:04:18.650 --> 00:04:20.380
And then, instead of checking a quality here,

96
00:04:20.380 --> 00:04:21.940
you can actually do greater than.

97
00:04:21.940 --> 00:04:24.470
And that'll let admins access the user passwords

98
00:04:24.470 --> 00:04:25.813
as well, if you want that.

99
00:04:28.010 --> 00:04:29.010
That's it for this video.

100
00:04:29.010 --> 00:04:31.520
I wanted to show you how to create decorators

101
00:04:31.520 --> 00:04:32.810
that have parameters.

102
00:04:32.810 --> 00:04:35.240
And I know that they are a bit confusing.

103
00:04:35.240 --> 00:04:37.640
There are three levels of functions,

104
00:04:37.640 --> 00:04:41.040
which make these the most complicated Python code

105
00:04:41.040 --> 00:04:42.740
that you'll see in most Python courses,

106
00:04:42.740 --> 00:04:45.910
and certainly throughout your programming, as well.

107
00:04:45.910 --> 00:04:47.010
But hope you've learned something.

108
00:04:47.010 --> 00:04:48.040
Hope you've enjoyed it.

109
00:04:48.040 --> 00:04:49.790
And I'll see you in the next video.

