【Python Web】Flask超实用基础知识总结(内附代码)

news2024/11/25 8:23:45

在这里插入图片描述
Flask是一种轻量级Web应用框架,使用Python编写。它是一个简单易用的框架,适合构建小型到中型的Web应用程序。Flask提供了基本的Web开发功能,如路由、请求处理、模板渲染、文件上传等。

下面是Flask的一些基础语法

文章目录

  • 1.静态文件处理
  • 2.Flask中的配置文件
    • 2.1 基于全局变量的方式
    • 2.2 基于类的方式
  • 3.路由和视图
    • 3.1 路由写法
    • 3.2视图写法
  • 4.模板传参和全局方法
    • 4.1 模板传参
    • 4.2 全局模板方法定义
  • 5.装饰器
    • 5.1装饰器语法
    • 5.2其它装饰器

1.静态文件处理

文件夹目录

image-20230430155831782

  • app.py
from flask import Flask, render_template
# 静态文件处理
# static_folder:静态文件所在文件夹
# static_url_path:静态文件url文件夹路径
app = Flask(__name__, static_folder='static', static_url_path="/yy/yy")

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

if __name__ == '__main__':
    app.run()
  • test.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<img src="{{ url_for("static",filename='/2345_image_file_copy_2.jpg')}}">
<img src="/yy/yy/2345_image_file_copy_2.jpg">
</body>
</html>
  • 结果:

<img src="{{ url_for("static",filename='/2345_image_file_copy_2.jpg')}}">,这一种方式方便管理
在这里插入图片描述

2.Flask中的配置文件

2.1 基于全局变量的方式

  • configs/settings.py
from datetime import timedelta

flask_ENV='development'
SECRET_KEY = '_5#y2L"F4Q8zxec]/'
SQLALCHEMY_DATABASE_URI = 'XXXX'
UPLOAD_FOLDER = "XXX"
PERMANENT_SESSION_LIFETIME = timedelta(days=7)


#导入其它配置文件的配置,如果同名会将这里的覆盖掉
try:
    from .localsettings import *
except ImportError:
    pass   
  • app.py
from flask import Flask

app = Flask(__name__)
#从配置文件中导入文件
app.config.from_object("configs.settings")

@app.route('/')
def hello_world():
    #读取参数app.config.get() 或者 current_app.config.get()
    return app.config.get('UPLOAD_FOLDER')

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

2.2 基于类的方式

  • configs/settings.py
from datetime import timedelta

#公共配置,被其它类继承
class BaseSettings(object):
    SECRET_KEY = '_5#y2L"F4Q8zxec]/'

class DevSetting(BaseSettings):
    flask_ENV = 'development'
    DEBUG=True
    HOST:"xx.xx.xx.xx"
    SQLALCHEMY_DATABASE_URI = 'XXXX'
    UPLOAD_FOLDER = "Dev_Path"

class ProdSettings():
    HOST: 'xx.xx.xx.xx'
    SQLALCHEMY_DATABASE_URI = 'XXXX'
    UPLOAD_FOLDER = "Pro_Path"
    PERMANENT_SESSION_LIFETIME = timedelta(days=7)
  • app.py
from flask import Flask

app = Flask(__name__)
app.config.from_object("configs.settings.DevSettings")

@app.route('/')
def hello_world():
    #读取参数app.config.get() 或者 current_app.config.get()
    return app.config.get('UPLOAD_FOLDER')

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

3.路由和视图

3.1 路由写法

  • 一般写法
@app.route('/login')
def login():
return render_template('login.html')
  • 动态路由
@app.route('/login/<name>')
def login(name):
    print(type(name))
    return render_template('test.html')
@app.route('/login/<int:age>')
def login(age):
    print(type(age))
    return render_template('test.html')

3.2视图写法

  • 视图函数
@app.route('/login')
def login():
    return render_template('login.html')
  • 视图类
from flask import Flask,render_template,views
app = Flask(__name__)

