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应用实例。

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.mzph.cn/bicheng/68504.shtml

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

相关文章

citrix netscaler13.1 重写负载均衡响应头(基础版)

在 Citrix NetScaler 13.1 中&#xff0c;Rewrite Actions 用于对负载均衡响应进行修改&#xff0c;包括替换、删除和插入 HTTP 响应头。这些操作可以通过自定义策略来完成&#xff0c;帮助你根据需求调整请求内容。以下是三种常见的操作&#xff1a; 1. Replace (替换响应头)…

【Web】2025西湖论剑·中国杭州网络安全安全技能大赛题解(全)

目录 Rank-l Rank-U sqli or not Rank-l username存在报错回显&#xff0c;发现可以打SSTI 本地起一个服务&#xff0c;折半查找fuzz黑名单&#xff0c;不断扔给fenjing去迭代改payload from flask import Flask, request, render_template_stringapp Flask(__name__)app…

WEB渗透技术研究与安全防御

目录 作品简介I IntroductionII 1 网络面临的主要威胁1 1.1 技术安全1 2 分析Web渗透技术2 2.1 Web渗透技术的概念2 2.2 Web漏洞产生的原因2 2.3 注入测试3 2.3.1 注入测试的攻击流程3 2.3.2 进行一次完整的Sql注入测试4 2.3.3 Cookie注入攻击11 3 安全防御方案设计…

软考高级5个资格、中级常考4个资格简介及难易程度排序

一、软考高级5个资格 01、网络规划设计师 资格简介&#xff1a;网络规划设计师要求考生具备全面的网络规划、设计、部署和管理能力&#xff1b;该资格考试适合那些在网络规划和设计方面具有较好理论基础和较丰富从业经验的人员参加。 02、系统分析师 资格简介&#xff1a;系统分…

Centos 宝塔安装

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 安装成功界面 宝塔说明文档 https://www.bt.cn/admin/servers#wcu 或者可以注册宝塔账号 1 快速部署 安装docker 之后 2 需要在usr/bin下下载do…

Java锁 从乐观锁和悲观锁开始讲 面试复盘

目录 面试复盘 Java 中的锁 大全 悲观锁 专业解释 自我理解 乐观锁 专业解释 自我理解 悲观锁的调用 乐观锁的调用 synchronized和 ReentrantLock的区别 相同点 区别 详细对比 总结 面试复盘 Java 中的锁 大全 悲观锁 专业解释 适合写操作多的场景 先加锁可以…

使用nginx搭建通用的图片代理服务器,支持http/https/重定向式图片地址

从http切换至https 许多不同ip的图片地址需要统一进行代理 部分图片地址是重定向地址 nginx配置 主站地址&#xff1a;https://192.168.123.100/ 主站nginx配置 server {listen 443 ssl;server_name localhost;#ssl证书ssl_certificate ../ssl/ca.crt; #私钥文件ssl_ce…

latin1_swedish_ci(latin1 不支持存储中文、日文、韩文等多字节字符)

文章目录 1、SHOW TABLE STATUS WHERE Name batch_version;2、latin1_swedish_ci使用场景注意事项修改字符集和排序规则修改表的字符集和排序规则修改列的字符集和排序规则修改数据库的默认字符集和排序规则 3、ALTER TABLE batch_version CONVERT TO CHARACTER SET utf8mb4 C…

复健第二天之[MoeCTF 2022]baby_file

打开题目在线环境可以看到&#xff1a; 感觉要用伪协议去求&#xff0c;但是我们并不知道flag的位置&#xff0c;这里我选择用dirsearch去扫一下&#xff1a; 最像的应该就是flag.php了 于是就构建payload&#xff1a; **?filephp://filter/convert.base64-encode/resource…

机器学习之SVD奇异值分解实现图片降维

SVD奇异值分解实现图片降维 目录 SVD奇异值分解实现图片降维1 SVD奇异值分解1.1 概念1.2 基本步骤1.2.1 矩阵分解1.2.2 选择奇异值1.2.3 重建矩阵1.2.4 降维结果 1.3 优缺点1.3.1 优点1.3.2 缺点 2 函数2.1 函数导入2.2 函数参数2.3 返回值2.4 通过 k 个奇异值降维 3 实际测试3…

