Flask学习入门笔记

Flask学习入门笔记

  • 前言
    • 1. 安装Flask
    • 2. 创建一个简单的Flask应用
    • 3. 路由与视图函数
      • 3.1 基本路由
      • 3.2 动态路由
      • 3.3 HTTP方法
    • 4. 请求与响应
      • 4.1 获取请求数据
      • 4.2 返回响应
    • 5. 模板渲染
      • 5.1 基本模板渲染
      • 5.2 模板继承
    • 6. 静态文件
      • 6.1 静态文件的目录结构
      • 6.2 在模板中引用静态文件
        • 6.2.1 引用CSS文件
        • 6.2.2 引用JavaScript文件
        • 6.2.3 引用图片文件
      • 6.3 修改静态文件的URL前缀
      • 6.4 静态文件的缓存问题
      • 6.5 静态文件的CDN加速
      • 6.6 静态文件的调试模式
    • 7. Flask扩展
      • 7.1 安装扩展
      • 7.2 使用扩展
    • 8. 部署Flask应用
      • 8.1 使用Gunicorn部署
      • 8.2 使用 Nginx 作为反向代理服务器
        • 8.2.1 安装 Nginx
        • 8.2.2 配置 Nginx 反向代理
      • 8.3 使用 Docker 容器化部署
        • 8.3.1 创建 Dockerfile
        • 8.3.2 构建 Docker 镜像
        • 8.3.3 运行 Docker 容器
        • 8.3.4 使用 Docker Compose
  • 总结
  • 参考文档

前言

Flask是一个轻量级的Python Web框架,适合快速开发小型Web应用和API。它灵活、易扩展,并且拥有丰富的插件生态系统。

1. 安装Flask

首先,我们需要安装Flask。可以通过pip来安装:

pip install Flask

2. 创建一个简单的Flask应用

创建一个最简单的Flask应用只需要几行代码:

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

代码解析:

  • Flask(__name__):创建一个Flask应用实例。__name__参数用于确定应用的根目录。
  • @app.route('/'):定义路由。当用户访问根路径/时,会调用hello_world函数。
  • app.run(debug=True):启动Flask开发服务器。debug=True表示开启调试模式,代码修改后会自动重启服务器。

运行应用:

将上述代码保存为app.py,然后在终端运行:

python app.py

打开浏览器,访问http://127.0.0.1:5000/,页面显示如下:

在这里插入图片描述

3. 路由与视图函数

Flask通过路由将URL与视图函数绑定。视图函数负责处理请求并返回响应。

3.1 基本路由

@app.route('/about')
def about():return 'This is the about page.'

访问http://127.0.0.1:5000/about,页面显示如下:
在这里插入图片描述

3.2 动态路由

我们可以通过<variable>来定义动态路由。

@app.route('/user/<username>')
def show_user_profile(username):return f'User {username}'

访问http://127.0.0.1:5000/user/john,页面显示如下:

在这里插入图片描述

3.3 HTTP方法

默认情况下,路由只响应GET请求。我们可以通过methods参数指定其他HTTP方法:

from flask import request@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':return 'Login POST request'else:return 'Login GET request'

4. 请求与响应

4.1 获取请求数据

Flask通过request对象来处理请求数据。我们可以获取URL参数、表单数据、JSON数据等。

from flask import request@app.route('/search')
def search():query = request.args.get('q')  # 获取URL参数return f'Search query: {query}'

访问http://127.0.0.1:5000/search?q=flask,页面显示如下:

在这里插入图片描述

4.2 返回响应

视图函数可以返回字符串、HTML、JSON等。Flask会自动将其转换为HTTP响应。

from flask import jsonify@app.route('/api/data')
def get_data():data = {'name': 'John', 'age': 30}return jsonify(data)  # 返回JSON响应

访问http://127.0.0.1:5000/api/data,页面显示如下:

在这里插入图片描述

5. 模板渲染

Flask使用Jinja2模板引擎来渲染HTML页面。模板文件通常放在templates目录下。

5.1 基本模板渲染

创建一个templates/index.html文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Home</title>
</head>
<body><h1>Hello, {{ name }}!</h1>
</body>
</html>

在视图函数中渲染模板:

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

访问http://127.0.0.1:5000/hello/john,页面显示如下:

在这里插入图片描述

