Bird
Raised Fist0
Flaskframework~8 mins

User model with password in Flask - Performance & Optimization

Choose your learning style10 modes available
Performance: User model with password
MEDIUM IMPACT
This affects page load speed and interaction responsiveness when user authentication is involved, especially during login and registration.
Storing and verifying user passwords securely and efficiently
Flask
from werkzeug.security import generate_password_hash, check_password_hash

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password_hash = db.Column(db.String(128), nullable=False)

    def set_password(self, password):
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)
Hashes passwords securely, reducing risk and allowing fast, optimized password verification without exposing raw passwords.
📈 Performance GainImproves interaction responsiveness by enabling fast, secure password checks and reducing server load from security incidents
Storing and verifying user passwords securely and efficiently
Flask
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(80), nullable=False)  # storing plain text password

    def check_password(self, password):
        return self.password == password
Storing passwords in plain text causes security risks and forces server to do string comparisons that can be exploited; also, it can increase server load if password checks are inefficient.
📉 Performance CostBlocks interaction responsiveness due to potential security breaches and inefficient password checks
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Plain text password storage and checkNone (server-side)NoneNone[X] Bad
Hashed password storage with werkzeugNone (server-side)NoneNone[OK] Good
Rendering Pipeline
Password hashing and verification happen on the server side and do not directly affect browser rendering, but inefficient handling can delay server responses, impacting user interaction speed.
→Server Processing
→Network Response
→User Interaction
⚠️ BottleneckServer Processing during password hash computation
Core Web Vital Affected
INP
This affects page load speed and interaction responsiveness when user authentication is involved, especially during login and registration.
Optimization Tips
1Never store passwords in plain text; always hash them securely.
2Use efficient hashing libraries to minimize server processing delays.
3Fast server response on authentication improves user interaction speed.
Performance Quiz - 3 Questions
Test your performance knowledge
Why is storing plain text passwords a performance and security problem?
AIt causes more DOM reflows during rendering
BIt increases server load and risks security breaches slowing interaction
CIt makes the page load slower due to large password size
DIt improves password check speed
DevTools: Network
How to check: Open DevTools, go to Network tab, perform login, and check server response time for authentication requests.
What to look for: Look for fast response times and no repeated failed requests indicating efficient password verification.

Practice

(1/5)
1. What is the main purpose of the set_password method in a Flask user model?
easy
A. To delete the user's password from the database
B. To hash and store the user's password securely
C. To check if the password entered matches the stored password
D. To display the user's password in plain text

Solution

  1. Step 1: Understand the role of set_password

    This method is used to convert a plain password into a secure hashed version before saving it.
  2. Step 2: Differentiate from check_password

    check_password is for verifying passwords, not setting them.
  3. Final Answer:

    To hash and store the user's password securely -> Option B
  4. Quick Check:

    set_password hashes password [OK]
Hint: Remember: set_password hashes, check_password verifies [OK]
Common Mistakes:
  • Confusing set_password with check_password
  • Thinking set_password shows the password
  • Assuming set_password deletes passwords
2. Which of the following is the correct way to define a password hashing method in a Flask user model using Werkzeug?
easy
A. def set_password(self, password): return check_password_hash(self.password_hash, password)
B. def set_password(self, password): self.password = password
C. def set_password(self, password): self.password_hash = password
D. def set_password(self, password): self.password_hash = generate_password_hash(password)

Solution

  1. Step 1: Identify correct hashing usage

    The method must use generate_password_hash to hash the password before storing.
  2. Step 2: Check assignment to password_hash

    The hashed password should be saved in self.password_hash, not plain password.
  3. Final Answer:

    def set_password(self, password): self.password_hash = generate_password_hash(password) -> Option D
  4. Quick Check:

    Use generate_password_hash to store hashed password [OK]
Hint: Use generate_password_hash to hash passwords [OK]
Common Mistakes:
  • Storing plain password instead of hashed
  • Using check_password_hash inside set_password
  • Assigning password to wrong attribute
3. Given this Flask user model snippet, what will user.check_password('secret') return if the password was set with user.set_password('secret')?
from werkzeug.security import generate_password_hash, check_password_hash

class User:
    def __init__(self):
        self.password_hash = ''
    def set_password(self, password):
        self.password_hash = generate_password_hash(password)
    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

user = User()
user.set_password('secret')
medium
A. None
B. False
C. True
D. Raises an error

Solution

  1. Step 1: Understand password setting

    The password 'secret' is hashed and stored in password_hash.
  2. Step 2: Check password verification

    check_password compares the hash with 'secret' and returns True if they match.
  3. Final Answer:

    True -> Option C
  4. Quick Check:

    Matching password returns True [OK]
Hint: check_password returns True if password matches hash [OK]
Common Mistakes:
  • Expecting False for correct password
  • Thinking check_password returns the hash
  • Assuming error if password matches
4. Identify the error in this Flask user model code snippet:
from werkzeug.security import generate_password_hash, check_password_hash

class User:
    def __init__(self):
        self.password_hash = None
    def set_password(self, password):
        self.password_hash = generate_password_hash(password)
    def check_password(self, password):
        return check_password_hash(password, self.password_hash)
medium
A. The order of arguments in check_password_hash is reversed
B. password_hash should be initialized as an empty string, not None
C. set_password should return the hashed password
D. The class is missing a username attribute

Solution

  1. Step 1: Review check_password_hash usage

    The correct order is check_password_hash(stored_hash, password).
  2. Step 2: Identify argument mistake

    The code passes password first and self.password_hash second, which is wrong.
  3. Final Answer:

    The order of arguments in check_password_hash is reversed -> Option A
  4. Quick Check:

    check_password_hash needs (hash, password) order [OK]
Hint: check_password_hash(hash, password) order matters [OK]
Common Mistakes:
  • Swapping arguments in check_password_hash
  • Initializing password_hash as None causes no error but is not best
  • Expecting set_password to return a value
  • Confusing missing attributes with password errors
5. You want to add a method change_password to your Flask user model that updates the password only if the old password matches. Which implementation correctly applies this logic?
hard
A. def change_password(self, old_password, new_password): if self.check_password(old_password): self.set_password(new_password) return True return False
B. def change_password(self, old_password, new_password): self.set_password(new_password) return True
C. def change_password(self, old_password, new_password): if old_password == new_password: self.set_password(new_password) return True return False
D. def change_password(self, old_password, new_password): if not self.check_password(new_password): self.set_password(old_password) return True return False

Solution

  1. Step 1: Verify old password before changing

    The method must check if the old password matches using check_password.
  2. Step 2: Update password only if old password is correct

    If the check passes, call set_password with the new password and return True; else return False.
  3. Final Answer:

    def change_password(self, old_password, new_password): if self.check_password(old_password): self.set_password(new_password) return True return False -> Option A
  4. Quick Check:

    Change password only if old password matches [OK]
Hint: Always verify old password before setting new one [OK]
Common Mistakes:
  • Changing password without verifying old password
  • Comparing old and new passwords incorrectly
  • Swapping old and new passwords in checks
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