掌握Flask:从入门到精通指南

news/2024/2/21 10:52:09

掌握Flask:从入门到精通指南

Flask 是一个轻量级的 Python Web 应用程序框架,具有简单易学、灵活性高等特点,适合用于快速开发 Web 应用程序。本文将全面介绍 Flask 框架的各个方面,包括基本概念、路由、模板渲染、表单处理、数据库集成以及部署等内容。

  1. Flask 简介
    Flask 是一个轻量级的 Python Web 框架,它具有简单、灵活、易于学习和使用的特点。相对于其他框架,如Django,Flask更注重简洁性和自由度。以下是 Flask 的一些关键概念和特性:

1.轻量级和灵活性: Flask 是一个微型框架,核心功能较少,但提供了丰富的扩展库,开发者可以根据项目需求自由选择并集成所需的功能。
2.路由(Routing): 使用装饰器(decorators)来定义URL与函数之间的映射关系,从而使请求可以被正确的处理和响应。

from flask import Flask
app = Flask(__name__)@app.route('/')
def hello():return 'Hello, World!'

3.视图和模板: Flask 支持使用模板引擎(如Jinja2)创建动态内容的视图,并且允许在模板中插入动态数据。
4.上下文: Flask 提供了不同类型的上下文,比如请求上下文(Request Context)和应用上下文(App Context),这些上下文使得在请求处理过程中可以方便地访问请求相关的信息。
5.扩展性: Flask 可以通过众多的扩展(Extensions)来增加功能,例如处理表单、数据库集成、认证和授权等。
6.WSGI 兼容性: Flask 符合 WSGI(Web Server Gateway Interface)标准,可以在各种 WSGI 兼容的服务器上运行。
7.RESTful支持: 虽然 Flask 本身并不强制实现RESTful架构,但它提供了便利的扩展和支持,使开发者可以更容易地构建 RESTful API。
8.测试性: Flask 鼓励编写单元测试,提供了简单而有效的测试客户端用于模拟请求和响应。

Flask 提供了简单而有效的方式来构建 Web 应用程序,是很多开发者喜爱的框架之一,尤其适合小型项目、原型开发以及需要快速搭建简单 Web 应用的场景。
在这里插入图片描述

下面是一个简单的 Hello World 示例:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():return 'Hello, World!'
if __name__ == '__main__':app.run()