5.2 模板继承

Jinja2支持模板继承,可以减少重复代码。创建一个基础模板templates/base.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{% block title %}My Site{% endblock %}</title>
</head>
<body><header><h1>My Site</h1></header><main>{% block content %}{% endblock %}</main>
</body>
</html>

然后在子模板中继承基础模板,创建一个 about.html

{% extends "base.html" %}{% block title %}Home{% endblock %}{% block content %}<h2>Welcome to the home page!</h2>
{% endblock %}

然后在app.py文件中添加一个新的路由:

@app.route('/about')
def about():return render_template('about.html')

访问 http://127.0.0.1:5000/about,页面显示如下:

在这里插入图片描述

6. 静态文件

在Web开发中,静态文件(如CSS、JavaScript、图片等)是网站的重要组成部分。Flask默认会将 static 目录作为静态文件的根目录,我们可以通过 url_for 函数在模板中引用这些文件。

6.1 静态文件的目录结构

Flask项目的典型目录结构如下:

my_flask_app/
│
├── app.py
├── templates/
│   ├── index.html
│   └── base.html
└── static/├── css/│   └── style.css├── js/│   └── script.js└── images/└── logo.png
  • static/ 目录是Flask默认的静态文件存放位置。
  • 可以在 static/ 目录下创建子目录(如 css/js/images/)来更好地组织文件。

6.2 在模板中引用静态文件

Flask提供了 url_for 函数来生成静态文件的URL。url_for 的第一个参数是 'static',表示引用静态文件;第二个参数 filename 是文件的路径(相对于 static/ 目录)。

6.2.1 引用CSS文件

在模板中引用CSS文件:

<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>My Flask App</title><link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body><h1>Welcome to My Flask App!</h1>
</body>
</html>
6.2.2 引用JavaScript文件

在模板中引用JavaScript文件:

<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>My Flask App</title><link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body><h1>Welcome to My Flask App!</h1><script src="{{ url_for('static', filename='js/script.js') }}"></script>
</body>
</html>
6.2.3 引用图片文件

在模板中引用图片文件:

<!-- templates/index.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>My Flask App</title><link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body><h1>Welcome to My Flask App!</h1><img src="{{ url_for('static', filename='images/logo.png') }}" alt="Logo"><script src="{{ url_for('static', filename='js/script.js') }}"></script>
</body>
</html>

6.3 修改静态文件的URL前缀

默认情况下,Flask会将静态文件的URL前缀设置为 /static/。如果你需要修改这个前缀,可以在创建Flask应用时通过 static_url_path 参数进行配置:

from flask import Flaskapp = Flask(__name__, static_url_path='/assets')@app.route('/')
def home():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)

此时,静态文件的URL前缀会变为 /assets/。例如,style.css 的URL会变成 /assets/css/style.css

6.4 静态文件的缓存问题

在生产环境中,浏览器会缓存静态文件以提高性能。如果你更新了静态文件(如CSS或JavaScript),可能需要强制浏览器刷新缓存。可以通过以下方式解决:

  1. 在文件名中添加版本号
    例如,将 style.css 改为 style.v1.css,并在模板中更新引用:

    <link rel="stylesheet" href="{{ url_for('static', filename='css/style.v1.css') }}">
    
  2. 使用查询参数
    在URL中添加一个查询参数(如时间戳或版本号):

    <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}?v=1.0">
    

6.5 静态文件的CDN加速

在生产环境中,可以将静态文件托管到CDN(内容分发网络)以提高加载速度。只需将 url_for 生成的URL替换为CDN的URL即可:

<link rel="stylesheet" href="https://cdn.example.com/css/style.css">

6.6 静态文件的调试模式

在开发环境中,Flask会自动处理静态文件。但在生产环境中,建议使用Web服务器(如Nginx或Apache)来直接提供静态文件,以提高性能。


7. Flask扩展

Flask拥有丰富的扩展生态系统,可以帮助你快速实现各种功能。以下是一些常用的扩展:

  • Flask-SQLAlchemy:数据库ORM
  • Flask-WTF:表单处理
  • Flask-Login:用户认证
  • Flask-RESTful:构建RESTful API

7.1 安装扩展

可以通过pip安装扩展:

pip install Flask-SQLAlchemy

7.2 使用扩展