def decorator1(func):
    def inner(*args,**kwargs):
        print('before1')
        result = func(*args,**kwargs)
        print('after1')
        return result
    return inner

def decorator2(func):
    def inner(*args,**kwargs):
        print('before2')
        result = func(*args,**kwargs)
        print('after2')
        return result
    return inner

class UserView(views.MethodView):
    #允许的请求类型
    methods = ['GET',"POST"]
    #装饰器,这里加了两个装饰器
    decorators = [decorator1,decorator2]
    # 执行GET请求
    def get(self):
        print('get')
        return 'get'
    # 执行POST请求
    def post(self):
        print('post')
        return 'post'
    
# 第一个参数为路由路径,第二个相当于endpoint="user"
app.add_url_rule('/user', view_func=UserView.as_view('user')) 

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

执行结果:

image-20230430164105769

4.模板传参和全局方法

4.1 模板传参

传入的参数可以是多种类型,也可以是方法,如下面的func就是一个方法

  • app.py
from flask import Flask,render_template
app = Flask(__name__)

def func(name):
    return '你好,' + name

@app.route('/test')
def index():
    info = ["奇幻","智能建造小硕","公众号"]
    return render_template('test.html',info=info,f=func)

if __name__ == '__main__':
    app.run()
  • test.html

    Flask使用Jinja2模板语法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>作者:{{ info[0] }}</h1><br>
<h1>{{ info[2] }}:{{ info[1] }}</h1><br>
<h1>{{ f("欢迎关注~") }}</h1>
</body>
</html>

结果:
在这里插入图片描述

4.2 全局模板方法定义

模板中可以直接使用,不用作为参数传入方法。

注意:蓝图中定义的全局模板方法只能在蓝图模板范围内可以使用

#全局方法
#可以不用再响应函数中传,直接在HTML中把global的函数名写上即可
@app.template_global() #  {{ func1("XXX") }}
def func1(arg):
    "xxx"
    return  arg

#过滤器
#过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,这就用到了过滤器。 
#过滤器的使用方式为:变量名 | 过滤器。 过滤器名写在变量名后面,中间用 | 分隔。
#第一个参数是你要过滤的那个值(自身),Flask内有很多自带的过滤器
@app.template_filter() # {{ "arg1"|func2(arg2) }}
def func2(arg1,arg2):
    "..."
    return XXX 

5.装饰器

5.1装饰器语法

#自定义一个用户验证的装饰器
def auth(func):
    @wraps(func)
    def inner(*args,**kwargs):
        if 'username' in session:
            logsuccessmsg = f"登录成功{session['username']}"
            flash(logsuccessmsg)
            return func(*args,**kwargs) 
        # flash和它的名字一样,是闪现,意思就是我们的消息只会显示一次,当我们再次刷新也面的时候,它就不存在了,而正是这点,它经常被用来显示一些提示消息,比如登陆之后,显示欢迎信息等。
    else:
        flash("登录失败!")
        return redirect(url_for("login"))
    return  inner

#使用用户验证路由,判断是否登录,登录才能进入首页,否则进入登录页面
@app.route('/')
@app.route('/index')
@auth #相当于: auth(index())
def index():
    return render_template("index.html", account_name=session["username"],books=Books.query.all())

5.2其它装饰器

from flask import Flask,render_template,request

app = Flask(__name__)

@app.before_request #在请求执行之前执行
def before_request1():
    if request.path == '/login':
        return   
    print('before_request1')
    # return 'XXX' ,如果有return,这返回return的值,后面的不执行,可以作为用户验证

@app.after_request 
def after_request1(response):
    print('after_request1')
    return response # 一定要有return,为请求执行返回的结果

# 处理异常,接受参数,可以重定向到指定页面
@app.errorhandler(Exception)
def error(e):
    print("error")
    return redirect("/")

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

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

Flask是一个灵活和易用的框架,可以帮助我们快速构建Web应用程序。如果您想深入了解Flask的更多功能和用法,请参阅Flask官方文档。
https://dormousehole.readthedocs.io/en/2.1.2/index.html

