跳转至

Flask基础

问题143:什么是Flask?如何安装Flask?

Flask是一个轻量级的Python Web框架,简单易学,适合快速开发Web应用:

# 安装Flask
# pip install flask

# 基本Flask应用
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(debug=True)

问题144:如何创建Flask应用和路由?

from flask import Flask

app = Flask(__name__)

# 基本路由
@app.route('/')
def index():
    return '欢迎来到首页'

# 带参数的路由
@app.route('/user/<name>')
def user(name):
    return f'你好, {name}!'

# 带类型转换的路由
@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'文章ID: {post_id}'

# 多个路由指向同一个函数
@app.route('/about')
@app.route('/info')
def about():
    return '关于我们'

# 指定HTTP方法
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return '登录处理'
    return '登录页面'

if __name__ == '__main__':
    app.run(debug=True)

问题145:如何处理请求和响应?

from flask import Flask, request, jsonify, redirect, url_for

app = Flask(__name__)

# 处理GET请求参数
@app.route('/search')
def search():
    query = request.args.get('q', '')
    return f'搜索: {query}'

# 处理POST请求数据
@app.route('/submit', methods=['POST'])
def submit():
    name = request.form.get('name')
    email = request.form.get('email')
    return f'提交成功: {name}, {email}'

# 处理JSON数据
@app.route('/api/data', methods=['POST'])
def api_data():
    data = request.get_json()
    return jsonify({'status': 'success', 'data': data})

# 重定向
@app.route('/redirect')
def redirect_example():
    return redirect(url_for('index'))

# 自定义响应
@app.route('/custom')
def custom_response():
    from flask import make_response
    response = make_response('自定义响应')
    response.headers['Content-Type'] = 'text/plain'
    return response

if __name__ == '__main__':
    app.run(debug=True)

问题146:如何使用Flask模板?

from flask import Flask, render_template

app = Flask(__name__)

# 基本模板渲染
@app.route('/')
def index():
    return render_template('index.html')

# 传递变量到模板
@app.route('/user/<name>')
def user(name):
    return render_template('user.html', name=name)

# 传递多个变量
@app.route('/dashboard')
def dashboard():
    user_info = {
        'name': '张三',
        'age': 25,
        'city': '北京'
    }
    posts = [
        {'title': '文章1', 'content': '内容1'},
        {'title': '文章2', 'content': '内容2'}
    ]
    return render_template('dashboard.html', user=user_info, posts=posts)

if __name__ == '__main__':
    app.run(debug=True)

问题147:如何使用Flask表单处理?

from flask import Flask, render_template, request, flash, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SubmitField
from wtforms.validators import DataRequired, Email

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'

# 定义表单类
class ContactForm(FlaskForm):
    name = StringField('姓名', validators=[DataRequired()])
    email = StringField('邮箱', validators=[DataRequired(), Email()])
    message = TextAreaField('消息', validators=[DataRequired()])
    submit = SubmitField('提交')

# 处理表单
@app.route('/contact', methods=['GET', 'POST'])
def contact():
    form = ContactForm()
    if form.validate_on_submit():
        flash('消息发送成功!')
        return redirect(url_for('contact'))
    return render_template('contact.html', form=form)

if __name__ == '__main__':
    app.run(debug=True)

问题148:如何使用Flask会话和Cookie?

from flask import Flask, session, request, make_response

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'

# 会话管理
@app.route('/login', methods=['POST'])
def login():
    username = request.form.get('username')
    password = request.form.get('password')

    if username == 'admin' and password == 'password':
        session['logged_in'] = True
        session['username'] = username
        return '登录成功'
    return '登录失败'

@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    session.pop('username', None)
    return '已退出登录'

@app.route('/profile')
def profile():
    if session.get('logged_in'):
        return f'欢迎, {session["username"]}!'
    return '请先登录'

# Cookie管理
@app.route('/set_cookie')
def set_cookie():
    response = make_response('Cookie已设置')
    response.set_cookie('user_preference', 'dark_theme')
    return response

@app.route('/get_cookie')
def get_cookie():
    preference = request.cookies.get('user_preference')
    return f'用户偏好: {preference}'

if __name__ == '__main__':
    app.run(debug=True)

问题149:如何使用Flask错误处理?

from flask import Flask, render_template, abort

app = Flask(__name__)

# 自定义错误页面
@app.errorhandler(404)
def not_found(error):
    return render_template('404.html'), 404

@app.errorhandler(500)
def internal_error(error):
    return render_template('500.html'), 500

# 手动触发错误
@app.route('/error')
def error():
    abort(404)

# 处理特定异常
@app.errorhandler(ValueError)
def handle_value_error(error):
    return '值错误', 400

if __name__ == '__main__':
    app.run(debug=True)

问题150:如何使用Flask蓝图?

from flask import Flask, Blueprint

app = Flask(__name__)

# 创建蓝图
main_bp = Blueprint('main', __name__)
api_bp = Blueprint('api', __name__, url_prefix='/api')

# 在蓝图中定义路由
@main_bp.route('/')
def index():
    return '首页'

@main_bp.route('/about')
def about():
    return '关于我们'

@api_bp.route('/users')
def get_users():
    return {'users': ['张三', '李四', '王五']}

@api_bp.route('/users/<int:user_id>')
def get_user(user_id):
    return {'user_id': user_id, 'name': f'用户{user_id}'}

# 注册蓝图
app.register_blueprint(main_bp)
app.register_blueprint(api_bp)

if __name__ == '__main__':
    app.run(debug=True)

问题151:如何使用Flask数据库?

from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.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)

    def __repr__(self):
        return f'<User {self.username}>'

# 创建表
with app.app_context():
    db.create_all()

# 路由
@app.route('/')
def index():
    users = User.query.all()
    return render_template('index.html', users=users)

@app.route('/add_user', methods=['POST'])
def add_user():
    username = request.form['username']
    email = request.form['email']
    user = User(username=username, email=email)
    db.session.add(user)
    db.session.commit()
    return redirect(url_for('index'))

if __name__ == '__main__':
    app.run(debug=True)

问题152:Flask应用的实际部署

# 生产环境配置
class Config:
    SECRET_KEY = 'your-secret-key'
    SQLALCHEMY_DATABASE_URI = 'sqlite:///app.db'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class DevelopmentConfig(Config):
    DEBUG = True

class ProductionConfig(Config):
    DEBUG = False

# 应用工厂模式
def create_app(config_name='development'):
    app = Flask(__name__)

    if config_name == 'development':
        app.config.from_object(DevelopmentConfig)
    else:
        app.config.from_object(ProductionConfig)

    # 初始化扩展
    db.init_app(app)

    # 注册蓝图
    app.register_blueprint(main_bp)
    app.register_blueprint(api_bp)

    return app

# 创建应用
app = create_app()

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

总结

Flask是一个轻量级的Web框架,主要特点: - 简单易学:核心功能简单,易于理解 - 灵活扩展:通过扩展添加功能 - 模板支持:Jinja2模板引擎 - 路由系统:灵活的路由定义 - 会话管理:内置会话和Cookie支持 - 错误处理:自定义错误页面 - 蓝图系统:模块化应用结构 - 数据库支持:SQLAlchemy集成 - 部署友好:支持多种部署方式