PyTorch使用教程(6)一文讲清楚torch.nn和torch.nn.functional的区别

torch.nn 和 torch.nn.functional 在 PyTorch 中都是用于构建神经网络的重要组件&#xff0c;但它们在设计理念、使用方式和功能上存在一些显著的区别。以下是关于这两个模块的详细区别&#xff1a; 1. 继承方式与结构 torch.nn torch.nn 中的模块大多数是通过继承 torch.nn…

移动端布局 ---- 学习分享

响应式布局实现方法 主流的实现方案有两种: 通过rem \ vw/vh \ 等单位,实现在不同设备上显示相同比例进而实现适配. 响应式布局,通过媒体查询media 实现一套HTML配合多套CSS实现适配. 在学习移动端适配之前,还需要学习移动端适配原理: 移动端适配原理(Viewport) 了解VSCo…

cuda + cudnn安装

1.安装CUDA Toolkit 在设备管理器&#xff08;此电脑–右键–属性&#xff09;的显示适配器中可以查看自己的显卡型号&#xff0c;去下载对应的CUDA Toolkit 。或者输入以下命令查看Driver Version &#xff0c;cuda Version&#xff1a;12.2代表12.2版本以下兼容可以进行安装 …

DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图

在当今数字化飞速发展的时代&#xff0c;开源已成为推动技术创新与协作的重要力量。DevUI 作为开源领域的重要一员&#xff0c;其发展历程与成果备受关注。值此之际&#xff0c;GitCode 精心整理了 DevUI 年度运营报告&#xff0c;为您全面呈现 DevUI 社区在过去一年里的开源之…

python中的RPA->playwright自动化录制脚本实战案例笔记

playwright录制功能使用绕过登录操作 1、首先安装playwright pip install playwright2、 安装支持的浏览器 playwright install # 安装支持的浏览器&#xff1a;cr, chromium, ff, firefox, wk 和 webkit3、接着在自己的项目下运行录制命令&#xff1a; playwright codegen…

如何选择适合特定项目需求的人工智能学习框架?

人工智能学习框架&#xff08;AI Learning Framework&#xff09;是一种用于开发、训练和部署人工智能模型的软件平台&#xff0c;旨在简化AI模型的设计、训练和部署过程。这些框架通常提供一系列工具、库和预构建模块&#xff0c;使开发者能够快速实现机器学习任务&#xff0c…

Spring Bug解决

报错&#xff1a; Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type com.itxl.spring6.iocxml.User available: expected single matching bean but found 2: user,user1 at org.sp…

U盘被格式化后的数据救赎与防范策略

一、U盘格式化后的数据困境 在日常的工作与生活中&#xff0c;U盘作为数据传输与存储的重要工具&#xff0c;扮演着不可或缺的角色。然而&#xff0c;当U盘不幸遭遇格式化操作后&#xff0c;存储在其中的宝贵数据瞬间化为乌有&#xff0c;给用户带来极大的困扰。格式化后的U盘…

【AI论文】LlamaV-o1:重新思考大型语言模型(LLMs)中的逐步视觉推理方法

摘要&#xff1a;推理是解决复杂多步骤问题的基本能力&#xff0c;特别是在需要逐步顺序理解的视觉环境中尤为重要。现有的方法缺乏一个全面的视觉推理评估框架&#xff0c;并且不强调逐步解决问题。为此&#xff0c;我们通过三项关键贡献&#xff0c;提出了一个在大型语言模型…

【HTTP】详解

目录 HTTP 基本概念啥是HTTP&#xff0c;有什么用&#xff1f;一次HTTP请求的过程当你在浏览器中输入一个浏览器地址&#xff0c;它会发送什么 &#xff1f;---&#xff08;底层流程&#xff09;HTTP的协议头请求头&#xff08;对应客户端&#xff09;一些请求头请求方法 响应头…