werkzeug.security的generate_password_hash方法的使用

背景

用户登录,使用简单安全的python第三方库,可以自定义加密方式和salt的长度。

使用

werkzeug.security是Python的一个库,提供了一些密码相关的功能,包括密码哈希和验证。其中,generate_password_hash()方法用于生成密码的哈希值。

下面是使用generate_password_hash()方法生成密码哈希的示例:

from werkzeug.security import generate_password_hash
password = "my_password"
hash_value = generate_password_hash(password)
print(hash_value)

我们导入了generate_password_hash函数,并将明文密码存储在password变量中。然后,我们调用generate_password_hash()方法,将密码作为参数传递给它。该方法将返回密码的哈希值,将其存储在hash_value变量中。最后,我们打印出哈希值。generate_password_hash()方法使用安全的密码哈希算法(如PBKDF2或bcrypt)来保护密码,并自动生成一个随机的盐值。这种哈希算法具有较高的安全性,可以防止彩虹表攻击和暴力破解。

扩展参数

如果您需要自定义哈希算法的参数(如迭代次数、盐长度等),generate_password_hash()方法还提供了一些可选参数。

password(必需): 要进行哈希处理的原始密码字符串。
method(可选): 哈希算法的名称或标识符。默认为"pbkdf2:sha256"(PBKDF2哈希算法,使用SHA-256散列函数)。您可以使用其他支持的算法,如"bcrypt""sha512"。支持的哈希算法取决于您的Werkzeug版本。
salt_length(可选): 盐值的长度(以字节为单位)。默认为16
<think>好的,我现在需要帮助用户开发基于Flask和SQLAlchemy的sys-user接口。用户已经提供了模型和自定义的api_response函数。首先,我需要理解用户的需求,然后逐步构建合适的接口。 首先,检查用户提供的SysUser模型。注意到user_id和username都被定义为主键,这可能会导致问题,因为通常一个表应该只有一个主键。可能需要提醒用户这一点,但用户可能已经有自己的设计考虑,暂时先按现有模型处理。 接下来,用户要求接口符合RESTful风格,常见的接口包括增删改查。需要创建以下几个端点: 1. 获取用户列表(GET /api/users) 2. 创建新用户(POST /api/users) 3. 获取单个用户详情(GET /api/users/<user_id>) 4. 更新用户信息(PUT /api/users/<user_id>) 5. 删除用户(DELETE /api/users/<user_id>) 此外,可能还需要登录接口(POST /api/login),但用户没有提到,暂时先处理基本CRUD。 每个接口需要处理请求参数,验证数据,操作数据库,并返回适当的响应。使用api_response来统一返回格式,包括code、message和data。 对于GET /api/users,需要分页处理,避免数据量过大。查询参数可能包括page和per_page。使用SQLAlchemy的paginate方法进行分页,然后序列化结果。 创建用户时,需要处理密码哈希。用户模型中已经有set_password方法,应在创建时调用。需要检查必填字段,如username、password是否存在,否则返回400错误。同时,要确保用户名唯一,避免重复。 获取单个用户时,需要处理用户不存在的情况,返回404。 更新用户时,可能需要部分更新,因此使用request.get_json()获取数据,逐个字段更新。注意密码需要特殊处理,调用set_password。同时,更新update_time字段会自动触发,因为模型中有onupdate设置。 删除用户时,用户可能希望软删除(设置delete_flag)或硬删除。根据模型中的delete_flag字段,默认值为0,可能用户希望软删除。但当前示例中执行的是硬删除,可能需要询问用户意图,但根据问题描述,暂时按硬删除处理。 数据验证方面,每个接口需要检查必要参数,例如创建用户时需要username和password使用Flask的request模块获取JSON数据,并确保其存在。 序列化部分,需要将SysUser对象转换为字典。添加一个to_dict方法在模型中,方便转换。注意处理datetime字段,如create_time等,转换为字符串格式。 错误处理方面,捕获可能的异常,如数据库操作错误,返回500状态码。使用try-except块来确保数据库会话正确关闭。 最后,需要确保所有接口都使用api_response返回统一格式,包括成功和错误情况。例如,创建成功返回201状态码,错误返回400或404等。 现在,编写每个接口的代码,确保符合上述逻辑,并正确使用api_response。同时,注意密码哈希的处理,避免存储明文密码。测试每个接口的请求和响应是否符合预期,处理边界情况,如用户不存在、重复用户名等。</think>我将为您提供基于RESTful风格的sys-user接口实现,包含基础CRUD和注意事项。以下是分步骤实现: 1. 首先创建`user_controller.py`: ```python from flask import Blueprint, request from extensions import db from models.sys_user import SysUser from utils.api_response import api_response from datetime import datetime user_bp = Blueprint('user', __name__, url_prefix='/api/users') # 用户列表查询(带分页) @user_bp.route('', methods=['GET']) def get_users(): try: page = request.args.get('page', 1, type=int) per_page = request.args.get('per_page', 10, type=int) query = SysUser.query.filter_by(delete_flag=0) pagination = query.paginate(page=page, per_page=per_page, error_out=False) users = [user.to_dict() for user in pagination.items] return api_response({ 'total': pagination.total, 'page': pagination.page, 'per_page': pagination.per_page, 'items': users }) except Exception as e: return api_response(code=500, message=f"服务器错误: {str(e)}") # 创建用户 @user_bp.route('', methods=['POST']) def create_user(): try: data = request.get_json() if not data or 'username' not in data or 'password' not in data: return api_response(code=400, message="缺少必要字段: username或password") if SysUser.query.filter_by(username=data['username']).first(): return api_response(code=400, message="用户名已存在") user = SysUser() user.username = data['username'] user.set_password(data['password']) # 密码哈希处理 # 可选字段处理 fields = ['real_name', 'email', 'phone', 'sex'] for field in fields: if field in data: setattr(user, field, data[field]) db.session.add(user) db.session.commit() return api_response(user.to_dict(), code=201) except Exception as e: db.session.rollback() return api_response(code=500, message=f"创建用户失败: {str(e)}") # 用户详情 @user_bp.route('/<int:user_id>', methods=['GET']) def get_user(user_id): try: user = SysUser.query.filter_by(user_id=user_id, delete_flag=0).first() if not user: return api_response(code=404, message="用户不存在") return api_response(user.to_dict()) except Exception as e: return api_response(code=500, message=f"查询失败: {str(e)}") # 更新用户 @user_bp.route('/<int:user_id>', methods=['PUT']) def update_user(user_id): try: user = SysUser.query.get(user_id) if not user or user.delete_flag == 1: return api_response(code=404, message="用户不存在") data = request.get_json() if not data: return api_response(code=400, message="无有效数据") # 密码单独处理 if 'password' in data: user.set_password(data['password']) # 可更新字段白名单 allowed_fields = ['real_name', 'email', 'phone', 'sex', 'status'] for field in allowed_fields: if field in data: setattr(user, field, data[field]) db.session.commit() return api_response(user.to_dict()) except Exception as e: db.session.rollback() return api_response(code=500, message=f"更新失败: {str(e)}") # 删除用户(软删除) @user_bp.route('/<int:user_id>', methods=['DELETE']) def delete_user(user_id): try: user = SysUser.query.get(user_id) if not user or user.delete_flag == 1: return api_response(code=404, message="用户不存在") user.delete_flag = 1 db.session.commit() return api_response(message="删除成功") except Exception as e: db.session.rollback() return api_response(code=500, message=f"删除失败: {str(e)}") ``` 2. 在SysUser模型中添加序列化方法: ```python # 在SysUser类中添加 def to_dict(self): return { 'user_id': self.user_id, 'username': self.username, 'real_name': self.real_name, 'email': self.email, 'phone': self.phone, 'sex': self.sex, 'status': self.status, 'create_time': self.create_time.isoformat() if self.create_time else None, 'update_time': self.update_time.isoformat() if self.update_time else None, 'last_login_time': self.last_login_time.isoformat() if self.last_login_time else None } ``` 注意事项说明: 1. 安全规范: - 密码字段在返回时自动过滤,不包含在to_dict中 - 使用密码哈希存储(已通过set_password实现) - 更新操作使用字段白名单机制 2. 性能优化: - 使用分页查询避免全表扫描 - 使用软删除(delete_flag)代替物理删除 - 数据库操作使用事务回滚 3. 扩展建议: ```python # 可添加登录接口 @user_bp.route('/login', methods=['POST']) def login(): data = request.get_json() user = SysUser.query.filter_by(username=data.get('username')).first() if not user or not user.check_password(data.get('password')): return api_response(code=401, message="用户名或密码错误") user.last_login_time = datetime.utcnow() db.session.commit() # 生成访问令牌(需实现) access_token = generate_token(user) return api_response({'token': access_token}) ``` 4. 模型字段建议: - username字段建议添加唯一索引 - status字段建议使用枚举类型 - phone字段建议添加长度验证 5. 请求示例: ```http POST /api/users Content-Type: application/json { "username": "testuser", "password": "Test@1234", "email": "test@example.com" } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值