希望有所帮助!喜欢就点个赞吧!

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

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

相关文章

【建议收藏】计算机视觉是什么?这几个计算机视觉的核心任务你真的了解吗?

文章目录 &#x1f4da;引言&#x1f4d6;计算机视觉的核心任务&#x1f4d1;图像分类和对象识别&#x1f4d1;目标检测&#x1f4d1;语义分割&#x1f4d1;实例分割&#x1f4d1;图像生成 &#x1f4d6;计算机视觉的应用领域&#x1f4d1;人脸识别&#x1f4d1;自动驾驶&#…

【论文阅读】LORA: LOW-RANK ADAPTATION OF LARGE LAN- GUAGE MODELS

3.最近很多工作好像都绕不开lora&#xff0c;无论是sd还是llm.... 1. 背景 问题&#xff1a;大模型重新训练所有模型参数的完全微调变得不太可行。lora在做什么 我们提出了低秩自适应&#xff0c;即LoRA&#xff0c;它冻结预先训练的模型权重&#xff0c;并将可训练的秩分解矩…

高级数据结构 Trie树(字典树)

高级数据结构 Trie树&#xff08;字典树&#xff09; &#xff08;Trie Tree&#xff09;字典树_Rkun18的博客-CSDN博客 字典树节点表示 #define TRIE_MAX_CHAR_NUM 26 //这里你可以自由设置 根据不同需求设置 如果有大小或者其他符号你就需要增大这个数字struct TrieNode{T…

在amd64与arm上用paddlelite部署paddelOCR(Ascend硬件)

由于部署的硬件是华为昇腾 NPU&#xff08;Ascend310&#xff09;&#xff0c;参考网址https://www.paddlepaddle.org.cn/lite/v2.10/demo_guides/huawei_ascend_npu.html#npu-paddle-lite 先拉取paddlelite用来编译库 git clone https://github.com/PaddlePaddle/Paddle-Lit…

2. Java 异常体系

2.1 Throwable java.lang.Throwable 类是 Java 程序执行过程中发生的异常事件对应的类的根父类。 Throwable 中的常用方法&#xff1a; public void printStackTrace()&#xff1a;打印异常的详细信息。 包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得…

倾斜摄影超大场景的三维模型轻量化纹理压缩的关键技术

倾斜摄影超大场景的三维模型轻量化纹理压缩的关键技术 倾斜摄影超大场景的三维模型轻量化处理中纹理压缩是轻量化处理的重要手段之一&#xff0c;可以在保证模型真实感的前提下&#xff0c;减小数据体积、降低传输带宽和提高渲染性能。以下是几个关键的纹理压缩技术&#xff1a…

自然语言处理知识抽取(pkuseg、DDParser安装及使用)

一、分词简介 1.基本概念 分词是自然语言处理中的一个重要步骤&#xff0c;它可以帮助我们将文本分成一个个词语&#xff0c;以便更好地理解和分析文本。在计算机视觉、语音识别、机器翻译等领域&#xff0c;分词都扮演着重要的角色。 目前&#xff0c;常用的分词库包括 jie…

搭建Redis主从集群+哨兵+代理predixy

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Redis是什么&#xff1f;二、搭建Redis集群步骤1.环境和版本2.Redis 安装部署3.主从同步配置4.哨兵模式配置5.代理predixy配置 总结 前言 提示&#xff1a…

深度学习 -- Dataset与DataLoader

前言 在模型训练的步骤中&#xff0c;数据的部分非常重要&#xff0c;它的过程主要分为数据收集、数据划分、数据读取、数据预处理。 数据收集的有原始样本和标签(Img&#xff0c;label) 数据集的划分需要分为训练集、验证集、测试集。 训练集负责训练模型&#xff0c;验证集…

【C++】C++11常用特性总结

哥们哥们&#xff0c;把书读烂&#xff0c;困在爱里是笨蛋&#xff01; 文章目录 一、统一的列表初始化1.统一的{}初始化2.std::initializer_list类型的初始化 二、简化声明的关键字1.decltype2.auto && nullptr 三、STL中的一些变化1.新增容器&#xff1a;array &…

