基于Flask实现Web应用程序
下面将展示如何使用Flask构建一个完整的Web应用程序,包含用户认证、数据库操作、表单处理、静态文件服务等核心功能。
项目结构
myflaskapp/ ├── app/ │ ├── __init__.py │ ├── auth/ │ │ ├── __init__.py │ │ ├── forms.py │ │ └── routes.py │ ├── main/ │ │ ├── __init__.py │ │ └── routes.py │ ├── models.py │ ├── static/ │ │ └── style.css │ ├── templates/ │ │ ├── base.html │ │ ├── auth/ │ │ │ ├── login.html │ │ │ └── register.html │ │ └── main/ │ │ └── index.html │ └── utils.py ├── config.py ├── requirements.txt └── run.py
基础配置
config.py
import os
from dotenv import load_dotenv
load_dotenv()
class Config:
SECRET_KEY = os.getenv('SECRET_KEY') or 'your-secret-key-here'
SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL') or \
'sqlite:///' + os.path.join(os.path.abspath(os.path.dirname(__file__)), 'app.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
MAIL_SERVER = os.getenv('MAIL_SERVER')
MAIL_PORT = int(os.getenv('MAIL_PORT') or 25)
MAIL_USE_TLS = os.getenv('MAIL_USE_TLS') is not None
MAIL_USERNAME = os.getenv('MAIL_USERNAME')
MAIL_PASSWORD = os.getenv('MAIL_PASSWORD')
ADMINS = ['[email protected]']
requirements.txt
flask flask-sqlalchemy flask-login flask-wtf flask-migrate flask-mail python-dotenv email-validator
应用工厂模式
app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_mail import Mail
from flask_migrate import Migrate
from config import Config
db = SQLAlchemy()
login = LoginManager()
login.login_view = 'auth.login'
mail = Mail()
migrate = Migrate()
def create_app(config_class=Config):
app = Flask(__name__)
app.config.from_object(config_class)
db.init_app(app)
login.init_app(app)
mail.init_app(app)
migrate.init_app(app, db)
from app.auth import bp as auth_bp
app.register_blueprint(auth_bp, url_prefix='/auth')
from app.main import bp as main_bp
app.register_blueprint(main_bp)
return app
from app import models
数据库模型
app/models.py
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin
from app import db, login
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
posts = db.relationship('Post', backref='author', lazy='dynamic')
def set_password(se