Flask框架入门与实践

Flask框架入门与实践

Flask是一个轻量级的Python Web框架,以其简洁、灵活和易于上手的特点深受开发者喜爱。本文将带您深入了解Flask的核心概念、基本用法以及实际应用。

什么是Flask?

Flask是由Armin Ronacher于2010年开发的微型Web框架。与Django等大型框架不同,Flask坚持"微核心"的设计理念,只提供Web开发最核心的功能,其他功能通过扩展来实现。这种设计使得Flask既保持了简单性,又具有极高的灵活性。

Flask的特点

1. 轻量级

Flask的核心代码非常精简,不包含数据库抽象层、表单验证等功能,让开发者可以根据项目需求自由选择组件。

2. 灵活性高

Flask不会对项目结构做过多限制,开发者可以按照自己的方式组织代码,适合各种规模的项目。

3. 易于学习

Flask的API设计简洁直观,文档完善,新手可以快速上手。

4. 扩展丰富

Flask拥有庞大的扩展生态系统,如Flask-SQLAlchemy、Flask-Login、Flask-RESTful等,可以轻松添加各种功能。

快速开始

安装Flask

pip install flask

创建第一个Flask应用

from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return '欢迎来到Flask的世界!'@app.route('/user/<name>')
def user(name):return f'你好,{name}!'if __name__ == '__main__':app.run(debug=True)

运行上述代码后,访问 http://localhost:5000 即可看到欢迎信息。

Flask核心概念

1. 路由(Routing)

路由用于将URL映射到Python函数。Flask使用装饰器来定义路由:

@app.route('/about')
def about():return '关于我们'# 支持不同的HTTP方法
@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':# 处理登录逻辑passreturn render_template('login.html')

2. 模板(Templates)

Flask使用Jinja2模板引擎来渲染HTML页面:

from flask import render_template@app.route('/profile/<username>')
def profile(username):return render_template('profile.html', name=username)

对应的模板文件 templates/profile.html

<!DOCTYPE html>
<html>
<head><title>用户资料</title>
</head>
<body><h1>欢迎,{{ name }}!</h1>
</body>
</html>

3. 请求处理

Flask提供了方便的请求对象来处理HTTP请求:

from flask import request@app.route('/submit', methods=['POST'])
def submit():# 获取表单数据username = request.form.get('username')# 获取查询参数page = request.args.get('page', 1)# 获取JSON数据data = request.get_json()return '数据已接收'

4. 响应处理

可以自定义响应内容、状态码和头部信息:

from flask import make_response, jsonify@app.route('/api/data')
def api_data():data = {'name': 'Flask', 'version': '2.0'}return jsonify(data)@app.route('/custom')
def custom_response():resp = make_response('自定义响应', 200)resp.headers['X-Custom-Header'] = 'Value'return resp

实战示例:构建一个简单的博客系统

下面是一个简单博客系统的基本结构:

from flask import Flask, render_template, request, redirect, url_for
from datetime import datetimeapp = Flask(__name__)# 模拟数据库
posts = []@app.route('/')
def index():return render_template('index.html', posts=posts)@app.route('/post/new', methods=['GET', 'POST'])
def new_post():if request.method == 'POST':title = request.form.get('title')content = request.form.get('content')post = {'id': len(posts) + 1,'title': title,'content': content,'created_at': datetime.now()}posts.append(post)return redirect(url_for('index'))return render_template('new_post.html')@app.route('/post/<int:post_id>')
def view_post(post_id):post = next((p for p in posts if p['id'] == post_id), None)if post:return render_template('post.html', post=post)return '文章不存在', 404

Flask扩展推荐

1. 数据库操作

  • Flask-SQLAlchemy: ORM工具,简化数据库操作
  • Flask-Migrate: 数据库迁移工具

2. 用户认证

  • Flask-Login: 用户登录管理
  • Flask-Security: 完整的安全解决方案

3. API开发

  • Flask-RESTful: RESTful API开发
  • Flask-CORS: 处理跨域请求

4. 表单处理

  • Flask-WTF: 表单验证和CSRF保护

部署Flask应用

开发环境

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

生产环境

推荐使用WSGI服务器,如Gunicorn:

pip install gunicorn
gunicorn -w 4 -b 127.0.0.1:8000 app:app

配合Nginx作为反向代理:

