以下是一个使用Flask和SQLAlchemy(假设已经配置好了数据库连接)实现用户登录API接口的例子,同时也实现了响应的统一格式封装:
from flask import Flask, request, jsonify, make_response
from flask_sqlalchemy import SQLAlchemy
from werkzeug.security import check_password_hash
import uuid
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db' # 示例数据库URI
db = SQLAlchemy(app)
# 定义User模型
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)
# 初始化数据库
db.create_all()
# 定义统一响应格式
def wrap_response(data=None, error=None, status_code=200):
response_dict = {
"status": "success" if error is None else "error",
"data": data,
"message": error if error else "",
}
return make_response(jsonify(response_dict), status_code)
# 登录API接口
@app.route('/api/login', methods=['POST'])
def login():
data = request.get_json()
username = data.get('username')
password = data.get('password')
if not username or not password:
return wrap_response(error="Username or password missing", status_code=400)
user = User.query.filter_by(username=username).first()
if user is None:
return wrap_response(error="User not found", status_code=404)
if not check_password_hash(user.password_hash, password):
return wrap_response(error="Incorrect password", status_code=401)
# 登录成功,假设生成一个简单的token
token = str(uuid.uuid4())
# 在实际项目中,你可能要存储token与用户的关系,这里仅作演示
return wrap_response(data={"token": token}, message="Logged in successfully")
if __name__ == '__main__':
app.run(debug=True)
在这个例子中:
- 用户模型包含了用户名和密码哈希。
wrap_response
函数用于统一响应格式,不论成功与否都会按照相同的结构返回JSON响应。/api/login
接口处理POST请求,从请求体中获取用户名和密码。- 查询数据库查找用户名对应的用户,如果没有找到或密码校验失败,则返回错误响应。
- 若登录成功,则生成一个随机的token(实际应用中应该是JWT或其他安全令牌)并返回成功响应。
请注意,实际项目中密码应使用安全的方式进行存储(如bcrypt进行哈希加密),并且token的生成和验证应该采用更为安全的方案,如使用JWT库。此外,错误处理和身份验证逻辑在生产环境中应更加严谨。
当前文章价值8.37元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)
评论已关闭!