Web开发入门教程 🌐
1. Flask框架入门 🚀
1.1 Flask基础介绍
Flask是一个轻量级的Python Web框架,提供了快速开发Web应用的工具和库:
from flask import Flask, request, jsonify, render_template
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
@app.route('/hello')
def hello():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
1.2 路由与视图函数
# URL参数处理
@app.route('/user/<username>')
def show_user_profile(username):
return f'User {username}'
# HTTP方法
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return handle_login()
return show_login_form()
# 请求处理
@app.route('/api/data')
def get_data():
data = request.args.get('type')
return jsonify({'data': data})
1.3 模板渲染
# 使用Jinja2模板
@app.route('/dashboard')
def dashboard():
user = {'name': 'John', 'role': 'Admin'}
posts = get_user_posts()
return render_template('dashboard.html',
user=user,
posts=posts)
<!-- templates/dashboard.html -->
<!DOCTYPE html>
<html>
<head>
<title>Dashboard</title>
</head>
<body>
<h1>Welcome {{ user.name }}</h1>
{% for post in posts %}
<div class="post">
<h2>{{ post.title }}</h2>
<p>{{ post.content }}</p>
</div>
{% endfor %}
</body>
</html>
2. RESTful API设计 📡
2.1 API设计原则
-
使用HTTP方法表示操作:
- GET:获取资源
- POST:创建资源
- PUT:更新资源
- DELETE:删除资源
-
使用合适的状态码:
- 200:成功
- 201:创建成功
- 400:客户端错误
- 404:资源不存在
- 500:服务器错误
2.2 API实现示例
from flask import Flask, request, jsonify
from flask_restful import Api, Resource
app = Flask(__name__)
api = Api(app)
# 文章资源
class ArticleAPI(Resource):
def get(self, article_id=None):
if article_id:
return get_article(article_id)
return get_all_articles()
def post(self):
data = request.get_json()
return create_article(data), 201
def put(self, article_id):
data = request.get_json()
return update_article(article_id, data)
def delete(self, article_id):
return delete_article(article_id)
# 注册API路由
api.add_resource(ArticleAPI, '/api/articles', '/api/articles/<int:article_id>')
2.3 错误处理
from werkzeug.exceptions import HTTPException
@app.errorhandler(HTTPException)
def handle_exception(e):
response = {
"code": e.code,
"name": e.name,
"description": e.description,
}
return jsonify(response), e.code
class APIError(Exception):
def __init__(self, message, status_code=400):
self.message = message
self.status_code = status_code
@app.errorhandler(APIError)
def handle_api_error(error):
response = {
'error': error.message
}
return jsonify(response), error.status_code
3. 数据库操作 💾
3.1 SQLAlchemy配置
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
# 定义模型
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
posts = db.relationship('Post', backref='author', lazy=True)
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, nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
3.2 数据库操作
# 创建
def create_user(username, email):
user = User(username=username, email=email)
db.session.add(user)
db.session.commit()
return user
# 查询
def get_user(user_id):
return User.query.get_or_404(user_id)
# 更新
def update_user(user_id, data):
user = User.query.get_or_404(user_id)
for key, value in data.items():
setattr(user, key, value)
db.session.commit()
return user
# 删除
def delete_user(user_id):
user = User.query.get_or_404(user_id)
db.session.delete(user)
db.session.commit()
4. 实战案例:个人博客系统 📝
让我们创建一个完整的个人博客系统:
from flask import Flask, request, jsonify, render_template
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, logout_user
from werkzeug.security import generate_password_hash, check_password_hash
class BlogSystem:
def __init__(self):
self.app = Flask(__name__)
self.init_app()
def init_app(self):
"""初始化应用"""
self.app.config['SECRET_KEY'] = 'your-secret-key'
self.app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
self.db = SQLAlchemy(self.app)
self.login_manager = LoginManager()
self.login_manager.init_app(self.app)
self.create_models()
self.register_routes()
def create_models(self):
"""定义数据模型"""
class User(UserMixin, self.db.Model):
id = self.db.Column(self.db.Integer, primary_key=True)
username = self.db.Column(self.db.String(80), unique=True)
password_hash = self.db.Column(self.db.String(120))
posts = self.db.relationship('Post', backref='author', lazy=True)
class Post(self.db.Model):
id = self.db.Column(self.db.Integer, primary_key=True)
title = self.db.Column(self.db.String(100))
content = self.db.Column(self.db.Text)
created_at = self.db.Column(self.db.DateTime,
default=datetime.utcnow)
user_id = self.db.Column(self.db.Integer,
self.db.ForeignKey('user.id'))
self.User = User
self.Post = Post
def register_routes(self):
"""注册路由"""
@self.app.route('/')
def home():
posts = self.Post.query.order_by(
self.Post.created_at.desc()).all()
return render_template('home.html', posts=posts)
@self.app.route('/post/<int:post_id>')
def view_post(post_id):
post = self.Post.query.get_or_404(post_id)
return render_template('post.html', post=post)
@self.app.route('/create', methods=['GET', 'POST'])
def create_post():
if request.method == 'POST':
title = request.form['title']
content = request.form['content']
post = self.Post(title=title, content=content)
self.db.session.add(post)
self.db.session.commit()
return redirect(url_for('view_post', post_id=post.id))
return render_template('create_post.html')
def main():
"""主函数:启动博客系统"""
blog = BlogSystem()
blog.app.run(debug=True)
if __name__ == '__main__':
main()
博客系统特点:
-
完整的用户系统
- 用户注册和登录
- 密码加密存储
- 用户认证和授权
-
文章管理功能
- 创建和编辑文章
- 文章分类和标签
- 评论系统
-
前端展示
- 响应式设计
- 文章列表和详情页
- 用户个人中心
-
扩展功能
- 搜索功能
- RSS订阅
- 文章统计
扩展建议:
- 添加文章分类系统
- 实现评论功能
- 添加用户权限管理
- 实现文章搜索
- 添加文件上传功能
- 实现API接口
- 添加缓存系统
这个实战案例展示了如何使用Flask框架构建一个完整的博客系统,涵盖了Web开发中的各个重要概念和技术点。你可以基于这个框架继续扩展更多功能。
如果你觉得这篇文章有帮助,欢迎点赞转发,也期待在评论区看到你的想法和建议!👇
咱们下一期见!