{{ post.title }}
{{ post.content | truncate(100) }}
学习目标
✅ 掌握Flask框架核心组件(对比Java的Spring Boot)
✅ 实现路由、模板渲染与表单处理
✅ 集成数据库与REST API开发
✅ 完成博客系统Web层开发实战
功能 | Java(Spring Boot) | Python(Flask) | 核心差异 |
---|---|---|---|
路由定义 | @GetMapping 注解 |
@app.route 装饰器 |
Python更简洁 |
模板引擎 | Thymeleaf/JSP | Jinja2 | 语法类似但更灵活 |
依赖注入 | @Autowired |
无原生DI,需手动或第三方库 | Python更显式 |
启动方式 | 内嵌Tomcat/Jar包 | 开发服务器(flask run ) |
Python更适合快速原型开发 |
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "欢迎来到Python博客系统!"
if __name__ == "__main__":
app.run(debug=True) # 类似Spring的DevTools
# config.py
class Config:
SECRET_KEY = "your-secret-key"
SQLALCHEMY_DATABASE_URI = "sqlite:///blog.db"
# 初始化配置
app.config.from_object(Config)
{{ title }}
{{ title }}
{% for post in posts %}
{{ post.title }}
{{ post.content | truncate(100) }}
{% endfor %}
路由渲染模板:
@app.route("/posts")
def list_posts():
posts = Post.query.all() # 使用SQLAlchemy查询
return render_template("index.html", title="所有文章", posts=posts)
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField
from wtforms.validators import DataRequired
class PostForm(FlaskForm):
title = StringField("标题", validators=[DataRequired()])
content = TextAreaField("内容")
@app.route("/create", methods=["GET", "POST"])
def create_post():
form = PostForm()
if form.validate_on_submit():
new_post = Post(title=form.title.data, content=form.content.data)
db.session.add(new_post)
db.session.commit()
return redirect(url_for("list_posts"))
return render_template("create.html", form=form)
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text)
# 初始化数据库(类似JPA的DDL生成)
with app.app_context():
db.create_all()
pip install Flask-Migrate
flask db init # 初始化迁移目录
flask db migrate # 生成迁移脚本
flask db upgrade # 执行迁移
from flask import jsonify
@app.route("/api/posts")
def api_posts():
posts = Post.query.all()
return jsonify([{"id": p.id, "title": p.title} for p in posts])
from flask_restful import Resource, Api
api = Api(app)
class PostResource(Resource):
def get(self, post_id):
post = Post.query.get_or_404(post_id)
return {"id": post.id, "title": post.title}
api.add_resource(PostResource, "/api/posts/")
用户认证(注册/登录)
文章发布与管理(CRUD)
标签分类与搜索
Markdown内容支持
用户认证(对比Spring Security):
from werkzeug.security import generate_password_hash, check_password_hash
class User(db.Model):
# ...
password_hash = db.Column(db.String(128))
@property
def password(self):
raise AttributeError("密码不可读")
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
def verify_password(self, password):
return check_password_hash(self.password_hash, password)
Markdown支持:
import markdown
@app.template_filter("markdown")
def markdown_filter(text):
return markdown.markdown(text)
{{ post.content | markdown | safe }}
线程局部变量
Flask的request
对象基于线程局部(类似Java的ThreadLocal)
异步环境下需使用copy_current_request_context
依赖管理差异
Python无类似Spring的自动扫描,需显式导入路由
# 手动注册蓝图
from .auth import auth_bp
app.register_blueprint(auth_bp)
性能优化
生产环境需使用Gunicorn或uWSGI(类似Tomcat部署)
gunicorn -w 4 "app:app" # 启动4个Worker进程
添加缓存支持
from flask_caching import Cache
cache = Cache(config={"CACHE_TYPE": "RedisCache"})
@app.route("/posts")
@cache.cached(timeout=60)
def list_posts():
# ...
实现OAuth登录
from authlib.integrations.flask_client import OAuth
oauth = OAuth(app)
github = oauth.register("github", client_id="...", client_secret="...")
容器化部署
FROM python:3.10
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]
通过第十三天学习,您将掌握:
1️⃣ Python Web开发的核心模式与Java的差异
2️⃣ Flask框架的完整开发流程
3️⃣ 数据库集成与REST API设计技巧
4️⃣ 生产级Web应用的部署与优化策略
本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注。