【Python】flask

news2024/11/18 5:37:40

一、Flask教程

Flask是一个免费的web框架,也是一个年轻、充满活力的小型框架,开发文档齐 全,社区活跃度高,有着众多支持者。

 

Flask的设计目标是实现一个WSGI的微框架, 其核心代码十分简单。 Flask框架在中小型企业中的占有率比较高web框架,一般是用于开发轻量级web应 用程序,Flask框架在市场占用率来说排名也是比较靠前的。本文主要介绍的内容是 Flask框架的基本知识,包括它的基本结构以及它与Django框架的对比。

 

Flask框架的基本结构图,如下所示:

7ac200e7fd6a479d8166913773244e30.png

 

 为了提高开发效率,减少冗余的代码,Flask框架会抽出web开发中的共同部分,以 便在不同的页面中多次使用该部分。当客户端想要从web服务器中获取某些信息数据 时,便会发起一个HTTP请求(例如,我们平时在浏览器中输入一个URL),Web应用 会在后台,进行相应的业务处理(例如,读取数据库或者进行一些计算),然后读取 用户需要的数据,生成相应的HTTP响应。如果访问的是静态资源,那么直接返回资 源即可,不需要进行业务操作。

 

 

二、Flask安装

使用以下指令安装:

pip install flask

安装成功后,输入指令可以查看到版本

import flask

print(flask.__version__)

0f75ad76dd0a4d71b3eddf2765bba35b.png

 

 

 

 

 

三、最小的应用

【步骤】:

  1. 导入Flask包
  2. 创建一个Flask对象
  3. 声明路由,在路由下面写想要展示出的内容
  4. 使用Flask 的run()方法在本地的服务器上运行应用程序;

 

为了测试 Flask 安装,请在编辑器中将以下代码输入 至一个py文件:

from flask import Flask  # 必须在项目中导入Flask模块。

# 创建一个Flask的对象
app = Flask(__name__)  # Flask类的一个对象是我们的WSGI应用程序。Flask构造函数使用当前模块(__name __)的名称作为参数。


# 声明路由; 必须以斜杠开头
@app.route('/')
def hello_world():
    return '<h1>Hello World</h1>'


@app.route('/index')
def hello_world2():
    return '<h1>Hello World2</h1>'


if __name__ == '__main__':
    app.run()
c9ca92f460a640cb9e0b4e0f45ed4252.png c59df4358ef743e59c1fa472aea3568f.png

请求的端口是什么?就是你请求的ip端口后面的以斜杠开头的内容,在请求ip后面不加路由默认是/


Flask类的route()函数是一个装饰器,它告诉应用程序哪个URL应该调用相关的函数。

app.route(rule, options)
  • rule 参数表示与该函数的URL绑定。
  • options 是要转发给基础Rule对象的参数列表。

在上面的示例中,'/ ' URL与hello_world()函数绑定,'/index ' URL与hello_world2()函数绑定。

因此,当在浏览器中打开web服务器的主页时,将呈现该函数的输出。

最后,Flask类的run()方法在本地开发服务器上运行应用程序。

app.run(host, port, debug, options)

993f307db5ee4d4b928ee7fb63cd0813.png

 


修改一下app.run()的参数

from flask import Flask  # 必须在项目中导入Flask模块。

# 创建一个Flask的对象
app = Flask(__name__)  # Flask类的一个对象是我们的WSGI应用程序。Flask构造函数使用当前模块(__name __)的名称作为参数。


# 声明路由; 必须以斜杠开头
@app.route('/')
def hello_world():
    return '<h1>Hello World</h1>'


@app.route('/index')
def hello_world2():
    return '<h1>Hello World2</h1>'


if __name__ == '__main__':
    app.run(host='192.168.*.*', port=5001, debug=True)

修改成功后,可以访问修改过的ip

00332a2602ec4b0d9d266fadf8e48d97.png


【注意】 ip不能随便乱写,按Win+R键,输入cmd,进入界面后输入ipcoonfig来查看ip4334687609fc47c793d7d774dbc0216b.png

 

四、处理URL参数

在web程序中,URL并不一定是静止不变的,可能会存在动态的情况,需要在对应处 理函数中的列表参数声明变量名。

from flask import Flask

app = Flask(__name__)


@app.route('/hello/<name>')
def hello(name):
    return '你好 %s' % name


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

de03ddc8ff3d4783ab9e0ee21098a68c.png

 


在Flask框架的URL中,除了可以使用字符串类型参数之外,还可以使用以下参数:

  • int:表示整型参数,例如"/hello/1" float:
  • 表示浮点型参数,例如"hello/1.1"
