使用flask、sqlalchemy2.0以上版本、flask_login,生成一段登录验证代码
时间: 2023-12-12 08:02:42 浏览: 30
以下是一个简单的 Flask 应用程序,使用 SQLAlchemy 和 Flask-Login 进行用户身份验证:
```python
from flask import Flask, render_template, request, redirect, url_for
from flask_login import LoginManager, login_user, logout_user, login_required, UserMixin
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from werkzeug.security import generate_password_hash, check_password_hash
app = Flask(__name__)
app.secret_key = 'secret_key'
# 创建数据库连接
engine = create_engine('sqlite:///users.db', echo=True)
# 创建用户表模型
class User(UserMixin, Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String(50), unique=True, nullable=False)
password_hash = Column(String(128), nullable=False)
def __repr__(self):
return '<User %r>' % self.username
# 初始化登录管理器
login_manager = LoginManager()
login_manager.init_app(app)
# 加载用户的回调函数
@login_manager.user_loader
def load_user(user_id):
Session = sessionmaker(bind=engine)
session = Session()
return session.query(User).get(int(user_id))
# 登录页面
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
Session = sessionmaker(bind=engine)
session = Session()
# 根据用户名查询用户
user = session.query(User).filter_by(username=username).first()
if user and check_password_hash(user.password_hash, password):
# 登录成功,将用户添加到会话中
login_user(user)
return redirect(url_for('index'))
else:
# 登录失败,显示错误信息
return render_template('login.html', error='用户名或密码错误')
return render_template('login.html')
# 注销页面
@app.route('/logout')
@login_required
def logout():
# 从会话中删除用户
logout_user()
return redirect(url_for('login'))
# 主页
@app.route('/')
@login_required
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
```
这段代码创建了一个名为 `users.db` 的 SQLite 数据库,其中包含一个名为 `users` 的表,该表包含用户的用户名和密码散列值。用户可以在登录页面中进行身份验证,如果验证通过,则将用户添加到会话中,以便在应用程序的其他部分进行访问。如果用户注销,则会从会话中删除用户。主页需要进行身份验证,因此只有已登录的用户才能访问它。