趣说数据结构(练习2) —— 顺序表/链表力扣刷题(中等难度)

练习 2 —— 顺序表/链表力扣刷题&#xff08;中等难度&#xff09; 1. 反转链表 II 力扣原题&#xff1a;https://leetcode.cn/problems/reverse-linked-list-ii/ 题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从…

数据可视化大屏的页面布局以及自适应

在做数据可视化大屏之前&#xff0c;我们需要考虑到页面的布局问题以及页面缩放自适应问题&#xff0c;下面分别就这两个方面讲解。 页面布局 类似这种页面区块的明显划分&#xff0c;常用的布局方式有两种&#xff1a; 1、flex布局 2、grid布局 grid布局 grid布局可以按区块…

山东专升本计算机第二章-Windows7操作系统

Windows7操作系统 2.3Windows7的文件和文件夹管理 考点7 Windows7的基础知识 文件&#xff0c;是指存放在外存储器上的一组相关信息的•集合 文件名是操作系统中区分不同文件的唯一标志 文件名是由主文件名和扩展名两部分组成不能使用 ▏ < > * ? \ / &#xff1a; …

单向带头链表的添加修改删除操作

public class HeroNodeDemo {public static void main(String[] args) {HeroNode hero1 new HeroNode(1, "松江");HeroNode hero2 new HeroNode(2, "武松");HeroNode hero3 new HeroNode(3, "及时雨");HeroNode hero4 new HeroNode(4, "…

prometheus实战之一:用ansible部署

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 关于《prometheus实战》 《prometheus实战》是欣宸原创的系列文章&#xff0c;旨在通过实战操作来熟悉和掌握prometheus常规技能 本篇概览 本文是《promet…

spring 容器结构/机制debug分析--Spring 学习的核心内容和几个重要概念--IOC 的开发模式--综合解图

目录 Spring Spring 学习的核心内容 解读上图: Spring 几个重要概念 ● 传统的开发模式 解读上图 ● IOC 的开发模式 解读上图 代码示例—入门 xml代码 注意事项和细节 1、说明 2、解释一下类加载路径 3、debug 看看 spring 容器结构/机制 综合解图 Spring Spr…

使用SPY++查看窗口信息去分析C++客户端UI软件问题

目录 1、使用SPY查看窗口的信息 2、使用SPY查看某些软件UI窗口用什么UI组件实现的 2.1、查看海康视频监控客户端安装包程序 2.2、查看华为协同办公软件WeLink 2.3、查看字节协同办公软件飞书 2.4、查看最新版本的Chrome浏览器 2.5、查看小鱼易连视频会议客户端软件 2.6…

STM32H7 DMA

CubeMX配置 发送调用&#xff1a; 发送速度确实挺快的。 接收&#xff1a; HAL_UART_Receive_DMA(&huart1,Rxbuffer,sizeof(Rxbuffer)); 这个函数开启DMA接收,将收到的数据存放到Rxbuffer数组中去,当接收到了sizeof(Rxbuffer)个数据就会回调DMA1_Stream0_IRQHandler函数…

Linux-基本指令

文章目录 Centos用户新增及删除新增删除 两个理论概念管理贯穿 ls指令文件的操作-l (列出详细信息)-a&#xff08;显示所有的文件&#xff0c;包括隐藏文件&#xff09;-F&#xff08;在每个文件名后附上一个字符以说明该文件的类型&#xff09;-d&#xff08;将目录象文件一样…

CTF权威指南 笔记 -第二章二进制文件-2.1-汇编原理

目录 编译原理 GCC编译 四个阶段 (1)预处理阶段 (2)编译阶段 (3)汇编阶段 (4)链接阶段 预处理阶段 编译阶段 汇遍阶段 链接阶段 C语言的生命是从 源文件开始 的 每条C语言都必须要给翻译成 一系列的低级语言 最后 按照可执行文件格式打包 并且作为二进制文件保存起来…