from tkinter import N
from flask import Flask

app = Flask(__name__)


@app.route('/blog/<int:ID>')
def show_age(ID):
    return '我的年龄是:%d' % ID + '岁'


@app.route('/rev/<float:No>')
def show_money(No):
    return '我的身高是%f' % No + 'cm'


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

ddb070162b46408cb8ddff8f62ea53db.png

ac095222442844f4b8283b721bd6ea21.png


运行上述代码之后,在浏览器中输入如下URL:
 http://127.0.0.1:5000/blog/整型参数

 http://127.0.0.1:5000/rev/浮点型参数

五、传递HTTP请求

在计算机应用中,HTTP协议是互联网中数据通信的基础,各位读者需要熟悉使用的 HTTP方法只有两种:GET与POST。在Flask框架中,默认使用的方法是GET方法,通 过使用URL装饰器传递”方法类型“参数的方式的方式,可以让同一个URL同时处理两 种请求方法。


from flask import Flask, request

html_txt = """
<html>
<body>
    <h2>如果收到了get请求</h2>
    <form method='post'>
        <input type='submit' value='按下我发送post请求' />
    </form>
</body>
</html>
"""
app = Flask(__name__)


@app.route('/hello', methods=['GET', 'POST'])  # 输入路由后,默认是GET请求
def hello():
    if request.method == 'GET':
        return html_txt
    else:
        return '<h2>我已经接受到了post请求</h2>'


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

默认是GET请求:

174cc077d78844a4966e3eb8a5fa415a.png

 

点击按钮后:0602d3c5fa994da8b53f4631c972677e.png


 上面的程序,都是在同一个URL中实现POST请求和GET请求。

 

redirect()方法可以实现重定向

from flask import Flask, request, redirect, url_for

app = Flask(__name__)


@app.route('/admin')
def hello_admin():
    return '你好,管理员'


@app.route('/guest/<guest>')
def hello_guest(guest):
    return '你好%s,你是游客' % guest


@app.route('/user/<name>')
def hello_user(name):
    if name == 'admin':
        return redirect('/admin')  # redirect()实现重定向,如果输入的参数等于admin、,则重定向到/admin路由下,否则重定向到/guest下
    else:
        return redirect('/guest/<guest>')


if __name__ == '__main__':
    app.run(debug=True)
输入/user/admin e41a217619d343e19f09998c26a71135.png按下回车会跳转到/admin路由 2bffe9b836494d6196facb1161ce93f7.png

输入/user/guest/123

31dbc5d5f5d14765bf5d841add42cd8a.png

  按下回车会跳转到/guest<guest>界面

a2d3f3e89f554f91a8c382d0f1ca4837.png


 

但是你会发现一个问题,虽然跳转过来了,但是你想传递的参数123没有传递过去,这时候可以使用url_for()方法,它只会跳转到指定界面,并且将参数传递过去;

 

另外,Flask框架可以 使用 url_for() 来指定URL。


方法 url_for() 可以传递两个参数:

  • endpoint:表示将要传递的函数名
  • values:是关键字参数,即有多个key=value的形式参数,对应URL中的变量部 分。
from flask import Flask, request, redirect, url_for

app = Flask(__name__)


@app.route('/admin')
def hello_admin():
    return '你好,管理员'


@app.route('/guest/<guest>')
def hello_guest(guest):
    return '你好%s,你是游客' % guest


@app.route('/user/<name>')
def hello_user(name):
    if name == 'admin':
        return redirect(url_for('hello_admin'))  
    else:
        return redirect(url_for('hello_guest', guest=name))

参数传递成功:

52cfe76b658149ccbd80419d57655c91.png

 


在上述代码中,在浏览器输入 http://127.0.0.1:5000/user/admin ,URL将重定 向到 http://127.0.0.1:5000/admin ,执行函数hello_admin()的功能;如果接收 的参数不是admin,则会将URL重定向到 http://127.0.0.1:5000/guest/参数 , 执行函数hello_guest()的功能。

 六、模拟实现用户登录系统

 

from flask import Flask, request, redirect, url_for

app = Flask(__name__)
html_text = '''<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initialscale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="http://127.0.0.1:5000/login" method="post">
        <p>请输入</p>
        <p><input type="text" name="username" /></p>
        <p><input type="password" name="password" /></p>
        <p><input type="submit" value="登录"></p>
    </form>
</body>
</html>
'''


@app.route('/success/<name>')
def success(name):
    return '欢迎%s' % name + '登录本系统'


