app.py
from flask_wtf import FlaskForm
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager , login_user, logout_user, login_required , UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
from flask import Flask, render_template, redirect, url_for, flash
from form_geo import LoginForm , RegisterForm
app = Flask(__name__)
app.config["SECRET_KEY"] = "geo"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.login_view = "login"
login_manager.init_app(app)
class User(UserMixin,db.Model):
id = db.Column(db.Integer, primary_key=True) # 自動遞增 ID
username = db.Column(db.String(80), unique=True, nullable=False) # 使用者名稱
password = db.Column(db.String(120), nullable=False) # 密碼
email = db.Column(db.String(120), unique=True, nullable=True) # 電子信箱
def __repr__(self):
return f'<User {self.username}>'
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@app.route("/register", methods=["GET", "POST"])
def register():
form = RegisterForm()
if form.validate_on_submit():
hashed_pwd = generate_password_hash(form.password.data)
new_user = User(
username=form.username.data,
email=form.email.data,
password=hashed_pwd
)
db.session.add(new_user)
db.session.commit()
flash("注册成功!请登录", "success")
return redirect(url_for("login"))
return render_template("register.html", form=form)
@app.route("/", methods=["GET", "POST"])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user and check_password_hash(user.password, form.password.data):
login_user(user)
return redirect(url_for("dashboard"))
flash("用户名或密码错误!", "danger")
return render_template("login.html", form=form)
@app.route("/logout")
@login_required
def logout():
logout_user()
return redirect(url_for("login"))
@app.route("/dashboard")
@login_required
def dashboard():
return render_template("dashboard.html")
@app.before_request
def create_tables():
db.create_all()
if __name__ == "__main__":
app.run(debug=True)
form_geo.py
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField , PasswordField
from wtforms.validators import DataRequired, Email, Length
class RegisterForm(FlaskForm):
username = StringField("Username", validators=[DataRequired(), Length(min=3, max=20)])
email = StringField("Email", validators=[DataRequired(), Email()])
password = PasswordField("Password", validators=[DataRequired(), Length(min=6)])
submit = SubmitField("Register")
class LoginForm(FlaskForm):
username = StringField("Username", validators=[DataRequired()])
password = StringField("Password", validators=[DataRequired()])
email = StringField("Email", validators=[DataRequired()])
submit = SubmitField("Login")