Python Web开发Flask框架入门一、Flask简介Flask是一个轻量级的Python Web框架遵循WSGI规范。1.1 Flask的特点- 轻量级核心简单- 灵活可扩展性强- 内置开发服务器和调试器- RESTful请求分发- Jinja2模板引擎- 支持单元测试1.2 安装Flaskpip install flask二、第一个Flask应用2.1 Hello Worldfrom flask import Flaskapp Flask(__name__)app.route(/)def hello():return Hello, World!if __name__ __main__:app.run(debugTrue)# 运行: python app.py# 访问: http://localhost:50002.2 路由和视图函数app.route(/user/)def show_user(username):return fUser: {username}app.route(/post/)def show_post(post_id):return fPost ID: {post_id}# URL转换器# string: 默认接受任何不包含斜杠的文本# int: 接受整数# float: 接受浮点数# path: 类似string但接受斜杠# uuid: 接受UUID字符串三、HTTP方法3.1 处理不同的HTTP方法from flask import requestapp.route(/login, methods[GET, POST])def login():if request.method POST:username request.form[username]password request.form[password]# 处理登录逻辑return fLogging in {username}else:# 显示登录表单return 3.2 RESTful APIapp.route(/api/users, methods[GET])def get_users():return {users: [Alice, Bob]}app.route(/api/users, methods[POST])def create_user():data request.get_json()return {message: User created, user: data}, 201app.route(/api/users/, methods[PUT])def update_user(user_id):data request.get_json()return {message: fUser {user_id} updated}app.route(/api/users/, methods[DELETE])def delete_user(user_id):return {message: fUser {user_id} deleted}四、请求对象4.1 访问请求数据from flask import requestapp.route(/search)def search():# 查询参数query request.args.get(q, )# 表单数据username request.form.get(username)# JSON数据data request.get_json()# 文件上传file request.files.get(file)# 请求头user_agent request.headers.get(User-Agent)# Cookiesession_id request.cookies.get(session_id)return fSearch: {query}五、响应对象5.1 返回不同类型的响应from flask import jsonify, make_response, redirect, url_for# 返回JSONapp.route(/api/data)def get_data():return jsonify({key: value})# 自定义响应app.route(/custom)def custom_response():response make_response(Custom response)response.headers[X-Custom-Header] Valueresponse.status_code 200return response# 重定向app.route(/old-url)def old_url():return redirect(url_for(new_url))app.route(/new-url)def new_url():return New URL# 设置Cookieapp.route(/set-cookie)def set_cookie():response make_response(Cookie set)response.set_cookie(username, Alice)return response六、模板渲染6.1 使用Jinja2模板from flask import render_templateapp.route(/hello/)def hello_template(name):return render_template(hello.html, namename)# templates/hello.htmlHelloHello, {{ name }}!6.2 模板语法# 变量{{ variable }}# 控制结构{% if user %}Hello, {{ user }}!{% else %}Hello, Guest!{% endif %}# 循环{% for item in items %}{{ item }}{% endfor %}# 模板继承# base.html{% block head %}{% block title %}{% endblock %}{% endblock %}{% block content %}{% endblock %}# child.html{% extends base.html %}{% block title %}Home{% endblock %}{% block content %}Welcome{% endblock %}七、静态文件7.1 提供静态文件# 目录结构myapp/├── app.py├── static/│ ├── css/│ │ └── style.css│ ├── js/│ │ └── script.js│ └── images/│ └── logo.png└── templates/# 在模板中引用八、会话管理8.1 使用Sessionfrom flask import sessionapp.secret_key your-secret-key-hereapp.route(/login, methods[POST])def login():session[username] request.form[username]return redirect(url_for(index))app.route(/logout)def logout():session.pop(username, None)return redirect(url_for(index))app.route(/)def index():if username in session:return fLogged in as {session[username]}return Not logged in九、错误处理9.1 自定义错误页面app.errorhandler(404)def not_found(error):return render_template(404.html), 404app.errorhandler(500)def internal_error(error):return render_template(500.html), 500# 手动触发错误from flask import abortapp.route(/admin)def admin():if not is_admin():abort(403)return Admin page十、蓝图Blueprints10.1 使用蓝图组织代码# auth.pyfrom flask import Blueprintauth_bp Blueprint(auth, __name__, url_prefix/auth)auth_bp.route(/login)def login():return Login pageauth_bp.route(/logout)def logout():return Logout# app.pyfrom flask import Flaskfrom auth import auth_bpapp Flask(__name__)app.register_blueprint(auth_bp)# 访问: /auth/login, /auth/logout十一、数据库集成11.1 使用Flask-SQLAlchemyfrom flask import Flaskfrom flask_sqlalchemy import SQLAlchemyapp Flask(__name__)app.config[SQLALCHEMY_DATABASE_URI] sqlite:///app.dbdb SQLAlchemy(app)class User(db.Model):id db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(80), uniqueTrue, nullableFalse)email db.Column(db.String(120), uniqueTrue, nullableFalse)def __repr__(self):return f# 创建表with app.app_context():db.create_all()# CRUD操作app.route(/users, methods[POST])def create_user():data request.get_json()user User(usernamedata[username], emaildata[email])db.session.add(user)db.session.commit()return {id: user.id}, 201app.route(/users/)def get_user(user_id):user User.query.get_or_404(user_id)return {username: user.username, email: user.email}十二、表单处理12.1 使用Flask-WTFfrom flask_wtf import FlaskFormfrom wtforms import StringField, PasswordField, SubmitFieldfrom wtforms.validators import DataRequired, Emailclass LoginForm(FlaskForm):username StringField(Username, validators[DataRequired()])password PasswordField(Password, validators[DataRequired()])submit SubmitField(Login)app.route(/login, methods[GET, POST])def login():form LoginForm()if form.validate_on_submit():username form.username.datapassword form.password.data# 处理登录return redirect(url_for(index))return render_template(login.html, formform)十三、中间件和钩子13.1 请求钩子app.before_requestdef before_request():# 在每个请求之前执行print(Before request)app.after_requestdef after_request(response):# 在每个请求之后执行response.headers[X-Custom-Header] Valuereturn responseapp.teardown_requestdef teardown_request(exception):# 请求结束时执行即使发生异常if exception:print(fException: {exception})十四、配置管理14.1 配置方式# 方式1直接设置app.config[DEBUG] Trueapp.config[SECRET_KEY] your-secret-key# 方式2从对象加载class Config:DEBUG FalseTESTING FalseSECRET_KEY your-secret-keyclass DevelopmentConfig(Config):DEBUG Trueapp.config.from_object(DevelopmentConfig)# 方式3从文件加载# config.pyDEBUG TrueSECRET_KEY your-secret-keyapp.config.from_pyfile(config.py)# 方式4从环境变量app.config.from_envvar(APP_CONFIG_FILE)十五、日志配置import loggingfrom logging.handlers import RotatingFileHandlerif not app.debug:handler RotatingFileHandler(app.log, maxBytes10000, backupCount3)handler.setLevel(logging.INFO)app.logger.addHandler(handler)app.logger.info(Application started)十六、部署16.1 使用Gunicorn# 安装pip install gunicorn# 运行gunicorn -w 4 -b 0.0.0.0:8000 app:app16.2 使用uWSGI# 安装pip install uwsgi# 运行uwsgi --http :8000 --wsgi-file app.py --callable app十七、最佳实践1. 使用蓝图组织大型应用2. 使用配置对象管理不同环境3. 使用Flask-SQLAlchemy管理数据库4. 使用Flask-WTF处理表单5. 使用Flask-Login管理用户认证6. 使用Flask-Migrate管理数据库迁移7. 使用环境变量存储敏感信息8. 启用CSRF保护9. 使用HTTPS10. 配置适当的日志级别十八、总结Flask是一个灵活而强大的Web框架适合从小型项目到大型应用的开发。通过掌握路由、模板、数据库集成等核心概念以及使用蓝图、扩展等高级特性可以高效地构建Web应用。Flask的简洁设计和丰富的扩展生态使其成为Python Web开发的热门选择。
Python Web开发:Flask框架入门
Python Web开发Flask框架入门一、Flask简介Flask是一个轻量级的Python Web框架遵循WSGI规范。1.1 Flask的特点- 轻量级核心简单- 灵活可扩展性强- 内置开发服务器和调试器- RESTful请求分发- Jinja2模板引擎- 支持单元测试1.2 安装Flaskpip install flask二、第一个Flask应用2.1 Hello Worldfrom flask import Flaskapp Flask(__name__)app.route(/)def hello():return Hello, World!if __name__ __main__:app.run(debugTrue)# 运行: python app.py# 访问: http://localhost:50002.2 路由和视图函数app.route(/user/)def show_user(username):return fUser: {username}app.route(/post/)def show_post(post_id):return fPost ID: {post_id}# URL转换器# string: 默认接受任何不包含斜杠的文本# int: 接受整数# float: 接受浮点数# path: 类似string但接受斜杠# uuid: 接受UUID字符串三、HTTP方法3.1 处理不同的HTTP方法from flask import requestapp.route(/login, methods[GET, POST])def login():if request.method POST:username request.form[username]password request.form[password]# 处理登录逻辑return fLogging in {username}else:# 显示登录表单return 3.2 RESTful APIapp.route(/api/users, methods[GET])def get_users():return {users: [Alice, Bob]}app.route(/api/users, methods[POST])def create_user():data request.get_json()return {message: User created, user: data}, 201app.route(/api/users/, methods[PUT])def update_user(user_id):data request.get_json()return {message: fUser {user_id} updated}app.route(/api/users/, methods[DELETE])def delete_user(user_id):return {message: fUser {user_id} deleted}四、请求对象4.1 访问请求数据from flask import requestapp.route(/search)def search():# 查询参数query request.args.get(q, )# 表单数据username request.form.get(username)# JSON数据data request.get_json()# 文件上传file request.files.get(file)# 请求头user_agent request.headers.get(User-Agent)# Cookiesession_id request.cookies.get(session_id)return fSearch: {query}五、响应对象5.1 返回不同类型的响应from flask import jsonify, make_response, redirect, url_for# 返回JSONapp.route(/api/data)def get_data():return jsonify({key: value})# 自定义响应app.route(/custom)def custom_response():response make_response(Custom response)response.headers[X-Custom-Header] Valueresponse.status_code 200return response# 重定向app.route(/old-url)def old_url():return redirect(url_for(new_url))app.route(/new-url)def new_url():return New URL# 设置Cookieapp.route(/set-cookie)def set_cookie():response make_response(Cookie set)response.set_cookie(username, Alice)return response六、模板渲染6.1 使用Jinja2模板from flask import render_templateapp.route(/hello/)def hello_template(name):return render_template(hello.html, namename)# templates/hello.htmlHelloHello, {{ name }}!6.2 模板语法# 变量{{ variable }}# 控制结构{% if user %}Hello, {{ user }}!{% else %}Hello, Guest!{% endif %}# 循环{% for item in items %}{{ item }}{% endfor %}# 模板继承# base.html{% block head %}{% block title %}{% endblock %}{% endblock %}{% block content %}{% endblock %}# child.html{% extends base.html %}{% block title %}Home{% endblock %}{% block content %}Welcome{% endblock %}七、静态文件7.1 提供静态文件# 目录结构myapp/├── app.py├── static/│ ├── css/│ │ └── style.css│ ├── js/│ │ └── script.js│ └── images/│ └── logo.png└── templates/# 在模板中引用八、会话管理8.1 使用Sessionfrom flask import sessionapp.secret_key your-secret-key-hereapp.route(/login, methods[POST])def login():session[username] request.form[username]return redirect(url_for(index))app.route(/logout)def logout():session.pop(username, None)return redirect(url_for(index))app.route(/)def index():if username in session:return fLogged in as {session[username]}return Not logged in九、错误处理9.1 自定义错误页面app.errorhandler(404)def not_found(error):return render_template(404.html), 404app.errorhandler(500)def internal_error(error):return render_template(500.html), 500# 手动触发错误from flask import abortapp.route(/admin)def admin():if not is_admin():abort(403)return Admin page十、蓝图Blueprints10.1 使用蓝图组织代码# auth.pyfrom flask import Blueprintauth_bp Blueprint(auth, __name__, url_prefix/auth)auth_bp.route(/login)def login():return Login pageauth_bp.route(/logout)def logout():return Logout# app.pyfrom flask import Flaskfrom auth import auth_bpapp Flask(__name__)app.register_blueprint(auth_bp)# 访问: /auth/login, /auth/logout十一、数据库集成11.1 使用Flask-SQLAlchemyfrom flask import Flaskfrom flask_sqlalchemy import SQLAlchemyapp Flask(__name__)app.config[SQLALCHEMY_DATABASE_URI] sqlite:///app.dbdb SQLAlchemy(app)class User(db.Model):id db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(80), uniqueTrue, nullableFalse)email db.Column(db.String(120), uniqueTrue, nullableFalse)def __repr__(self):return f# 创建表with app.app_context():db.create_all()# CRUD操作app.route(/users, methods[POST])def create_user():data request.get_json()user User(usernamedata[username], emaildata[email])db.session.add(user)db.session.commit()return {id: user.id}, 201app.route(/users/)def get_user(user_id):user User.query.get_or_404(user_id)return {username: user.username, email: user.email}十二、表单处理12.1 使用Flask-WTFfrom flask_wtf import FlaskFormfrom wtforms import StringField, PasswordField, SubmitFieldfrom wtforms.validators import DataRequired, Emailclass LoginForm(FlaskForm):username StringField(Username, validators[DataRequired()])password PasswordField(Password, validators[DataRequired()])submit SubmitField(Login)app.route(/login, methods[GET, POST])def login():form LoginForm()if form.validate_on_submit():username form.username.datapassword form.password.data# 处理登录return redirect(url_for(index))return render_template(login.html, formform)十三、中间件和钩子13.1 请求钩子app.before_requestdef before_request():# 在每个请求之前执行print(Before request)app.after_requestdef after_request(response):# 在每个请求之后执行response.headers[X-Custom-Header] Valuereturn responseapp.teardown_requestdef teardown_request(exception):# 请求结束时执行即使发生异常if exception:print(fException: {exception})十四、配置管理14.1 配置方式# 方式1直接设置app.config[DEBUG] Trueapp.config[SECRET_KEY] your-secret-key# 方式2从对象加载class Config:DEBUG FalseTESTING FalseSECRET_KEY your-secret-keyclass DevelopmentConfig(Config):DEBUG Trueapp.config.from_object(DevelopmentConfig)# 方式3从文件加载# config.pyDEBUG TrueSECRET_KEY your-secret-keyapp.config.from_pyfile(config.py)# 方式4从环境变量app.config.from_envvar(APP_CONFIG_FILE)十五、日志配置import loggingfrom logging.handlers import RotatingFileHandlerif not app.debug:handler RotatingFileHandler(app.log, maxBytes10000, backupCount3)handler.setLevel(logging.INFO)app.logger.addHandler(handler)app.logger.info(Application started)十六、部署16.1 使用Gunicorn# 安装pip install gunicorn# 运行gunicorn -w 4 -b 0.0.0.0:8000 app:app16.2 使用uWSGI# 安装pip install uwsgi# 运行uwsgi --http :8000 --wsgi-file app.py --callable app十七、最佳实践1. 使用蓝图组织大型应用2. 使用配置对象管理不同环境3. 使用Flask-SQLAlchemy管理数据库4. 使用Flask-WTF处理表单5. 使用Flask-Login管理用户认证6. 使用Flask-Migrate管理数据库迁移7. 使用环境变量存储敏感信息8. 启用CSRF保护9. 使用HTTPS10. 配置适当的日志级别十八、总结Flask是一个灵活而强大的Web框架适合从小型项目到大型应用的开发。通过掌握路由、模板、数据库集成等核心概念以及使用蓝图、扩展等高级特性可以高效地构建Web应用。Flask的简洁设计和丰富的扩展生态使其成为Python Web开发的热门选择。