@app.route('/')
def index():
    return html_text


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user = request.form.get('username')  # 通过html页面的input标签中的name属性拿值,所以此处的值必须和input标签中的name属性值一致
        password = request.form.get('password')
        # print(user)
        # print(password)
        inner_user_password = {'user': 'Admin', 'password': '123'}
        if user == inner_user_password['user'] and password == inner_user_password['password']:
            print('登录成功')
            return redirect(url_for('success', name=user))
        else:
            return '<p>您输入的用户名和密码错误</p>'


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

输入正确账号密码:

点击登录之后,Admin 便会作为参数,被作为参数传递给/success/后面的参数 name。

abc6cc5a4ecf47b7a9ba96187e2e7589.png

beea0fdb93be4980be88f1349e7b1f3d.png 

 输入错误的账号和密码:

318904c3e63648cf86efee1b324a980e.png

840525832736490093baf1f123790218.png

 


更好看的页面
from flask import Flask, request, redirect, url_for

app = Flask(__name__)

html_text = '''
<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
	<style>
		* {
			margin: 0;
			padding: 0;
		}

		a {
			text-decoration: none;
		}

		input,
		button {
			background: transparent;
			border: 0;
			outline: none;
		}

		body {
			height: 100vh;
			background: linear-gradient(#141e30, #243b55);
			display: flex;
			justify-content: center;
			align-items: center;
			font-size: 16px;
			color: #03e9f4;
		}

		.loginBox {
			width: 400px;
			height: 364px;
			background-color: #0c1622;
			margin: 100px auto;
			border-radius: 10px;
			box-shadow: 0 15px 25px 0 rgba(0, 0, 0, .6);
			padding: 40px;
			box-sizing: border-box;
		}

		h2 {
			text-align: center;
			color: aliceblue;
			margin-bottom: 30px;
			font-family: 'Courier New', Courier, monospace;
		}

		.item {
			height: 45px;
			border-bottom: 1px solid #fff;
			margin-bottom: 40px;
			position: relative;
		}

		.item input {
			width: 100%;
			height: 100%;
			color: #fff;
			padding-top: 20px;
			box-sizing: border-box;
		}

		.item input:focus+label,
		.item input:valid+label {
			top: 0px;
			font-size: 2px;
		}

		.item label {
			position: absolute;
			left: 0;
			top: 12px;
			transition: all 0.5s linear;
		}

		.btn {
			padding: 10px 20px;
			margin-top: 30px;
			color: #03e9f4;
			position: relative;
			overflow: hidden;
			text-transform: uppercase;
			letter-spacing: 2px;
			left: 35%;
		}

		.btn:hover {
			border-radius: 5px;
			color: #fff;
			background: #03e9f4;
			box-shadow: 0 0 5px 0 #03e9f4,
				0 0 25px 0 #03e9f4,
				0 0 50px 0 #03e9f4,
				0 0 100px 0 #03e9f4;
			transition: all 1s linear;
		}

		.btn>span {
			position: absolute;
		}

		.btn>span:nth-child(1) {
			width: 100%;
			height: 2px;
			background: -webkit-linear-gradient(left, transparent, #03e9f4);
			left: -100%;
			top: 0px;
			animation: line1 1s linear infinite;
		}

		@keyframes line1 {

			50%,
			100% {
				left: 100%;
			}
		}

		.btn>span:nth-child(2) {
			width: 2px;
			height: 100%;
			background: -webkit-linear-gradient(top, transparent, #03e9f4);
			right: 0px;
			top: -100%;
			animation: line2 1s 0.25s linear infinite;
		}

		@keyframes line2 {

			50%,
			100% {
				top: 100%;
			}
		}

		.btn>span:nth-child(3) {
			width: 100%;
			height: 2px;
			background: -webkit-linear-gradient(left, #03e9f4, transparent);
			left: 100%;
			bottom: 0px;
			animation: line3 1s 0.75s linear infinite;
		}

		@keyframes line3 {

			50%,
			100% {
				left: -100%;
			}
		}

		.btn>span:nth-child(4) {
			width: 2px;
			height: 100%;
			background: -webkit-linear-gradient(top, transparent, #03e9f4);
			left: 0px;
			top: 100%;
			animation: line4 1s 1s linear infinite;
		}

		@keyframes line4 {

			50%,
			100% {
				top: -100%;
			}
		}
	</style>
</head>

<body>
	<div class="loginBox">
		<h2>login</h2>
		<form action="http://127.0.0.1:5000/login" method="post">
			<div class="item">
				<input type="text" required name="username">
				<label for="">用户名</label>
			</div>
			<div class="item">
				<input type="password" required name="password">
				<label for="">密码</label>
			</div>
			<button class="btn">登录
				<span></span>
				<span></span>
				<span></span>
				<span></span>
			</button>
		</form>
	</div>
</body>
</html>

'''


