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

掌握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、安全防护等功能。

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

缺点:

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/231783.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LoadRunner自动化测试工具的应用

目录 第一部分:Loadrunner的简介 1.1 安装注意事项 1.2 协议的选择或者 VUSER 类型的选取 1.3 LR 的基本原理 1.4 测试脚本录制/分配所遵循的几个原则 第二部分:录制脚本 2.1 录制脚本前需要理解的几个基本概念 2.1.1 事务(Transaction) 2.1.2 集合点(Rendezvous) 2.1…

智能手表上的音频(四):语音通话

上篇讲了智能手表上音频文件播放。本篇开始讲语音通话。同音频播放一样有两种case&#xff1a;内置codec和BT。先看这两种case下audio data path&#xff0c;分别如下图&#xff1a; 内置codec下的语音通话audio data path 蓝牙下的语音通话audio data path 从上面两张图可以看…

Unity C++交互

一、设置Dll输出。 两种方式&#xff1a; 第一&#xff1a;直接创建动态链接库工程第二&#xff1a;创建的是可执行程序&#xff0c;在visual studio&#xff0c;右键项目->属性(由exe改成dll) 二、生成Dll 根据选项Release或Debug&#xff0c;运行完上面的生成解决方案后…

主播岗位面试

一、自我介绍 在面试的开始阶段&#xff0c;你需要准备一个简洁而有力的自我介绍。这个自我介绍应该包括你的姓名、教育背景、工作经验以及你为何对这个主播职位感兴趣。这个自我介绍应该控制在1-2分钟之内&#xff0c;避免冗长的表述。 二、主播经历和特点 在这个环节&…

一文学会Aiohttp

一、什么是aiohttp库 aiohttp库官网&#xff1a;https://docs.aiohttp.org/en/stable/ aiohttp是一个Python的HTTP客户端/服务器框架&#xff0c;它基于asyncio库实现异步编程模型&#xff0c;可以支持高性能和高并发的HTTP通信。aiohttp用于编写异步的Web服务器、Web应用程序…

36 - 电商系统表设计优化案例分析

如果在业务架构设计初期&#xff0c;表结构没有设计好&#xff0c;那么后期随着业务以及数据量的增多&#xff0c;系统就很容易出现瓶颈。如果表结构扩展性差&#xff0c;业务耦合度将会越来越高&#xff0c;系统的复杂度也将随之增加。这一讲我将以电商系统中的表结构设计为例…

基于docker的onlyoffice使用--运行JavaSpringExample

背景 我之前看到有开源项目很好地集成了onlyoffice&#xff0c;效果要比kkfilepreview好&#xff08;应当说应用场景不太一样&#xff09;。本文是在window10环境&#xff0c;安装完Docker Desktop的基础上运行onlyoffice&#xff0c;并利用官网JavaSpringExample进行了集成。 …

java学习part24异常throws

127-异常处理-异常处理方式二&#xff1a;throws_哔哩哔哩_bilibili 1.方法throws 2.如何抉择try和throws 3.手动throw语句 抛出一些java语法上没错但是不符合实际情况的异常。 用throw手动抛&#xff0c;方法上必须加throws。除非是运行时异常。 4.自定义异常

Android帝国之进程杀手--lmkd

本文概要 这是Android系统启动的第三篇文章&#xff0c;本文以自述的方式来讲解lmkd进程&#xff0c;通过本文您将了解到lmkd进程在安卓系统中存在的意义&#xff0c;以及它是如何杀进程的。&#xff08;文中的代码是基于android13&#xff09; 我是谁 init&#xff1a;“大…

Android控件全解手册 - 多语言切换完美解决方案(兼容7.0以上版本)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

在PyCharm中运行OpenCV

一、安装Anaconda配置python环境 这里选用清华大学开源软件镜像站&#xff1a;anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载的速度更快。 点击下载链接&#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsin…

推荐一款好用的BMP转PNG工具BMP2PNG

推荐一款好用的BMP转PNG工具BMP2PNG 自己写的一个BMP转PNG工具BMP2PNG 写这个工具是因为要使用传奇的部分素材在COCOS2DX使用&#xff0c; 但是COCOS2DX不支持BMP 如果直接将BMP转换到PNG的话&#xff0c;网上找到的工具都不支持透明色转换。难道要用PS一个一个抠图吗&#xf…