Bird
Raised Fist0
Flaskframework~10 mins

Decorator for role requirement in Flask - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to import the decorator function.

Flask
from functools import [1]
Drag options to blanks, or click blank then click option'
Arequest
Bredirect
Cwraps
Dsession
Attempts:
3 left
💡 Hint
Common Mistakes
Importing 'request' or 'redirect' instead of 'wraps'.
Forgetting to import 'wraps' causes decorator metadata loss.
2fill in blank
medium

Complete the decorator definition to accept a role parameter.

Flask
def role_required([1]):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            # role check logic here
            return func(*args, **kwargs)
        return wrapper
    return decorator
Drag options to blanks, or click blank then click option'
Arole
Bfunc
Cuser
Dpermission
Attempts:
3 left
💡 Hint
Common Mistakes
Using 'func' as parameter instead of 'role'.
Not accepting any parameter in the outer function.
3fill in blank
hard

Fix the error in accessing the current user's roles from Flask's session.

Flask
from flask import session

@role_required('admin')
def admin_panel():
    if 'admin' in session.get([1], []):
        return 'Welcome admin'
    return 'Access denied'
Drag options to blanks, or click blank then click option'
A'roles'
B'permissions'
C'user'
D'user_roles'
Attempts:
3 left
💡 Hint
Common Mistakes
Using a wrong session key like 'user_roles' or 'permissions'.
Forgetting to provide a default empty list in get.
4fill in blank
hard

Fill both blanks to complete the role check and redirect unauthorized users.

Flask
from flask import redirect, url_for

def role_required(role):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            if role not in session.get([1], []):
                return redirect(url_for([2]))
            return func(*args, **kwargs)
        return wrapper
    return decorator
Drag options to blanks, or click blank then click option'
A'roles'
B'user_roles'
C'login'
D'home'
Attempts:
3 left
💡 Hint
Common Mistakes
Using wrong session keys or redirecting to the wrong page.
Not returning the redirect response.
5fill in blank
hard

Fill all three blanks to create a complete role-required decorator with session check and redirect.

Flask
from functools import wraps
from flask import session, redirect, url_for

def role_required([1]):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            if [2] not in session.get([3], []):
                return redirect(url_for('login'))
            return func(*args, **kwargs)
        return wrapper
    return decorator
Drag options to blanks, or click blank then click option'
Arole
C'roles'
D'user_roles'
Attempts:
3 left
💡 Hint
Common Mistakes
Using different variable names for the role parameter and check.
Using wrong session keys like 'user_roles'.

Practice

(1/5)
1. What is the main purpose of a decorator that checks user roles in a Flask app?
easy
A. To log user activity without restrictions
B. To speed up the execution of functions
C. To change the user role dynamically
D. To restrict access to certain functions based on user roles

Solution

  1. Step 1: Understand the role of decorators in Flask

    Decorators wrap functions to add extra behavior, like checking conditions before running the function.
  2. Step 2: Identify the purpose of role checking

    Role checking ensures only users with the right permissions can access certain parts of the app.
  3. Final Answer:

    To restrict access to certain functions based on user roles -> Option D
  4. Quick Check:

    Role check decorator = restrict access [OK]
Hint: Decorators add checks before function runs [OK]
Common Mistakes:
  • Thinking decorators change user roles
  • Assuming decorators speed up code
  • Confusing logging with access control
2. Which of the following is the correct syntax to define a decorator that requires a role named 'admin' in Flask?
easy
A. @require_role(admin)\ndef admin_panel():\n pass
B. def require_role('admin'):\n def admin_panel():\n pass
C. @require_role('admin')\ndef admin_panel():\n pass
D. @require_role['admin']\ndef admin_panel():\n pass

Solution

  1. Step 1: Recognize decorator syntax in Python

    Decorators use @ followed by the decorator function call with parentheses if it takes arguments.
  2. Step 2: Check correct argument passing

    The role name 'admin' must be passed as a string inside parentheses.
  3. Final Answer:

    @require_role('admin')\ndef admin_panel():\n pass -> Option C
  4. Quick Check:

    Decorator with parentheses and string argument = correct [OK]