@app.route('/success/<name>')
def success(name):
    return '欢迎%s' % name + '登录本系统'


@app.route('/')
def index():
    return html_text


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user = request.form.get('username')  # 通过html页面的input标签中的name属性拿值,所以此处的值必须和input标签中的name属性值一致
        password = request.form.get('password')
        # print(user)
        # print(password)
        inner_user_password = {'user': 'Admin', 'password': '123'}
        if user == inner_user_password['user'] and password == inner_user_password['password']:
            print('登录成功')
            return redirect(url_for('success', name=user))
        else:
            return '<p>您输入的用户名和密码错误</p>'


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

973bd15357eb45f19ceaac3135ef85f3.png

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

pwn的kali64虚拟机环境搭建记录

自己记着备用&#xff0c;pwn的环境和工具 虚拟机&#xff1a;VMware Workstation Pro Linux版本&#xff1a;kali64 总参考&#xff1a; pwn 环境搭建&#xff08;wsl/vmware&#xff09; pwn入门之环境搭建 目前就装这些&#xff0c;以后改了再更新&#xff08;但愿 安装ka…

第 4 章 HBase 进阶

第 4 章 HBase 进阶 4.1 Master 架构1&#xff09;Meta 表格介绍&#xff1a;&#xff08;警告&#xff1a;不要去改这个表&#xff09; 4.2 RegionServer 架构1&#xff09;MemStore2&#xff09;WAL&#xff08;预写日志&#xff09;3&#xff09;BlockCache 4.3 写流程2&…

使用kubeadm搭建生产环境的多master节点k8s高可用集群

环境centos 7.9 目录 1.对安装 k8s 的节点进行初始化配置 2 通过 keepalivednginx 实现 k8s apiserver 节点高可用 3、kubeadm 初始化 k8s 集群 4.扩容 k8s 控制节点&#xff0c;把 xuegod62 加入到 k8s 集群 5、扩容 k8s 控制节点&#xff0c;把 xuegod64 加入到 k8s 集群…

06_Uboot顶层Makefile分析_前期所做内容

目录 U-Boot顶层Makefile分析 版本号 MAKEFLAGS变量 命令输出 静默输出 设置编译结果输出目录 代码检查 模块编译 获取主机架构和系统 设置目标架构、交叉编译器和配置文件 调用scripts/Kbuild.include 交叉编译工具变量设置 导出其他变量 U-Boot顶层Makefile分析…

Kafka架构原理(三)

三、Kafka架构原理 3.1 整体架构图 一个典型的kafka集群中包含若干个Producer&#xff0c;若干个Broker&#xff0c;若干个Consumer&#xff0c;以及一个zookeeper集群&#xff1b; kafka通过zookeeper管理集群配置&#xff0c;选举leader&#xff0c;以及在Consumer Group发…

软件多语言文案脚本自动化方案

开发高效提速系列目录 软件多语言文案脚本自动化方案 软件多语言文案脚本自动化方案 背景目标整体方案1. 创建文案资源文件2. python脚本开发3. Python脚本执行与管理4. 人员职责分配 PyCharm使用说明1. PyCharm下载2. PyCharm安装配置3. 异常情况解决 总结 博客创建时间&…

中间件漏洞(一)CVE-2013-4547(文件名逻辑漏洞)

目录 1. 了解nginx的工作原理 2. 漏洞原理及举例分析 3. 前端php源码分析 4. 注入思路 5. 漏洞复现 5.1 上传文件并抓包分析 5.2 通过访问文件执行php 注意一点 6. 漏洞修复 1. 了解nginx的工作原理 nginx是以PHP语言为主。像Apache一样&#xff0c;Nginx自身是不支持解…

基于黏菌算法的极限学习机(ELM)回归预测-附代码

基于黏菌算法的极限学习机(ELM)回归预测 文章目录 基于黏菌算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于黏菌算法优化的ELM5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;本文利用黏菌算法对极限学习机进行优化&#xff0c;并…

国民技术N32G430开发笔记(15)- IAP升级 树莓派串口发送数据

