Complete worked example
python
from flask import Flask, request, session, abort
from werkzeug.security import generate_password_hash, check_password_hash
def owner_request(password, item_id=1):
app = Flask(__name__)
app.config.update(TESTING=True, SECRET_KEY='owned-login-key')
password_hash = generate_password_hash('course-password')
items = {1: {'owner': 7, 'title': 'Mine'}, 2: {'owner': 8, 'title': 'Private'}}
@app.post('/login')
def login():
if not check_password_hash(password_hash, request.form.get('password', '')):
return {'error': 'invalid credentials'}, 401
session.clear()
session['user_id'] = 7
return {'signed_in': True}
@app.get('/items/<int:identifier>')
def detail(identifier):
user = session.get('user_id')
if user is None:
abort(401)
item = items.get(identifier)
if item is None or item['owner'] != user:
abort(404)
return {'title': item['title']}
client = app.test_client()
login_response = client.post('/login', data={'password': password})
response = client.get(f'/items/{item_id}')
return {'login': login_response.status_code, 'detail': response.status_code}- Reasoning
- The login endpoint verifies a generated password hash, clears previous session state and records the known fixture identity. A subsequent detail request reads the signed session and compares the item owner before returning a title.