文章7:Web开发入门------Flask 或 Django
目标
从零开始构建简单的Web应用程序,掌握框架选择、路由、视图、模板引擎和数据库集成。
一、Flask vs Django:如何选择?
1. Flask
- 特点:轻量级、灵活、模块化,适合小型项目或快速原型开发。
- 优势:简单易学,无需复杂配置,适合微服务或API开发。
- 缺点:需手动集成扩展(如ORM、身份验证)。
2. Django
- 特点:全栈框架,内置ORM、认证、管理后台等,适合中大型项目。
- 优势:开箱即用,遵循" batteries-included"哲学。
- 缺点:配置较复杂,灵活性较低。
选择建议
- Flask:适合需要高度定制化或小型项目。
- Django:适合需要快速搭建完整应用(如博客、电商)。
二、创建第一个Flask应用
1. 安装与初始化
pip install flask
2. 编写Hello World
python
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/') # 路由装饰器
def home():
return "Hello, Flask!"
if __name__ == "__main__":
app.run(debug=True)
运行命令:
python app.py
访问 http://localhost:5000
,看到"Hello, Flask!"。
三、路由与视图函数
1. 路由(URL映射)
通过@app.route
将URL路径映射到函数(视图)。
less
@app.route('/')
def index():
return "Welcome to the homepage!"
@app.route('/about')
def about():
return "This is the about page."
2. 动态路由与参数
less
@app.route('/user/<username>') # 接收字符串参数
def user_profile(username):
return f"User: {username}"
@app.route('/post/<int:post_id>') # 类型转换(整数)
def show_post(post_id):
return f"Post ID: {post_id}"
3. HTTP方法
python
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return "Handling POST request"
else:
return "Handling GET request"
四、模板引擎(Jinja2)
1. 渲染HTML模板
-
目录结构:
project/
├── templates/
│ └── index.html
└── app.py
2. 示例模板
xml
<!-- templates/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
</head>
<body>
<h1>{{ greeting }}</h1>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
3. 在视图中渲染模板
python
from flask import render_template
@app.route('/items')
def items():
items_list = ["Apple", "Banana", "Orange"]
return render_template('index.html', greeting="Welcome", items=items_list)
五、数据库集成:SQLAlchemy(Flask)或Django ORM
1. Flask + SQLAlchemy
-
安装:
pip install flask-sqlalchemy
-
配置数据库:
python
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f"User('{self.username}', '{self.email}')"
- CRUD操作:
ini
# 创建用户
new_user = User(username='alice', email='alice@example.com')
db.session.add(new_user)
db.session.commit()
# 查询用户
user = User.query.filter_by(username='alice').first()
2. Django ORM
- 创建模型:
python
# models.py
from django.db import models
class User(models.Model):
username = models.CharField(max_length=20, unique=True)
email = models.EmailField(unique=True)
def __str__(self):
return self.username
python
from .models import User
def create_user(request):
user = User.objects.create(username='bob', email='bob@example.com')
return HttpResponse(f"User {user.username} created")
六、综合示例:待办事项应用(Flask)
1. 目录结构
todo_app/
├── app.py
├── templates/
│ ├── index.html
│ └── add_task.html
└── models.py
2. 模型(models.py)
python
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Task(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
completed = db.Column(db.Boolean, default=False)
def __repr__(self):
return f"Task('{self.title}', {self.completed})"
3. 视图与路由(app.py)
python
from flask import Flask, render_template, request, redirect, url_for
from models import db, Task
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tasks.db'
db.init_app(app)
@app.route('/')
def index():
tasks = Task.query.all()
return render_template('index.html', tasks=tasks)
@app.route('/add', methods=['POST'])
def add_task():
title = request.form['title']
new_task = Task(title=title)
db.session.add(new_task)
db.session.commit()
return redirect(url_for('index'))
if __name__ == "__main__":
app.run(debug=True)
4. 模板(templates/index.html)
xml
<!-- index.html -->
<form action="/add" method="POST">
<input type="text" name="title" placeholder="Add a task">
<button type="submit">Add</button>
</form>
<ul>
{% for task in tasks %}
<li>{{ task.title }}
<form action="/complete/{{ task.id }}" method="POST" style="display:inline">
<button>Complete</button>
</form>
</li>
{% endfor %}
</ul>
七、练习题
- 使用Flask创建一个"计算器"应用,用户输入两个数和操作符,返回结果。
- 在Django中创建一个博客模型(标题、内容、作者、发布时间),并添加管理后台。
- 扩展待办事项应用,添加"标记为完成"功能(通过路由和数据库更新)。
- 使用Django的模板继承,创建一个基础布局模板,供所有页面继承。
总结
通过本文,你已掌握:
- Flask/Django:快速搭建Web应用的核心流程。
- 路由与视图:处理URL请求与响应。
- 模板引擎:分离业务逻辑与界面展示。
- 数据库集成:通过ORM实现数据持久化。
继续深入学习,可以探索静态文件管理、表单验证、用户认证、API开发等高级主题。现在,你可以尝试构建自己的项目,如个人博客、待办事项列表或简单的电商系统!