IAP升级 树莓派串口发送数据 1、树莓派接入usb转串口模块后&#xff0c;会生成/dev/ttyUSB0节点&#xff0c;因为树莓派内核已经编译usb_serial以及各模块的驱动。 我们直接对ttyUSB0节点编程即可。 2、协议同上一节 cmd data_lenght data0 … datax checksum 1、获取版本…

AutoDL-GPU租用平台使用(LLM 备用)

网址&#xff1a;AutoDL-品质GPU租用平台-租GPU就上AutoDL 1 打开网址 查看下显卡型号及价格&#xff1a;A100 ( 80 G 显存) 6.68/小时 、4090&#xff08;24G 显存&#xff09;2.68/小时 2 创建实例 1.注册登录后进入控制台&#xff08;页面右上角&#xff09;&#xff0…

08 KVM虚拟机配置-总体介绍

文章目录 08 KVM虚拟机配置-总体介绍8.1 概述8.2 基本格式8.3 配置流程 08 KVM虚拟机配置-总体介绍 8.1 概述 Libvirt工具采用XML格式的文件描述一个虚拟机特征&#xff0c;包括虚拟机名称、CPU、内存、磁盘、网卡、鼠标、键盘等信息。用户可以通过修改配置文件&#xff0c;对…

【应急响应】日志自动提取分析项目ELKLogkitLogonTracerAnolog等

日志自动提取-七牛Logkit&观星应急工具 1、七牛Logkit&#xff1a;(Windows&Linux&Mac等) https://github.com/qiniu/logkit/ 支持的数据源&#xff08;各类日志&#xff0c;各个系统&#xff0c;各个应用等&#xff09; File: 读取文件中的日志数据&#xff0c;包…

第二章 主机规划与磁盘分区

要安装好一部Linux主机并不是那么简单的事情&#xff0c;你必须要针对distributions的特性、服务器软件的能力、未来的升级需求、硬件扩充性需求等等来考虑&#xff0c;还得要知道磁盘分区、文件系统、Linux操作较频繁的目录等等&#xff0c;都得要有一定程度的了解才行。 2.1…

训练CV模型常用的Tips Tricks

训练CV模型常用的Tips & Tricks主要从以下9个方面进行介绍&#xff1a; 图像增强更好的模型学习率和scheduler优化器正则化手段标签平滑知识蒸馏伪标签错误分析 1. 图像增强 以下列出了许多增强方式&#xff0c;有的甚至没见过&#xff0c;但是也不是每一种增强方式都是…

极化码的入门与探索

文章目录 极化码的基础先验知识二进制输入离散无记忆信道模型(Binary-input Discreten Memoryless Channel, B-DMC)二进制离散输入信道的ML判决和错误率B-DMC相关参数的定义和理解 两信道极化N信道极化的解释信道极化分解的蝶形结构补充&#xff1a;生成矩阵的结构 极化码的基础…

Python算法设计 - 快速排序

目录 一、快速排序二、Python算法实现 一、快速排序 快速排序的概念相信大家都能理解&#xff0c;下面这个算法是基于同样想法的另一种算法&#xff0c;其中利用到了分区。如果实施正确&#xff0c;这是一种非常有效的算法&#xff0c;在预期的O(n.log n) 时间内运行&#xff…

性能测试场景分析并设计?超细案例讲解,看这篇就够了

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试场景&…

1.1 基于B/S 结构的 Web 应用

文章目录 1.1 基于B/S 结构的 Web 应用1.2 JDK安装与配置1.3 服务器Tomcat下载与安装1.4 Eclipse安装与使用1.4.1 Eclipse 下载及创建Dynamic Web Project1.4.2 Eclipse 中的编码问题1.4.3 将Tomcat和Eclipse相关联1.4.4 Eclipse 自动部署项目到 Tomcat 的 webapps 目录 1.5 My…

ChatGLM-6B模型微调实战(以 ADGEN (广告生成) 数据集为例)

1 介绍 对于 ChatGLM-6B 模型基于 P-Tuning v2 的微调。P-Tuning v2 将需要微调的参数量减少到原来的 0.1%&#xff0c;再通过模型量化、Gradient Checkpoint 等方法&#xff0c;差不多需要 7GB或则8GB 显存即可运行。 2 环境 2.1 python 环境 conda create -n py310_cha…

go 打包文件夹成zip文件

go 打包文件夹成zip文件 代码有些乱&#xff0c;找不到合适的例子&#xff0c;和优雅的代码 当前代码打包文件是在 需要打包的目录下&#xff0c;测试的时候注意文件翻倍容量 writer, err : zzip.CreateHeader(header) //这里创建文件时注意不要用完整路径 zip中会生产完整路径…