Flask教程1:flask框架基础入门,路由、模板、装饰器

文章目录

        • 一、 简介
        • 二、 概要

一、 简介

Flask是一个非常小的Python Web框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用。

二、 概要

1)安装: pip install flask
2)组成:WSGI系统、调试、路由
3)模板引擎:Jinja2
4)使用到装饰器:以@开头的代码方法

  1. Flask基础入门
    1)路由route的创建:
    route装饰器详解

通过创建路由并关联函数,实现一个基本的网页:

from flask import Flask# 用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容
app = Flask(__name__)#程序实例需要知道每个url请求所对应的运行代码是谁。
#所以程序中必须要创建一个url请求地址到python运行函数的一个映射。
#处理url和视图函数之间的关系的程序就是"路由",在Flask中,路由是通过@app.route装饰器(以@开头)来表示的
@app.route("/")
#url映射的函数,要传参则在上述route(路由)中添加参数申明
def index():return "Hello World!"# 直属的第一个作为视图函数被绑定,第二个就是普通函数
# 路由与视图函数需要一一对应
# def not():
#     return "Not Hello World!"# 启动一个本地开发服务器,激活该网页
app.run()

点击Running on对应的链接即可跳转到url,路由为默认的@app.route("/"),所以无需调整。返回结果为"Hello World!"

 * Serving Flask app '__main__' (lazy loading)* Environment: productionWARNING: This is a development server. Do not use it in a production deployment.Use a production WSGI server instead.* Debug mode: off* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [28/Apr/2024 20:46:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [28/Apr/2024 20:46:03] "GET /favicon.ico HTTP/1.1" 404 -

在这里插入图片描述

  • 通过路由的methods指定url允许的请求格式:
from flask import Flaskapp = Flask(__name__)#methods参数用于指定允许的请求格式
#常规输入url的访问就是get方法
@app.route("/hello",methods=['GET','POST'])
def hello():return "Hello World!"
#注意路由路径不要重名,映射的视图函数也不要重名
@app.route("/hi",methods=['POST'])
def hi():return "Hi World!"app.run()

默认路由是无法访问的,因为这次两次函数指定路由分别为"/hello""/hi"

在这里插入图片描述
指定对应的路由之后就可以成功访问
在这里插入图片描述
但是对于只接受POST请求的函数,直接访问会报错:Method Not Allowed

在这里插入图片描述

  • 通过路由在url内添加参数,其关联的函数可以接收该参数:

以下为框架自带的转换器,可以置于参数前将接收的参数转化为对应类型

string接受任何不包含斜杠的文本
int接受正整数
float接受正浮点数
path接受包含斜杠的文本

在这里插入图片描述

  • 自定义转换器(pip install werkzeug
from werkzeug.routing import BaseConverter #导入转换器的基类,用于继承方法
from flask import Flaskapp = Flask(__name__)# 自定义转换器类
class RegexConverter(BaseConverter):def __init__(self,url_map,regex):# 重写父类定义方法super(RegexConverter,self).__init__(url_map)self.regex = regexdef to_python(self, value):# 重写父类方法,后续功能已经实现好了print('to_python方法被调用')return value# 将自定义的转换器类添加到flask应用中
# 具体过程是添加到Flask类下url_map属性(一个Map类的实例)包含的转换器字典属性中
app.url_map.converters['re'] = RegexConverter
# 此处re后括号内的匹配语句,被自动传给我们定义的转换器中的regex属性
# value值会与该语句匹配,匹配成功则传达给url映射的视图函数
@app.route("/index/<re('1\d{10}'):value>")
def index(value):print(value)return "Hello World!"if __name__=='__main__':app.run(debug=True)
to_python方法被调用
12345678901

在这里插入图片描述

2)endpoint的作用
说明:每个app中都存在一个url_map,这个url_map中包含了urlendpoint的映射;
作用:当request请求传来一个url的时候,会在url_map中先通过rule找到endpoint,然后再在view_functions中根据endpoint再找到对应的视图函数view_func

from flask import Flaskapp = Flask(__name__)# endpoint默认为视图函数的名称
@app.route('/test')
def test():return 'test success!'
# 我们也可以在路由中修改endpoint(当视图函数名称很长时适用)
# 相当于为视图函数起别名
@app.route('/hello',endpoint='our_set')
def hello_world():return 'Hello World!'if __name__ == '__main__':print(app.view_functions)print(app.url_map)app.run()
{'static': <function Flask.__init__.<locals>.<lambda> at 0x000001F7AFE2BC70>, 'test': <function test at 0x000001F7AFE70D30>, 
'our_set': <function hello_world at 0x000001F7AFE70DC0>}
Map([<Rule '/static/<filename>' (GET, HEAD, OPTIONS) -> static>,<Rule '/test' (GET, HEAD, OPTIONS) -> test>,<Rule '/hello' (GET, HEAD, OPTIONS) -> our_set>])* Serving Flask app 'test'* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on http://127.0.0.1:5000

3)request对象的使用
render_template():可以用于呈现一个我们编写的html文件模板
request.method用于获取url接收到的请求方式,以此返回不同的响应页面

#request:包含前端发送过来的所有请求数据from flask import Flask,render_template,request# 用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容
app = Flask(__name__)@app.route("/",methods=['GET','POST'])
#url映射的函数,要传参则在上述route(路由)中添加参数申明
def index():if request.method == 'GET':# 想要html文件被该函数访问到,首先要创建一个templates文件,将html文件放入其中# 该文件夹需要被标记为模板文件夹,且模板语言设置为jinja2return render_template('index.html')# 此处欲发送post请求,需要在对应html文件的form表单中设置method为postelif request.method == 'POST':name = request.form.get('name')password = request.form.get('password')return name+" "+passwordif __name__=='__main__':app.run()

4)请求钩子before/after_request
想要在正常执行的代码的前、中、后时期,强行执行一段我们想要执行的功能代码,便要用到钩子函数——用特定装饰器装饰的函数。

下面将介绍Flask内,四种常用的钩子:

before_request:在每一次请求之前调用;
该钩子函数表示每一次请求之前,可以执行某个特定功能的函数;
执行顺序是先绑定的先执行;
并且先执行 flask appbefore_request, 再执行 blueprintbefore_request
一般用于检验用户权限、请求是否合法等场景;

from flask import Flask
app = Flask(__name__)@app.route('/')
def hello_world():return 'Hello World!'@app.before_request
def before_request_a():print('I am in before_request_a')@app.before_request
def before_request_b():print('I am in before_request_b')if __name__ == '__main__':app.run()
 * Serving Flask app '__main__' (lazy loading)* Environment: productionWARNING: This is a development server. Do not use it in a production deployment.Use a production WSGI server instead.* Debug mode: off* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [29/Apr/2024 11:07:53] "GET / HTTP/1.1" 200 -
I am in before_request_a
I am in before_request_b
  1. before_first_request:与before_request的区别是,只在第一次请求之前调用;
    该钩子函数表示第一次请求之前可以执行的函数;
    执行顺序同样也是先绑定的先执行;
# 代码替换视图函数hello_world后,if main前
@app.before_first_request
def teardown_request_a():print('I am in teardown_request_a')@app.before_first_request
def teardown_request_b():print('I am in teardown_request_b')
  1. after_request:每一次请求之后都会调用;
    该钩子函数表示每一次请求之后,可以执行某个特定功能的函数,这个函数接收response对象,所以执行完后必须归还response对象;
    执行的顺序是先绑定的后执行;
    被触发的前提是没有异常抛出,或者异常被 errorhandler捕获并处理;
    一般可以用于产生csrf_token验证码等场景;
# 代码替换视图函数hello_world后,if main前
@app.after_request
def after_request_a(response):print('I am in after_request_a')# 该装饰器接收response参数,运行完必须归还response,不然程序报错return response@app.after_request
def after_request_b(response):print('I am in after_request_b')return response
  1. teardown_request:每一次请求之后都会调用;
    该钩子函数接收一个参数,该参数是服务器出现的错误信息;
    执行顺序也是先绑定的后执行;
    只有在请求上下文被 pop 出请求栈的时候才会直接跳转到teardown_request
    所以在被正常调用之前,即使某次请求有抛出错误,该请求也都会被继续执行, 并在执行完后返回 response
# 代码替换视图函数hello_world后,if main前
@app.teardown_request
def teardown_request_a(exc):print('I am in teardown_request_a')@app.teardown_request
def teardown_request_b(exc):print('I am in teardown_request_b')

5)redirect重定向
flask 中,重定向是通过flask.redirect(location, code=302)这个函数来实现的,location表示需要重定向的url, 应该配合url_for函数来使用, code表示采用哪个重定向,默认是302,即临时性重定向, 可以修改为301来实现永性重定向;

from flask import Flask,redirect,url_forapp = Flask(__name__)@app.route('/index')
def index():# redirect重定位(服务器向外部发起一个请求跳转)到一个url界面;# url_for给指定的函数构造 URL;# return redirect('/hello') 不建议这样做,将界面限死了return redirect(url_for('hello'))@app.route('/hello')
def hello():return 'this is hello fun'if __name__ == '__main__':app.run()

在这里插入图片描述
6)返回json数据给前端
方法一:
使用:make_response方法和json库共同完成

from flask import Flask,make_response,jsonapp = Flask(__name__)@app.route("/index")
def index():data = {'name':'张三'}# json.dumps 将一个python数据结构转化为json# json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False# 生成一个response响应对象,而不是直接return来返回响应对象,便于执行更多的后续操作response = make_response(json.dumps(data,ensure_ascii=False))# 修改数据的MIME标准类型为json(在发送数据前会先发送该类型)response.mimetype = 'application/json'return responseif __name__=='__main__':app.run()

在这里插入图片描述
方法二:
使用:jsonify库实现,减少代码行数

from flask import Flask,jsonifyapp = Flask(__name__)
# 在Flask的config是一个存储了各项配置的字典
# 该操作是进行等效于ensure_ascii=False的配置
app.config['JSON_AS_ASCII'] = False@app.route("/index")
def index():data = {'name':'张三'}return jsonify(data)if __name__=='__main__':app.run()

7)abort函数的使用
使用类似于python中的raise函数,可以在需要退出请求的地方抛出错误,并结束该请求;
我们可以使用errorhandler()装饰器来进行异常的捕获与自定义:

from flask import Flask,render_template,request,abortapp = Flask(__name__)@app.route("/",methods=['GET','POST'])
def index():if request.method == 'GET':return render_template('index.html')elif request.method == 'POST':name = request.form.get('name')password = request.form.get('password')if name == 'zhangsan' and password == '123456':return 'login sucess'else:# abort的用法类似于python中的raise,在网页中主动抛出错误abort(404)return None# 自定义错误处理方法,将404这个error与Python函数绑定
# 当需要抛出404error时,将会访问下面的代码
@app.errorhandler(404)
def handle_404_error(err):# return "发生了错误,错误情况是:%s"%err# 自定义一个界面return render_template('404.html')if __name__ == '__main__':app.run()
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<!-- 注意图片文件需要放在一个静态文件夹static里 -->
<img src="../static/error404.jpg" alt="" width="1428px" height="57px">
</body>
</html>

8)url_for实现反转
url_for是实现url反转的工具,即视图函数 → \rightarrow →url;

静态文件引入:url_for(‘static’, filename=‘文件路径’)

静态文件需要存储在当前工程下的static目录内。

定义路由:url_for(‘模块名.视图名’,变量=参数)

参数一中的视图名实质指的是endpointurl_map中存储了urlendpoint的映射,只是默认情况下endpoint与视图函数名相同;
如果在装饰器中修改了endpoint,则url_for只能使用endpoint设置的名字来反转url
在单模块程序下我们可以省略模块名,但当使用了蓝图(buleprint)后,参数一就必须使用"蓝图模块名.视图名",因为不同蓝图下的视图函数可以重名。

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

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

相关文章

(7)快速调优

文章目录 前言 1 安装脚本 2 运行 QuikTune 3 高级配置 前言 VTOL QuikTune Lua 脚本简化了为多旋翼飞行器的姿态控制参数寻找最佳调整的过程。 脚本会缓慢增加相关增益&#xff0c;直到检测到振荡。然后&#xff0c;它将增益降低 60%&#xff0c;并进入下一个增益。所有增…

VScode 无法连接云服务器

试了很多方法&#xff0c;比如更换VScode版本&#xff0c;卸载重装&#xff0c;删除配置文件 重启电脑&#xff0c;都无法成功。最后重置电脑后才连接上&#xff0c;但是重启服务器后又出现该问题。 方法一&#xff1a;修改环境 方法二&#xff1a;把vscode卸载干净重下

JVM支持的可配置参数查看和分类

JVM参数大致可以分为三类: 标注指令:-开头。 这些是所有的HotSpot都支持的参数。可以用java-help 打印出来。 非标准指令: -X开头。 这些指令通常是跟特定的HotSpot版本对应的。可以用java -X打印出来。 不稳定参数: -XX 开头。 这一类参数是跟特定HotSpot版本对应的&#x…

Java Maven 编译资源文件拷贝错误 dirCompressed.zip failed with MalformedInputException:

完整的错误信息为&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources (default-resources) on project core-java-io: filtering C:\WorkDir\Repository\iSharkfly-Docs\java-tutorials\core-java-modules\core-ja…

VitePress 构建的博客如何部署到 Netlify 平台?

VitePress 构建的博客如何部署到 Netlify 平台&#xff1f; 前言 之前写了篇文章【使用 Vitepress 构建博客并部署到 github 平台】&#xff0c;有个老哥说 github page 访问太慢了&#xff0c;希望放到 Netlify 平台上面。 咱也没部署过&#xff0c;就试了一下&#xff0c;发…

【计算智能】基本遗传算法在优化问题中的应用与实验【理论到程序】

文章目录 1. 引言&#xff1a;遗传算法简介2. 基本遗传算法&#xff08;SGA&#xff09;2.1 基本遗传算法的构成要素1. 染色体编码2. 适应度函数3. 遗传算子 2.2 实验设计与方法1. 算法流程2. 伪代码3. python实现1. 导入模块2. 目标函数 f(x)3 初始化种群4. 计算适应度5. 选择…

再谈有效地访问Github

文章目录 1. 知识回顾2. 问题描述3. 问题解决3.1 Mac系统3.2 Windows系统4. 内容总结1. 知识回顾 我们在之前的内容中介绍过如何有效地访问Github。如果大家忘记的话可以点击这里查看。之前的内容主要偏重于问题的分析和解决的思路,有些朋友看了后还是不清楚如何解决问题。 …

设计模式之工厂模式FactoryPattern(二)