Hint: Decorator with argument uses parentheses and quotes [OK]
Common Mistakes:
  • Missing parentheses for decorator with arguments
  • Passing role without quotes
  • Using square brackets instead of parentheses
3. Given this decorator code snippet, what will be printed when a user with role 'user' tries to access the decorated function?
def require_role(role):
    def decorator(func):
        def wrapper(user_role):
            if user_role == role:
                return func()
            else:
                return 'Access Denied'
        return wrapper
    return decorator

@require_role('admin')
def secret_data():
    return 'Secret Info'

print(secret_data('user'))
medium
A. Secret Info
B. Access Denied
C. TypeError
D. None

Solution

  1. Step 1: Understand the decorator logic

    The wrapper checks if the passed user_role matches the required role 'admin'. If yes, it calls the function; otherwise, returns 'Access Denied'.
  2. Step 2: Analyze the function call with 'user' role

    The user_role 'user' does not match 'admin', so the wrapper returns 'Access Denied'.
  3. Final Answer:

    Access Denied -> Option B
  4. Quick Check:

    User role mismatch = Access Denied [OK]
Hint: Mismatch role returns 'Access Denied' [OK]
Common Mistakes:
  • Assuming function runs regardless of role
  • Confusing return values
  • Ignoring wrapper function logic
4. Identify the error in this Flask role-checking decorator code:
def require_role(role):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if current_user.role == role:
                func(*args, **kwargs)
            else:
                return 'Forbidden'
        return wrapper
    return decorator
medium
A. Missing return statement before func call inside wrapper
B. Incorrect use of *args and **kwargs
C. current_user.role should be current_user.roles
D. Decorator should not have nested functions

Solution

  1. Step 1: Check the wrapper function's return behavior

    The wrapper calls func(*args, **kwargs) but does not return its result, so the decorated function returns None.
  2. Step 2: Confirm correct fix

    Adding 'return' before func call ensures the wrapper returns the function's output properly.
  3. Final Answer:

    Missing return statement before func call inside wrapper -> Option A
  4. Quick Check:

    Always return function result in wrapper [OK]
Hint: Wrapper must return the wrapped function's result [OK]
Common Mistakes:
  • Forgetting to return function output
  • Misusing argument unpacking
  • Incorrect attribute name for user role
5. You want to create a Flask decorator that allows access if the user role is either 'admin' or 'editor'. Which of these decorator implementations correctly achieves this?
hard
A. def require_roles(*roles): def decorator(func): def wrapper(user_role): if user_role in roles: return func() return 'Access Denied' return wrapper return decorator @require_roles('admin', 'editor') def edit_page(): return 'Edit Page'
B. def require_roles(roles): def decorator(func): def wrapper(user_role): if user_role == roles: return func() return 'Access Denied' return wrapper return decorator @require_roles(['admin', 'editor']) def edit_page(): return 'Edit Page'
C. def require_roles(*roles): def decorator(func): def wrapper(user_role): if user_role == roles: return func() return 'Access Denied' return wrapper return decorator @require_roles('admin', 'editor') def edit_page(): return 'Edit Page'
D. def require_roles(roles): def decorator(func): def wrapper(user_role): if user_role in roles: func() return 'Access Denied' return wrapper return decorator @require_roles(['admin', 'editor']) def edit_page(): return 'Edit Page'

Solution

  1. Step 1: Understand how to accept multiple roles

    Using *roles collects multiple role arguments as a tuple, allowing easy membership checks.
  2. Step 2: Check membership and return function result

    The wrapper checks if user_role is in roles and returns func() result; otherwise returns 'Access Denied'.
  3. Final Answer:

    Implementation using *roles and 'in' check with return func() -> Option A
  4. Quick Check:

    Use *args and 'in' for multiple roles [OK]
Hint: Use *args and 'in' to check multiple roles [OK]
Common Mistakes:
  • Comparing user_role to tuple instead of membership
  • Not returning function result
  • Passing roles as list but comparing with == instead of 'in'
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard