Python 之 Flask 框架学习

毕业那会使用过这个轻量级的框架,最近再来回看一下,依赖相关的就不多说了,直接从例子开始。下面示例中的 html 模板,千万记得要放到 templates 目录下。

快速启动

hello world

from flask import Flask, jsonify, url_forapp = Flask(__name__)@app.route('/')
def hello_world():return '<h1>Hello World!</h1>'if __name__ == '__main__':app.run()

路由

既然涉及到web框架,就必然涉及到路由。

动态路由

动态路由就是将变量拼接到路由 url 当中,可以把字段编辑为<variable_name>,这个部分将会作为命名参数传递到你的函数。如果在动态路由中指定了变量的类型,比如 <int:user_id>,则需要按照指定类型进行传值,否则的话也会报错。参数也可以根据类似 request.args.get("id") 进行获取。

from flask import Flask, requestapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello World!'@app.route('/user/<username>')
def show_user_profile(username):id = request.args.get("id")return 'User %s, id %s' % (username, id)@app.route('/users/<int:user_id>')
def show_user_id(user_id):return 'User id %d' % user_idif __name__ == '__main__':app.run(debug=True)

构造 url

Flask 还可以用 url_for() 函数来给指定的函数构造URL,也称为反向路由。它接收函数名作为第一个参数,也接受对应 URL 规则的变量部分的命名参数。未知变量部分会添加到URL末尾作为查询条件。

from flask import Flask, url_forapp = Flask(__name__)@app.route('/')
def hello_world():return url_for('article', id=1, name="look")  # /article/1?name=look@app.route('/article/<id>')
def article(id):return f'id {id} article detail'if __name__ == '__main__':app.run()

http方法

HTTP 有许多的不同的构造方法访问 URL 方法。默认情况下,路由只回应 GET 请求,当时通过route() 装饰器传递 methods 参数可以改变这个行为,至于每个 method 对应的行为,这块就不多细说了。

from flask import Flask, url_for, requestapp = Flask(__name__)@app.route('/', methods=['GET', 'POST'])
def index():if request.method == 'POST':return "go post method"elif request.method == 'GET':return "go get method"if __name__ == '__main__':app.run()

 模板

html模板文件一般默认是放在 templates 目录下的,如果没有这个目录的话,可以自己新建一个。

templates/index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>template</title>
</head>
<body>
<h1>hello world!</h1>
</body>
</html>
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def hello_world():return render_template('index.html')if __name__ == '__main__':app.run()

变量替换

而且还可以将内容传递到模板文件进行展示,下面这种也是展示 hello world!只不过我们将静态文件的内容藏起来了,通过后端返回的内容再显示出来,用的是模板语法,两种方法在前端显示的都一样。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>template</title>
</head>
<body>
<h1>{{content}}</h1>
</body>
</html>
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def hello_world():content = "hello world!"return render_template('index.html', content=content)if __name__ == '__main__':app.run()

当然,也可以将对象实例传递到模板中去。

user_index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>user</title>
</head>
<body>
<h1>hello {{user.name}}</h1>
</body>
</html>

models.py

class User:def __init__(self, id, name):self.id = idself.name = name

main.py

from flask import Flask, render_template
from models import Userapp = Flask(__name__)# 引用模板
@app.route('/')
def hello_world():content = 'hello world!'return render_template('index.html', content=content)@app.route('/user')
def user_index():user = User(1, 'Looking')return render_template('user_index.html', user=user)if __name__ == '__main__':app.run()

条件语句 

info.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>条件语句</title>
</head>
<body>{% if user.id == 1 %}<h1> Hello {{user.name}}</h1>{% else %}<h1>There is no user!</h1>{% endif %}
</body>
</html>
from flask import Flask, render_template
from models import Userapp = Flask(__name__)# 路由
@app.route('/info/<user_id>')
def info_judge(user_id):user = Noneif int(user_id) == 1:user = User(1, 'Looking')return render_template('info.html', user=user)if __name__ == '__main__':app.run()

循环语句

list.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>循环语句</title>
</head>
<body>{% for user in users %}<h4>user_id: {{user.id}}; user_name: {{user.name}}</h4><br>{% endfor %}
</body>
</html>
from flask import Flask, render_template
from models import Userapp = Flask(__name__)# 路由
@app.route('/list')
def info_judge():users = []for i in range(5):users.append(User(i, f"student{i}"))return render_template('list.html', users=users)if __name__ == '__main__':app.run()

 

模板继承

我们会发现有一些网页的有些部分是不变的,比如说页头页脚等,当跳转相同网页的时候只有中间部分会改变,这就要使用到模板的继承,可以使用 extends 实现对模板文件的继承。

base.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>模板的继承</title>
</head>
<body><div><H2>Header 欢迎光临!</H2></div>{% block content %}{% endblock %}<div><H2>Footer 欢迎下次再来!</H2></div>
</body>
</html>

page_one.html

{% extends 'base.html'%}
{% block content %}<h3>{{content}}</h3>
{% endblock %}

 page_two.html

{% extends 'base.html'%}
{% block content %}<h3>{{content}}</h3>
{% endblock %}

 main.py

from flask import Flask, render_template
app = Flask(__name__)# 第一页路由
@app.route('/page_one')
def one_page():content = '这是第一页!'return render_template('page_one.html', content=content)# 第二页路由
@app.route('/page_two')
def secend_page():content = '这是第二页!'return render_template('page_two.html', content=content)# 运行
if __name__ == "__main__":app.run()

消息提示

使用 flash 可以将后台处理的消息提示刷新到页面

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Flask消息提示与异常捕获</title>
</head>
<body>
<h1>Login</h1><form action="/login" method="post"><input type="text" name="username" placeholder="账号"><br /><input type="password" name="password" placeholder="密码" style="margin-top:10px"><br /><input type="submit" value="Submit" style="margin-left:50px;margin-top:10px"></form><!--这里获取的是一个数组-->{{get_flashed_messages()[0]}}
</body>
</html>

main.py 

from flask import Flask, render_template, flash, requestapp = Flask(__name__)
# 对flash的内容加密
app.secret_key = '123'@app.route('/login')
def index():return render_template("index.html")# 路由
@app.route('/login', methods=['POST'])
def login():# 获取表单上传的数据form = request.formusername = form.get('username')password = form.get('password')# 进行判断if not username:flash("please enter username")return render_template("index.html")if not password:flash("please enter password")return render_template("index.html")if username == "looking" and password == "123456":flash("login success")return render_template("index.html")else:flash("username and password not match!")return render_template("index.html")# 运行
if __name__ == "__main__":app.run()

异常捕获 

如果用户输入了错误的路径,创建网站的人又没有设置异常捕获及处理,它会出现404;如果处理了的话,那就显示的为处理后的页面。所以,我们的异常处理也就是对返回的 404 页面(或者其他异常)返回我们设置的页面。

404.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Flask异常捕获与处理</title>
</head>
<body><h2>抱歉,你访问的页面去火星了......</h2><br /><h2>请检查你的网址是否输入正确!</h2>
</body>
</html>

user.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>This is user page</h1>
​
</body>
</html>

 main.py

from flask import Flask, render_template, abortapp = Flask(__name__)# 异常捕获一
@app.errorhandler(404)
def not_found():return render_template('404.html'), 404# 异常捕获二
@app.route('/user/<user_id>')
def user_info(user_id):if int(user_id) == 1:return render_template("user.html")else:abort(404)if __name__ == "__main__":app.run()

如果没有添加针对 404 的错误处理,就是下面这种界面。

403 是 Forbidden

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

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

相关文章

时间管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)大学生

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

使用deepspeed小记

1. 减少显存占用的历程忠告 医学图像经常很大&#xff0c;所以训练模型有时候会有难度&#xff0c;但是现在找到了很多减少显存的方法。 不知道为什么&#xff0c;使用transformers的trainer库确确实实会减少显存的占用&#xff0c;即使没有使用deepspeed&#xff0c;占用的显…

MySQL 8.0.13安装配置教程

写个博客记录一下&#xff0c;省得下次换设备换系统还要到处翻教程&#xff0c;直接匹配自己常用的8.0.13版本 1.MySQL包解压到某个路径 2.将bin的路径加到系统环境变量Path下 3.在安装根目录下新建my.ini配置文件&#xff0c;并用编辑器写入如下数据 [mysqld] [client] port…

30. UE5 RPG GamplayAbility的配置项

在上一篇文章&#xff0c;我们介绍了如何将GA应用到角色身上的&#xff0c;接下来这篇文章&#xff0c;将主要介绍一下GA的相关配置项。 在这之前&#xff0c;再多一嘴&#xff0c;你要能激活技能&#xff0c;首先要先应用到ASC上面&#xff0c;才能够被激活。 标签 之前介绍…

【SpringBoot整合系列】SpirngBoot整合EasyExcel

目录 背景需求发展 EasyExcel官网介绍优势常用注解 SpringBoot整合EaxyExcel1.引入依赖2.实体类定义实体类代码示例注解解释 3.自定义转换器转换器代码示例涉及的枚举类型 4.Excel工具类5.简单导出接口SQL 6.简单导入接口SQL 7.复杂的导出&#xff08;合并行、合并列&#xff0…

python Flask扩展:如何查找高效开发的第三方模块(库/插件)

如何找到扩展以及使用扩展的文档 一、背景二、如何寻找框架的扩展&#xff1f;三、找到想要的扩展四、找到使用扩展的文档五、项目中实战扩展 一、背景 刚入门python的flask的框架&#xff0c;跟着文档学习了一些以后&#xff0c;想着其实在项目开发中&#xff0c;经常会用到发…

每日面经分享(Spring Boot: part3 Service层)

SpringBoot Service层的作用 a. 封装业务逻辑&#xff1a;Service层负责封装应用程序的业务逻辑。Service层是控制器&#xff08;Controller&#xff09;和数据访问对象&#xff08;DAO&#xff09;之间的中间层&#xff0c;负责处理业务规则和业务流程。通过将业务逻辑封装在S…

当面试官问你插入排序算法,你敢说自己会吗?

算法学习的重要性 在程序员的世界里&#xff0c;算法就如同一座桥梁&#xff0c;连接着问题与解决方案&#xff0c;是实现优秀程序的关键。 掌握算法&#xff0c;就能够在面对各种问题时&#xff0c;找到最合适的解决方法&#xff0c;以最少的时间和空间&#xff0c;实现最优的…

基于FPGA的SPI_FLASH程序设计

SPI_FLASH简介 spi_flash是一种通用存储器&#xff0c;也称为SPI NOR Flash或SPI Flash。它使用SPI&#xff08;Serial Peripheral Interface&#xff09;接口进行通信&#xff0c;可以通过串行方式读写数据。spi_flash的特点是工作电压低&#xff0c;体积小&#xff0c;读写速…

梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码

源码简介 最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容&#xff1a;修复播放器接口问题&#xff0c;把接口本地化&#xff0c;但是集成外链播放器…

C++的并发世界(三)——线程对象生命周期

0.案例代码 先看下面一个例子&#xff1a; #include <iostream> #include <thread>void ThreadMain() {std::cout << "begin sub thread:" << std::this_thread::get_id()<<std::endl;for (int i 0; i < 10; i){std::cout <&…

矩阵间关系的建立

参考文献 2-D Compressive Sensing-Based Visually Secure Multilevel Image Encryption Scheme 加密整体流程如下: 我们关注左上角这一部分: 如何在两个图像之间构建关系,当然是借助第3个矩阵。 A. Establish Relationships Between Different Images 简单说明如下: …

Android的图片加载框架

Android的图片加载框架 为什么要使用图片加载框架&#xff1f;图片加载框架1. Universal Image Loader [https://github.com/nostra13/Android-Universal-Image-Loader](https://github.com/nostra13/Android-Universal-Image-Loader)2. Glide [https://muyangmin.github.io/gl…

美摄科技AI智能图像矫正解决方案

图像已经成为了企业传播信息、展示产品的重要媒介&#xff0c;在日常拍摄过程中&#xff0c;由于摄影技巧的限制和拍摄环境的复杂多变&#xff0c;许多企业面临着图像内容倾斜、构图效果不佳等挑战&#xff0c;这无疑给企业的形象展示和信息传递带来了不小的困扰。 美摄科技深…

CentOS7安装flink1.17完全分布式

前提条件 准备三台CenOS7机器&#xff0c;主机名称&#xff0c;例如&#xff1a;node2&#xff0c;node3&#xff0c;node4 三台机器安装好jdk8&#xff0c;通常情况下&#xff0c;flink需要结合hadoop处理大数据问题&#xff0c;建议先安装hadoop&#xff0c;可参考 hadoop安…

顶顶通呼叫中心中间件-话术编辑器机器人转人工坐席配置(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-话术编辑器机器人转人工座席配置(mod_cti基于FreeSWITCH) 配置方法 一、ACD排队转接 二、伴随转接 比如你设置的通知规则是任意满足一个就通知那么通话时间设置为10 秒那样他只要通话时间到10秒他就会转坐席。 如果要转人工的时侯转手机可以这样配置 把…

用于HUD平视显示器的控制芯片:S2D13V40

一款利用汽车抬头显示技术用于HUD平视显示器的控制芯片:S2D13V40。HUD的全称是Head Up Display&#xff0c;即平视显示器&#xff0c;以前应用于军用飞机上&#xff0c;旨在降低飞行员需要低头查看仪表的频率。起初&#xff0c;HUD通过光学原理&#xff0c;将驾驶相关的信息投射…

53 v-bind 和 v-model 的实现和区别

前言 这个主要的来源是 偶尔的情况下 出现的问题 就比如是 el-select 中选择组件之后, 视图不回显, 然后 model 不更新等等 这个 其实就是 vue 中 视图 -> 模型 的数据同步, 我们通常意义上的处理一般是通过 模型 -> 数据 的数据同步, 比如 我们代码里面更新了 model.…

pygame--坦克大战(二)

加载敌方坦克 敌方坦克的方向是随机的&#xff0c;使用随机数生成。 初始化敌方坦克。 class EnemyTank(Tank):def __init__(self,left,top,speed):self.images {U: pygame.image.load(img/enemy1U.gif),D: pygame.image.load(img/enemy1D.gif),L: pygame.image.load(img/e…

10_MVC

文章目录 JSON常用的JSON解析Jackson的常规使用指定日期格式 MVC设计模式MVC介绍前后端分离案例&#xff08;开发与Json相关接口&#xff09; 三层架构三层架构介绍 JSON JSON&#xff08;JavaScript Object Notation&#xff09; 是一种轻量级的数据交换格式&#xff0c;是存…