一、简单工厂 package com.xu.demo.factoryPattern;/*** 简单工厂模式类*/ public class SimpleFactoryPattern {public static Phone create(String name) {//根据输入对象名称判断返回相匹配的对象if("IPhone".equals(name)) {//返回对象return new IPhone();}else…

【补充】图神经网络前传——图论

本文作为对图神经网络的补充。主要内容是看书。 仅包含Introduction to Graph Theory前五章以及其他相关书籍的相关内容&#xff08;如果后续在实践中发现前五章不够&#xff0c;会补上剩余内容&#xff09; 引入 什么是图&#xff1f; 如上图所示的路线图和电路图都可以使用…

国家开放大学2024年春《Matlab语言及其应用》实验一熟悉Matlab 操作环境参考答案

实验报告 姓名&#xff1a; 学号&#xff1a; 实验一名称&#xff1a;熟悉 Matlab 操作环境 实验目标&#xff1a;通过简单变量和矩阵的录入、计算和查看相关信息&#xff0c;了解 Matlab 操作界面 及各子窗口使用方法。熟悉一系列便于使用的 Matlab 函数和文件的工具。 实…

复旦 北大 | 从头训练中文大模型:CT-LLM

引言 当前&#xff0c;绝大多数大模型&#xff08;LLMs&#xff09;基本上都是以英文语料库训练得到的&#xff0c;然后经过SFT来匹配不同的语种。然而&#xff0c;今天给大家分享的这篇文章旨在从头开始训练中文大模型&#xff0c;在训练过程中「主要纳入中文文本数据」&…

qt5-入门-2D绘图-Graphics View 架构

参考&#xff1a; Qt Graphics View Framework_w3cschool https://www.w3cschool.cn/learnroadqt/4mvj1j53.html C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt 5.12 基础知识 QPainter比较适合少量绘图的情…

10个使用NumPy就可以进行的图像处理步骤

图像处理是一种数学计算。数字图像由称为像素的彩色小点组成。每个像素由红、绿、蓝(RGB)三个独立的颜色组成。每个像素中的主色由每个RGB分量的数值决定。 本文将介绍10个使用使用NumPy就可以进行的图像处理步骤&#xff0c;虽然有更强大的图像处理库&#xff0c;但是这些简单…

光伏管理系统:降本增效解决方案。

现在是光伏发展的重要节点&#xff0c;如何在众多同行中脱颖而出并且有效的达到降低成本、提高效率也是很多企业都在考虑的问题&#xff0c;鹧鸪云的团队研发出了光伏管理系统&#xff0c;通过更高效、更智能、更全面的管理方式来帮助企业实现降本增效的转型&#xff0c;小编带…

公考学习平台|基于SprinBoot+vue的公考学习平台(源码+数据库+文档)

公考学习平台目录 目录 基于SprinBootvue的公考学习平台 一、前言 二、系统设计 三、系统功能设计 5.1用户信息管理 5.2 视频信息管理 5.3公告信息管理 5.1论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…

笔记-word导出PDF老是更新域导致图片和表格题注发生变化

问题描述&#xff1a;微软word 导出PDF时&#xff0c;老是更新域&#xff0c;导致图片和表格题注否跟着变化 以下是解决方法的具体描述。 目录 一、准备工作二、操作步骤 一、准备工作 1、工具版本&#xff1a;微软 word 2016&#xff08;其他微软word版本也OK&#xff09; …

【自研网关系列】过滤器链 -- 鉴权过滤器

&#x1f308;Yu-Gateway&#xff1a;&#xff1a;基于 Netty 构建的自研 API 网关&#xff0c;采用 Java 原生实现&#xff0c;整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施&#xff0c;承载请求路由、安全控制、流量治理等…

智能化未来:Agent AI智能体的崛起与全球挑战

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Redis源码学习记录:列表 (ziplist)

ziplist redis 源码版本&#xff1a;6.0.9。ziplist 的代码均在 ziplist.c / ziplist.h 文件中。 定义 ziplist总体布局如下&#xff1a; <zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend> zlbytes&#xff1a;uin…

高德优评项目,一单29.9,拷贝+评价,日入500

项目概述&#xff1a; 下载 地 址 &#xff1a; laoa1.cn/1836.html 本项目的核心非常简单&#xff0c;即在高德地图上撰写评论。每条评论完成后&#xff0c;参与者将获得8元的奖励。 此外&#xff0c;高德地图还会提供视频会员作为奖励。我们可以将这些视频会员进行变现…