以Flask-SQLAlchemy为例:

from flask_sqlalchemy import SQLAlchemyapp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
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)@app.route('/users')
def list_users():users = User.query.all()return render_template('users.html', users=users)

8. 部署Flask应用

Flask自带的开发服务器不适合生产环境。我们可以使用以下工具来部署Flask应用:

  • Gunicorn:一个Python WSGI HTTP服务器
  • Nginx:反向代理服务器
  • Docker:容器化部署

8.1 使用Gunicorn部署

安装Gunicorn:

pip install gunicorn

然后使用Gunicorn运行Flask应用:

gunicorn -w 4 app:app

-w 4表示启动4个工作进程,app:app表示Flask应用实例。

好的!以下是关于 NginxDocker 部署 Flask 应用的补充说明,帮助你更全面地了解如何将 Flask 应用部署到生产环境。


8.2 使用 Nginx 作为反向代理服务器

Nginx 是一个高性能的 HTTP 服务器和反向代理服务器。在生产环境中,通常会将 Nginx 放在 Gunicorn 前面,用于处理静态文件、负载均衡、SSL 终止等任务。

8.2.1 安装 Nginx

在 Linux 系统上,可以使用包管理器安装 Nginx:

# Ubuntu/Debian
sudo apt update
sudo apt install nginx# CentOS/RHEL
sudo yum install nginx

安装完成后,启动 Nginx 服务:

sudo systemctl start nginx
8.2.2 配置 Nginx 反向代理
  1. 创建 Nginx 配置文件
    /etc/nginx/sites-available/ 目录下创建一个新的配置文件(如 my_flask_app):

    sudo nano /etc/nginx/sites-available/my_flask_app
    

    添加以下内容:

    server {listen 80;server_name your_domain_or_ip;location / {proxy_pass http://127.0.0.1:8000;  # 将请求转发给 Gunicornproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}location /static {alias /path/to/your/flask/app/static;  # 直接提供静态文件}
    }
    
    • server_name:填写你的域名或 IP 地址。
    • proxy_pass:将请求转发给 Gunicorn(假设 Gunicorn 运行在 127.0.0.1:8000)。
    • location /static:Nginx 直接提供静态文件,减轻 Gunicorn 的负担。
  2. 启用配置文件
    将配置文件链接到 sites-enabled 目录:

    sudo ln -s /etc/nginx/sites-available/my_flask_app /etc/nginx/sites-enabled/
    
  3. 测试并重启 Nginx
    测试 Nginx 配置是否正确:

    sudo nginx -t
    

    如果没有错误,重启 Nginx:

    sudo systemctl restart nginx
    
  4. 运行 Gunicorn
    使用 Gunicorn 启动 Flask 应用:

    gunicorn -w 4 app:app
    

    现在,访问 http://your_domain_or_ip,Nginx 会将请求转发给 Gunicorn。


8.3 使用 Docker 容器化部署

Docker 是一种容器化技术,可以将应用及其依赖打包到一个容器中,方便部署和扩展。

8.3.1 创建 Dockerfile

在 Flask 项目的根目录下创建一个 Dockerfile

# 使用官方 Python 镜像作为基础镜像
FROM python:3.9-slim# 设置工作目录
WORKDIR /app# 复制项目文件到容器中
COPY . .# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt# 暴露端口
EXPOSE 5000# 设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_ENV=production# 启动应用
CMD ["gunicorn", "-w", "4", "app:app"]
8.3.2 构建 Docker 镜像

在项目根目录下运行以下命令,构建 Docker 镜像:

docker build -t my_flask_app .
8.3.3 运行 Docker 容器

使用以下命令运行容器:

docker run -d -p 5000:5000 --name my_flask_app my_flask_app
  • -d:以守护进程模式运行容器。
  • -p 5000:5000:将容器的 5000 端口映射到主机的 5000 端口。
  • --name my_flask_app:为容器指定名称。
8.3.4 使用 Docker Compose

如果需要同时运行多个服务(如 Flask 应用和 Nginx),可以使用 Docker Compose。

  1. 创建 docker-compose.yml 文件

    version: '3'
    services:web:build: .ports:- "5000:5000"volumes:- .:/appcommand: gunicorn -w 4 app:appnginx:image: nginx:latestports:- "80:80"volumes:- ./nginx.conf:/etc/nginx/nginx.confdepends_on:- web
    
  2. 创建 Nginx 配置文件nginx.conf):

    events {}
    http {server {listen 80;server_name your_domain_or_ip;location / {proxy_pass http://web:5000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}location /static {alias /app/static;}}
    }
    
  3. 启动服务

    docker-compose up -d
    

总结

Flask是一个灵活且易于上手的Web框架,适合快速开发小型应用和API。通过掌握路由、请求处理、模板渲染等基础知识,我们可以轻松构建功能丰富的Web应用。随着项目的复杂化,结合Flask扩展和部署工具,进一步提升应用的性能和可维护性。


参考文档

  • Flask官方文档
  • Jinja2模板引擎文档
  • Flask-SQLAlchemy文档

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

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

相关文章

菜品管理(day03)

公共字段自动填充 问题分析 业务表中的公共字段&#xff1a; 而针对于这些字段&#xff0c;我们的赋值方式为&#xff1a; 在新增数据时, 将createTime、updateTime 设置为当前时间, createUser、updateUser设置为当前登录用户ID。 在更新数据时, 将updateTime 设置为当前时间…

Python股票量化交易分析-开发属于自己的指标

需求&#xff1a;股票的量化交易指标很多&#xff0c;我想做一个自己的量化交易图表&#xff1a; 展示每天交易量和股价振幅的关系图进一步的话想知道单位金额对股价振幅的影响&#xff0c;最终实现大概估计需要多少买入成交量能拉升多少股价&#xff09; &#xff0c; 目前未…

python爬虫爬取淘宝商品比价||淘宝商品详情API接口

最近在学习北京理工大学的爬虫课程&#xff0c;其中一个实例是讲如何爬取淘宝商品信息&#xff0c;现整理如下&#xff1a; 功能描述&#xff1a;获取淘宝搜索页面的信息&#xff0c;提取其中的商品名称和价格 探讨&#xff1a;淘宝的搜索接口 翻页的处理 技术路线:requests…

OpenCV相机标定与3D重建(60)用于立体校正的函数stereoRectify()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 为已校准的立体相机的每个头计算校正变换。 cv::stereoRectify 是 OpenCV 中用于立体校正的函数&#xff0c;它基于已知的相机参数和相对位置&am…

1.17组会汇报

STRUC-BENCH: Are Large Language Models Good at Generating Complex Structured Tabular Data? STRUC-BENCH&#xff1a;大型语言模型擅长生成复杂的结构化表格数据吗&#xff1f;23年arXiv.org 1概括 这篇论文旨在评估大型语言模型&#xff08;LLMs&#xff09;在生成结构…

【机器学习实战入门】使用 Pandas 和 OpenCV 进行颜色检测

Python 颜色检测项目 今天的项目将非常有趣和令人兴奋。我们将与颜色打交道&#xff0c;并在项目过程中学习许多概念。颜色检测对于识别物体来说是必要的&#xff0c;它也被用作各种图像编辑和绘图应用的工具。 什么是颜色检测&#xff1f; 颜色检测是检测任何颜色名称的过程…

【k8s面试题2025】3、练气中期

体内灵气的量和纯度在逐渐增加。 文章目录 在 Kubernetes 中自定义 Service端口报错常用控制器Kubernetes 中拉伸收缩副本失效设置节点容忍异常时间Deployment 控制器的升级和回滚日志收集资源监控监控 Docker将 Master 节点设置为可调度 在 Kubernetes 中自定义 Service端口报…

数智化转型 | 星环科技Defensor 助力某银行数据分类分级

在数据驱动的金融时代&#xff0c;数据安全和隐私保护的重要性日益凸显。某银行作为数字化转型的先行者&#xff0c;面临着一项艰巨的任务&#xff1a;如何高效、准确地对分布在多个业务系统、业务库与数仓数湖中的约80万个字段进行数据分类和分级。该银行借助星环科技数据安全…

mac配置 iTerm2 使用lrzsz与服务器传输文件

mac配置 1. 安装支持rz和sz命令的lrzsz brew install lrzsz2. 下载iterm2-send-zmodem.sh和iterm2-recv-zmodem.sh两个脚本 # 克隆仓库 git clone https://github.com/aikuyun/iterm2-zmodem ~/iterm2-zmodem# 进入到仓库目录 cd ~/iterm2-zmodem# 设置脚本文件可执行权限 c…

redis 分布式重入锁

文章目录 前言一、分布式重入锁1、单机重入锁2、redis重入锁 二、redisson实现重入锁1、 添加依赖2、 配置 Redisson 客户端3、 使用 Redisson 实现重入锁4、 验证5、运行项目 三、redisson分布式锁分析1、获取锁对象2、 加锁3、订阅4、锁续期5、释放锁6、流程图 前言 通过前篇…

【git】如何删除本地分支和远程分支?

1.如何在 Git 中删除本地分支 本地分支是您本地机器上的分支&#xff0c;不会影响任何远程分支。 &#xff08;1&#xff09;在 Git 中删除本地分支 git branch -d local_branch_name git branch 是在本地删除分支的命令。-d是一个标志&#xff0c;是命令的一个选项&#x…

关于 Cursor 的一些学习记录

文章目录 1. 写在最前面2. Prompt Design2.1 Priompt v0.1&#xff1a;提示设计库的首次尝试2.2 注意事项 3. 了解 Cursor 的 AI 功能3.1 问题3.2 答案 4. cursor 免费功能体验5. 写在最后面6. 参考资料 1. 写在最前面 本文整理了一些学习 Cursor 过程中读到的或者发现的感兴趣…

使用python+pytest+requests完成自动化接口测试(包括html报告的生成和日志记录以及层级的封装(包括调用Json文件))

一、API的选择 我们进行接口测试需要API文档和系统&#xff0c;我们选择JSONPlaceholder免费API&#xff0c;因为它是一个非常适合进行接口测试、API 测试和学习的工具。它免费、易于使用、无需认证&#xff0c;能够快速帮助开发者模拟常见的接口操作&#xff08;增、删、改、…

【Rust自学】13.2. 闭包 Pt.2:闭包的类型推断和标注

13.2.0. 写在正文之前 Rust语言在设计过程中收到了很多语言的启发&#xff0c;而函数式编程对Rust产生了非常显著的影响。函数式编程通常包括通过将函数作为值传递给参数、从其他函数返回它们、将它们分配给变量以供以后执行等等。 在本章中&#xff0c;我们会讨论 Rust 的一…

无人机技术架构剖析!

一、飞机平台系统 飞机平台系统是无人机飞行的主体平台&#xff0c;主要提供飞行能力和装载功能。它由机体结构、动力装置、电气设备等组成。 机体结构&#xff1a;无人机的机身是其核心结构&#xff0c;承载着其他各个组件并提供稳定性。常见的机身材料包括碳纤维、铝合金、…

Axios封装一款前端项目网络请求实用插件

前端项目开发非常经典的插件axios大家都很熟悉&#xff0c;它是一个Promise网络请求库&#xff0c;可以用于浏览器和 node.js 支持的项目中。像一直以来比较火的Vue.js开发的几乎所有项目网络请求用的都是axios。那么我们在实际的项目中&#xff0c;有时候为了便于维护、请求头…

【c++继承篇】--继承之道:在C++的世界中编织血脉与传承

目录 引言 一、定义二、继承定义格式2.1定义格式2.2继承关系和访问限定符2.3继承后子类访问权限 三、基类和派生类赋值转换四、继承的作用域4.1同名变量4.2同名函数 五、派生类的默认成员构造函数5.1**构造函数调用顺序&#xff1a;**5.2**析构函数调用顺序&#xff1a;**5.3调…

LDD3学习8--linux的设备模型(TODO)

在LDD3的十四章&#xff0c;是Linux设备模型&#xff0c;其中也有说到这个部分。 我的理解是自动在应用层也就是用户空间实现设备管理&#xff0c;处理内核的设备事件。 事件来自sysfs和/sbin/hotplug。在驱动中&#xff0c;只要是使用了新版的函数&#xff0c;相应的事件就会…

Python基于Django的图像去雾算法研究和系统实现(附源码,文档说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

Python爬虫(5) --爬取网页视频

文章目录 爬虫爬取视频 指定url发送请求 UA伪装请求页面 获取想要的数据 解析定位定位音视频位置 存放视频完整代码实现总结 爬虫 Python 爬虫是一种自动化工具&#xff0c;用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持&#xff08;如…