server {listen 80;server_name example.com;location / {proxy_pass http://127.0.0.1:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

最佳实践

1. 项目结构

对于大型项目,建议采用以下结构:

myapp/
├── app/
│   ├── __init__.py
│   ├── models.py
│   ├── views.py
│   └── templates/
├── config.py
├── requirements.txt
└── run.py

2. 配置管理

将配置与代码分离:

# config.py
class Config:SECRET_KEY = 'your-secret-key'DATABASE_URI = 'sqlite:///db.sqlite'# app.py
app.config.from_object(Config)

3. 错误处理

自定义错误页面:

@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

4. 日志记录

配置日志系统:

import logging
from logging.handlers import RotatingFileHandlerif not app.debug:file_handler = RotatingFileHandler('logs/app.log', maxBytes=10240, backupCount=10)file_handler.setLevel(logging.INFO)app.logger.addHandler(file_handler)

总结

Flask是一个优秀的Web框架,它的简单性和灵活性使其成为Python Web开发的首选之一。无论是构建小型应用还是大型项目,Flask都能胜任。通过本文的介绍,相信您已经对Flask有了基本的了解。

Flask的学习曲线平缓,但要精通它需要不断实践。建议从简单的项目开始,逐步深入了解Flask的高级特性和最佳实践。随着经验的积累,您将能够充分发挥Flask的潜力,构建出高效、可维护的Web应用。

记住,Flask的哲学是"微核心,可扩展"。它给了你选择的自由,让你可以根据项目需求灵活地构建应用。享受Flask带来的开发乐趣吧!

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

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

相关文章

数学复习笔记 14

前言 和家里人交流了一下&#xff0c;他们还是希望我全力以赴初试&#xff0c;我确实也得放开了干&#xff0c;不要束手束脚的。好好加油。感觉公共课都没有啥压力&#xff0c;主要是专业课要好好加油&#xff0c;真不能过不了线&#xff0c;要是过不了线&#xff0c;啥都白搭…

金格iWebOffice控件在新版谷歌Chrome中不能加载了怎么办?

金格iWebOffice控件是由江西金格网络科技有限责任公司开发的中间件软件&#xff0c;主要用于在浏览器中直接编辑Word、Excel、PowerPoint等Office文档&#xff0c;曾经是一款优秀国产的WebOffice插件。 由于2022年Chrome等浏览器取消支持PPAPI接口&#xff0c;导致这款金格iWe…

ChatGPT 能“记住上文”的原因

原因如下 你把对话历史传给了它 每次调用 OpenAI 接口时&#xff0c;都会把之前的对话作为参数传入&#xff08;messages 列表&#xff09;&#xff0c;模型“看见”了之前你说了什么。 它没有长期记忆 它不会自动记住你是谁或你说过什么&#xff0c;除非你手动保存历史并再次…

微信小程序van-dialog确认验证失败时阻止对话框的关闭

使用官方(Vant Weapp - 轻量、可靠的小程序 UI 组件库)的before-close&#xff1a; wxml&#xff1a; <van-dialog use-slot title"名称" show"{{ show }}" show-cancel-button bind:cancel"onClose" bind:confirm"getBackInfo"…

K8S Ingress、IngressController 快速开始

假设有如下三个节点的 K8S 集群&#xff1a; ​ k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、理论介绍 1&#xff09;什么是 Ingress 定义&#xff1a;Ingress 是 Kubernetes 中的一种资源对象&#xff0c;它定义了外部访问集群内…

Vue3 + Element Plus 动态表单实现

完整代码 <template><div class"dynamic-form-container"><el-formref"dynamicFormRef":model"formData":rules"formRules"label-width"auto"label-position"top"v-loading"loading"&g…

Mac修改hosts文件方法

Mac修改hosts文件方法 在 macOS 上修改 hosts 文件需要管理员权限 步骤 1&#xff1a;打开终端 通过 Spotlight 搜索&#xff08;Command 空格&#xff09;输入 Terminal&#xff0c;回车打开。或进入 应用程序 > 实用工具 > 终端。 步骤 2&#xff1a;备份 hosts 文件…

深度学习—BP神经网络

文章目录 [TOC](文章目录) 一、基本概念二、 网络结构三、BP神经网络的原理总结特点&#xff1a;应用场景优缺点 一、基本概念 BP 神经网络&#xff08;Backpropagation Neural Network&#xff09;是一种基于误差反向传播算法的多层前馈神经网络&#xff0c;由输入层、隐藏层…

Spring AI(6)——向量存储

向量数据库是一种特殊类型的数据库&#xff0c;在 AI 应用中发挥着至关重要的作用。 在向量数据库中&#xff0c;查询与传统关系型数据库不同。它们执行的是相似性搜索&#xff0c;而非精确匹配。当给定一个向量作为查询时&#xff0c;向量数据库会返回与该查询向量“相似”的…

Qt功能区:简介与安装

Qt功能区 1. 功能区简介2. SARibbon2.1 简介2.2 编译与安装采用CMake-gui进行编译采用VS进行编译安装与使用 Qt 官方不支持 Ribbon 风格&#xff08;Ribbon UI 风格是微软开创的&#xff0c;具有专利许可协议&#xff0c;许可协议对从构建 UI 的指令到每个按钮间的空格数都做了…

iOS safari和android chrome开启网页调试与检查器的方法

手机开启远程调试教程&#xff08;适用于 Chrome / Safari&#xff09; 前端移动端调试指南&#xff5c;适用 iPhone 和 Android&#xff5c;WebDebugX 出品 本教程将详细介绍如何在 iPhone 和 Android 手机上开启网页检查器&#xff0c;配合 WebDebugX 实现远程调试。教程包含…

Golang企业级商城高并发微服务实战

Golang企业级商城高并发微服务实战包含内容介绍&#xff1a; 从零开始讲了百万级单体高并发架构、千万级微服务架构&#xff0c;其中包含Rpc实现微服务、微服务的跨语言调用jsonrpc和protobuf、protobuf的安装、protobuf高级语法、protobuf结合Grpc实现微服务实战、微服务服务…

实现可靠的 WebSocket 连接:心跳与自动重连的最佳实践

概览 本文将手把手教你如何从零编写一个可用于直播或在线聊天的 WSocket 类&#xff0c;依次实现连接建立、心跳检测、断线重连、消息收发以及资源清理等功能。我们将结合 WebSocket API 的标准用法、心跳保持 和 重连策略&#xff0c;并充分运用现代 JavaScript 语法&#xf…

UEFI Spec 学习笔记---33 - Human Interface Infrastructure Overview(1)

33 - Human Interface Infrastructure Overview 本章节主要用于介绍Human Interface Infrastructure&#xff08;HII&#xff09;架构介绍&#xff0c;描述如何通过 HII 来管理用户的输入&#xff0c;以及描述在 UEFI spec 中涉及 HII 相关的 Protocol、function 和类型定义。…

ip命令详解

控制网卡的硬件状态 ip link set ens36 down ip link set ens36 up 修改网卡名称&#xff08;临时&#xff09; ip link set ens36 down ip link set ens36 name xxx 修改网卡的mac地址 ip link set ens36 down ip link set xxx name ens36 查看ip的addr ip addr show ip ad…

hadoop中了解yarm

Hadoop中的YARN&#xff08;Yet Another Resource Negotiator&#xff09;是一种新的Hadoop资源管理器&#xff0c;是一个通用资源管理系统&#xff0c;可为上层应用提供统一的资源管理和调度。以下是其相关介绍&#xff1a; 核心思想 将JobTracker的资源管理和作业调度/监控功…

做好的QT软件,换一个笔记本打开后发现字体很小,部分字体还被控件遮挡

出现这种情况的原因主要是屏幕的DPI&#xff08;每英寸点数&#xff09;不同。Qt中控件的大小单位为像素&#xff0c;在高DPI下&#xff0c;控件会变小&#xff0c;低DPI下控件会变大。而Qt中字体的单位默认为磅&#xff0c;无论在什么显示器上显示同一磅值的字体&#xff0c;其…

linux - 权限的概念

目录 用户权限 超级用户与普通用户的区别 超级用户&#xff08;root&#xff09;&#xff1a; 普通用户&#xff1a; 切换用户身份 使用sudo执行高权限命令 用户管理 用户组管理 文件权限 文件访问者类别 基本权限 权限表示方法 权限修改 chmod chown chgrp u…

Python函数返回值的艺术:为何True/False是更优实践及例外情况分析

在Python编程实践中&#xff0c;子程序的返回值设计往往是一个容易被忽视但却至关重要的设计决策。本文将深入探讨为什么返回True/False往往是更好的选择&#xff0c;何时应该避免这种做法&#xff0c;以及如何处理与None值相关的问题。 为什么返回True/False是更好的实践&…

STM32单片机内存分配详细讲解

单片机的内存无非就两种&#xff0c;内部FLASH和SRAM&#xff0c;最多再加上一个外部的FLASH拓展。在这里我以STM32F103C8T6为例子讲解FLASH和SRAM。 STM32F103C8T6具有64KB的闪存和20KB的SRAM。 一. Flash 1.1 定义 非易失性存储器&#xff0c;即使在断电后&#xff0c;其所…