在这个示例中,我们创建了一个名为 app 的 Flask 应用,并使用 @app.route`装饰器将 URL / 映射到 hello_world 函数上。

  1. 路由

Flask 使用装饰器来定义 URL 路由。下面是一个带参数的路由示例:

@app.route('/user/<username>')
def show_user_profile(username):return 'User %s' % username
@app.route('/post/<int:post_id>')
def show_post(post_id):return 'Post %d' % post_id
  1. 模板渲染

Flask 使用 Jinja2 模板引擎来渲染 HTML 模板。下面是一个简单的模板渲染示例:

from flask import render_template
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):return render_template('hello.html', name=name)
  1. 表单处理

Flask 提供了 WTForms 来处理表单。下面是一个简单的表单处理示例:

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequiredclass NameForm(FlaskForm):name = StringField('What is your name?', validators=[DataRequired()])submit = SubmitField('Submit')
  1. 数据库集成

Flask 可以与多种数据库进行集成,比如 SQLite、MySQL 和 PostgreSQL。下面是一个使用 SQLite 的示例:

import sqlite3
from flask import g
DATABASE = '/path/to/database.db'
def get_db():db = getattr(g, '_database', None)if db is None:db = g._database = sqlite3.connect(DATABASE)return db
  1. 部署

Flask 可以通过 uWSGI 或 Gunicorn 部署到生产环境。下面是一个使用 uWSGI 部署的示例:

$ uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi:app
  1. 图片上传

这个示例演示了如何使用 Flask 处理图片上传,并将其保存到服务器上。在 HTML 表单中添加一个 enctype="multipart/form-data" 属性以支持文件上传。

from flask import Flask, render_template, request
import os
import uuid
app = Flask(__name__)
@app.route('/')
def index():return render_template('index.html')
@app.route('/upload', methods=['POST'])
def upload():file = request.files['file']if file:filename = str(uuid.uuid4()) + os.path.splitext(file.filename)[1]file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))return 'Uploaded successfully'else:return 'Upload failed'
if __name__ == '__main__':app.config['UPLOAD_FOLDER'] = 'uploads'app.run(debug=True)<!DOCTYPE html>
<html>
<head><title>File Upload</title>
</head>
<body><form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file"><input type="submit" value="Upload"></form>
</body>
</html>
  1. 用户认证

    这个示例演示了如何使用 Flask 实现用户认证功能。在这个示例中,我们使用 Flask-Login 扩展来处理用户认证和会话管理。

from flask import Flask, render_template, redirect, url_for
from flask_login import LoginManager, login_required, login_user, logout_user, UserMixinapp = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'login_manager = LoginManager()
login_manager.init_app(app)class User(UserMixin):def __init__(self, id):self.id = iddef __repr__(self):return f'<User {self.id}>'users = [User(1),User(2),User(3)
]
@login_manager.user_loader
def load_user(user_id):return next((user for user in users if user.id == int(user_id)), None)
@app.route('/')
def index():return render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':user_id = int(request.form['user_id'])user = next((user for user in users if user.id == user_id), None)if user:login_user(user)return redirect(url_for('dashboard'))return render_template('login.html')
@app.route('/logout')
@login_required
def logout():logout_user()return redirect(url_for('index'))
@app.route('/dashboard')
@login_required
def dashboard():return render_template('dashboard.html', current_user=current_user)
if __name__ == '__main__':app.run(debug=True)<!DOCTYPE html>
<html>
<head><title>Login</title>
</head>
<body><form action="/login" method="post"><input type="text" name="user_id" placeholder="User ID"><input type="submit" value="Login"></form>
</body>
</html><!DOCTYPE html>
<html>
<head><title>Dashboard</title>
</head>
<body><h1>Welcome {{ current_user }}</h1><a href="/logout">Logout</a>
</body>
</html>
  1. REST API

这个示例演示了如何使用 Flask 实现 REST API。在这个示例中,我们使用 Flask-RESTful 扩展来帮助我们创建 RESTful API。

from flask_restful import Api, Resource, reqparseapp = Flask(__name__)
api = Api(app)class TodoList(Resource):def __init__(self):self.parser = reqparse.RequestParser()self.parser.add_argument('task', type=str, help='Task name')super().__init__()def get(self):return {'todos': []}def post(self):args = self.parser.parse_args()task = args['task']return {'task': task}, 201api.add_resource(TodoList, '/todos')if __name__ == '__main__':app.run(debug=True)
  1. 数据可视化

这个示例演示了如何使用 Flask 和 Plotly 库实现数据可视化功能。在这个示例中,我们使用 Plotly 库绘制一个散点图,并将其嵌入到 Flask 页面中。

from flask import Flask, render_template
import plotly.graph_objs as go
import pandas as pdapp = Flask(__name__)@app.route('/')
def index():df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/iris.csv')data = [go.Scatter(x=df[df['class'] == cls]['sepal_width'],y=df[df['class'] == cls]['sepal_length'],mode='markers',name=cls) for cls in df['class'].unique()]layout = go.Layout(xaxis=dict(title='Sepal Width'),yaxis=dict(title='Sepal Length'))fig = go.Figure(data=data, layout=layout)return render_template('index.html', plot=fig.to_html(full_html=False))if __name__ == '__main__':app.run(debug=True)<!DOCTYPE html><html>
<head><title>Iris Dataset</title><script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
</head>
<body>{{ plot|safe }}
</body>
</html>
  1. 实时聊天室

这个示例演示了如何使用 Flask 和 Flask-SocketIO 扩展实现实时聊天室功能。在这个示例中,我们使用 Socket.IO 库来处理 WebSocket 协议,以实现实时消息传输。

from flask import Flask, render_template
from flask_socketio import SocketIO, emitapp = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
socketio = SocketIO(app)@app.route('/')
def index():return render_template('index.html')@socketio.on('message')
def handle_message(message):emit('message', message, broadcast=True)if __name__ == '__main__':socketio.run(app)
<!DOCTYPE html>
<html>
<head><title>Chat Room</title><script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.2.0/socket.io.js"></script><script type="text/javascript">var socket = io();function sendMessage() {var message = document.getElementById('message').value;socket.emit('message', message);}socket.on('message', function(message) {var node = document.createElement('li');var textnode = document.createTextNode(message);node.appendChild(textnode);document.getElementById('messages').appendChild(node);});
</script>
</head>
<body><ul id="messages"></ul><input type="text" id="message"><button onclick="sendMessage()">Send</button>
</body>
</html>
  1. 文件下载

这个示例演示了如何使用 Flask 提供文件下载功能。在这个示例中,我们使用 Flask 的 send_file 函数将文件发送给客户端。

from flask import Flask, send_fileapp = Flask(__name__)@app.route('/download')
def download():filename = 'example.txt'return send_file(filename, as_attachment=True)if __name__ == '__main__':app.run(debug=True)
  1. 数据库连接

这个示例演示了如何使用 Flask 连接和操作数据库。在这个示例中,我们使用 Flask-SQLAlchemy 扩展和 SQLite 数据库。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
db = SQLAlchemy(app)
class User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(50))
@app.route('/')
def index():users = User.query.all()return ', '.join([user.name for user in users])
if __name__ == '__main__':db.create_all()app.run(debug=True)
  1. 异步任务

    这个示例演示了如何使用 Flask 实现异步任务。在这个示例中,我们使用 Flask-Celery-Helper 扩展和 Celery 库来执行异步任务。

from flask import Flask
from flask_celery_helper import FlaskCeleryHelperapp = Flask(__name__)
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'helper = FlaskCeleryHelper(app)@helper.task()
def add_numbers(a, b):return a + b@app.route('/')
def index():result = add_numbers.delay(1, 2)return str(result.get())if __name__ == '__main__':helper.start_worker()app.run(debug=True)

flask参数简要:

import_name:应用程序的名称或模块名称。

static_url_path:静态文件的 URL 前缀,默认为 ‘/static’。

static_folder:存储静态文件的文件夹,默认为应用程序根目录下的 ‘static’ 文件夹。

template_folder:存储模板文件的文件夹,默认为应用程序根目录下的 ‘templates’ 文件夹。

instance_path:应用程序实例的路径,默认为自动生成的路径。

instance_relative_config:是否使用相对于实例路径的配置文件,默认为 False。

root_path:应用程序根目录的路径,默认为自动生成的路径。

host:绑定的主机名,默认为 ‘127.0.0.1’。

port:绑定的端口号,默认为 5000。

debug:是否开启调试模式,默认为 False。

use_reloader:是否使用重新加载器,在代码改动时自动重启服务器,默认为 True。

threaded:是否开启多线程模式,默认为 False。

ssl_context:可选的 SSL 上下文用于启用 HTTPS。

static_host:用于静态文件的主机名,默认为 None。

static_url_path:静态文件的 URL 前缀,默认为 ‘/static’。

static_folder:存储静态文件的文件夹,默认为应用程序根目录下的 ‘static’ 文件夹。

template_folder:存储模板文件的文件夹,默认为应用程序根目录下的 ‘templates’ 文件夹。

instance_path:应用程序实例的路径,默认为自动生成的路径。

instance_relative_config:是否使用相对于实例路径的配置文件,默认为 False。

root_path:应用程序根目录的路径,默认为自动生成的路径。

几个WEB框架对比:

  1. Flask

优点:

  • 基于 Werkzeug WSGI 工具和 Jinja2 模板引擎,提供了简单、轻量级的方式来构建 Web 应用程序。

  • 易于学习和上手,适合小型项目或者初学者。

  • 灵活性高,允许开发者根据需求自由选择扩展和定制功能。

  • 可以与各种数据库系统和模板引擎无缝集成,提供了丰富的扩展库。

  • 文档齐全,拥有活跃的社区支持。

缺点:

  • 对于大型、复杂的应用程序,可能需要更多的配置和工程实践。

  • 不像一些全功能框架(比如 Django)那样自带 ORM 和其他工具,因此在处理复杂的数据库交互时可能需要更多的手动操作。

  • 在处理高并发请求时,性能可能不如一些异步框架。

  1. Django

优点:

  • 具有完整的开发工具包,自带 ORM 以及认证、管理等功能。

  • 支持非常丰富的扩展和插件,适合构建大型、复杂的 Web 应用程序。

  • 社区活跃,文档详尽,拥有较多的开发者和贡献者。

缺点:

  • 对于新手来说不够友好。

  • 部分功能可能过于笨重,不适合小型项目。

  • 定制化需求支持不够灵活。

  1. Pyramid

优点:

  • 灵活性高,可定制性强,适合构建大型、复杂的 Web 应用程序。

  • 对于需要高度定制化的应用程序,提供了丰富的扩展库和工具。

  • 文档详尽,社区活跃,拥有一定数量的开发者和贡献者。

缺点:

  • 不够友好,需要更多的实践和经验。

  • 部分功能需要自己实现,不够便捷。

  • 社区相对其他框架不够活跃。

  1. Bottle

优点:

  • 轻量级,易于上手,速度快。

  • 可以单文件运行,无需安装或配置。

  • 兼容 Python 2 和 3。

缺点:

  • 功能相比其他框架有所欠缺,不适合构建大型、复杂的 Web 应用程序。

  • 社区不够活跃。

  1. CherryPy

优点:

  • 轻量级,速度快,可扩展性强。

  • 兼容 Python 2 和 3。

缺点:

  • 对于新手来说不够友好,需要更多的实践和经验。

  • 功能相对其他框架较为有限。

  1. Tornado

优点:

  • 速度快,支持异步 I/O,可用于实时 Web 应用程序。

  • 可以与异步代码库(比如 asyncio)无缝集成。

缺点:

  • 需要对底层 I/O 操作有一定的了解。

  • 不够灵活,对于需要高度定制化的应用程序可能不够合适。

  1. Falcon

优点:

  • 轻量级,速度快,可扩展性强。

  • 文档详尽,社区活跃。

缺点:

  • 对于复杂应用程序需要手动添加扩展。

  • 社区相对其他框架不是很活跃。

  1. FastAPI

优点:

  • 速度快,自带 API 文档生成器,支持异步 I/O。

  • 文档详尽,社区活跃。

缺点:

  • 对于新手来说不够友好。
  1. Quart

优点:

  • 基于 asyncio 的 Flask 版本,支持异步 I/O。

  • 文档详尽。

缺点:

  • 对于新手来说不够友好。

  • 社区相对其他框架不是很活跃。

  1. web2py

优点:

  • 易于使用,自带 ORM、安全防护等功能。

  • 具有完整的开发工具包,文档详尽。

缺点:

  • 对于定制化需求不够灵活。

  • 部分功能相对其他框架较为有限。


https://www.xjx100.cn/news/3119066.html

相关文章

Golang rsa 验证

一下代码用于rsa 签名的验签&#xff0c; 签名可以用其他语言产生。也可以用golang生成。 package mainimport ("crypto""crypto/rsa""crypto/sha256""crypto/x509""encoding/pem""errors""fmt" )fun…

开源播放器GSYVideoPlayer + ViewPager2 源码解析

开源播放器GSYVideoPlayer ViewPager2 源码解析 前言一、GSYVideoPlayer&#x1f525;&#x1f525;&#x1f525;是什么&#xff1f;二、源码解析1.ViewPager2Activity 总结 前言 本文介绍GSYVideoPlayer源码中关于ViewPager2 GSYVideoPlayer 实现的滑动播放列表的实现原理。…

【ASP.NET Core】MVC中ViewData和ViewBag的区别和使用

在 ASP.NET MVC 中&#xff0c;ViewBag 和 ViewData 都是用来传递数据从控制器到视图的机制。尽管它们在功能上很相似&#xff0c;但在使用方式上有一些差别。 ViewBag ViewBag 使用动态特性来存储数据。它是 dynamic 类型的&#xff0c;这意味着你可以给它赋任何类型的值。由…

Vue3 中el-tree-select使用中遇到的一些问题

<el-tree-selectv-model"userFormParams.deptId":data"deptTree.data"placeholder"请选择"filterableautocomplete"off"aria-autocomplete"none":render-after-expand"false"></el-tree-select> 1、…

HarmonyOS4.0开发应用(二)【快速学习】

快速学习 创建项目 1.开始创建 2.选择模板 刚开始选择空白的模板即可 3.填写项目信息 这样一个基本项目就创建好了 代码结构 实现Demo(文字动态切换) Entry Component struct Index {State message: string Hello Worldbuild() {Row() {Column() {Text(this.message).fo…

laraval6.0 GatewayWorker 交互通信

laravel 6.0 GatewayWorker 通讯 开发前准备下载 GatewayWorker 及操作方式前端demo测试效果项目中安装GatewayClient 开发前准备 GatewayClient 官网&#xff1a;https://www.workerman.net/ 当前使用的是宝塔操作 下载 GatewayWorker 及操作方式 前端demo 测试效果 项目中安…

【ZEDSLAM】Ubuntu18.04系统ZED 2i双目相机SDK安装、联合标定、SLAM测试

0.设备、环境和说明 笔记本电脑i5-8300H、GTX 1060、32GRAM 因为后面要测试Vins-Fusion和ORB-SLAM3&#xff0c;所以推荐安装Ubuntu 18.04&#xff08;或者Ubuntu 20.04&#xff09; ROS 1&#xff08;不建议用比Ubuntu18更低的版本&#xff09; ROS一键安装命令&#xff1a;…

JSON.stringify方法详解 后端接受JSON数据格式

1、方法定义&#xff1a;JSON.stringify(value, replacer, space) 参数说明&#xff1a; value&#xff1a;js对象 replacer&#xff1a;替换对象&#xff0c;可以是一个方法、对象或数组&#xff0c;将value按照替换规则展示。 space&#xff1a;填充参数&#xff0c;可以是数…