面试题答案
一键面试1. 使用的扩展
通常会使用 Flask - HTTPBasicAuth
或 Flask - Login
扩展来实现用户认证。
- Flask - HTTPBasicAuth:适用于简单的基于HTTP基本认证的场景。它会在每次请求时要求用户提供用户名和密码。
- Flask - Login:更适合Web应用中复杂的用户会话管理,它支持记住用户登录状态等功能。
2. 关键代码片段(以Flask - HTTPBasicAuth为例)
- 安装扩展:
pip install flask - httpbasicauth
- 初始化并配置认证:
from flask import Flask
from flask_httpbasicauth import HTTPBasicAuth
app = Flask(__name__)
auth = HTTPBasicAuth()
users = {
"admin": "password123"
}
@auth.verify_password
def verify_password(username, password):
if username in users and users[username] == password:
return True
return False
- 保护路由:
@app.route('/protected')
@auth.login_required
def protected():
return "This is a protected route"
3. 验证用户登录信息的方式
- 数据库验证:将用户的用户名和密码存储在数据库(如SQLite、MySQL、PostgreSQL等)中。在用户登录时,查询数据库,比对输入的用户名和密码与数据库中存储的信息是否匹配。例如使用SQLAlchemy库连接数据库并进行查询:
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///users.db'
db = SQLAlchemy(app)
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(120), nullable=False)
@auth.verify_password
def verify_password(username, password):
user = User.query.filter_by(username=username, password=password).first()
if user:
return True
return False
- 哈希密码验证:为了安全,不应该直接存储明文密码,而是存储密码的哈希值。使用如
bcrypt
库对密码进行哈希处理。在验证时,对用户输入的密码进行相同的哈希处理,然后比对哈希值。
import bcrypt
# 注册时对密码进行哈希
password = "user_password".encode('utf - 8')
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
# 登录验证
@auth.verify_password
def verify_password(username, password):
user = User.query.filter_by(username=username).first()
if user:
return bcrypt.checkpw(password.encode('utf - 8'), user.password)
return False
4. 关键代码片段(以Flask - Login为例)
- 安装扩展:
pip install flask - login
- 初始化并配置认证:
from flask import Flask
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
app = Flask(__name__)
app.secret_key = 'your_secret_key'
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin):
pass
users = {'admin': {'password': 'password123'}}
@login_manager.user_loader
def load_user(user_id):
if user_id in users:
user = User()
user.id = user_id
return user
return None
- 登录和保护路由:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username in users and users[username]['password'] == password:
user = User()
user.id = username
login_user(user)
return redirect(url_for('protected'))
else:
return 'Invalid credentials'
return render_template('login.html')
@app.route('/protected')
@login_required
def protected():
return "This is a protected route"
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('login'))