Python 之 Flask框架(进阶版)

前面说了flask框架的基础用法,现在说一下Flask框架的进阶用法:#包引入
from flask import Flask,redirect,url_for,render_template,request,make_response,send_file,abort,flash, get_flashed_messages,Blueprint,views
from os import urandomapp = Flask(__name__)
​​
@app.route('/admin')
def hello_admin():return 'Hello Admin'@app.route('/guest/<guest>')
def hello_guest(guest):return 'Hello %s as Guest' % guest#重定向
@app.route('/user/<name>')
def user(name):if name =='admin':return redirect(url_for('hello_admin'))else:return redirect(url_for('hello_guest',guest = name))#模板引擎
@app.route('/htmltest')
def html_temp():dic = {"firts": 1, "second": 2, "thired": 3}return render_template('test.html', result=dic)#自定错误页面
@app.errorhandler(404)
def errorhandler(e):return render_template("404.html"), 404#辅助方法
@app.route('/home')
def home():print('cookies:', request.cookies)      # 获取cookiesprint('headers:', request.headers)      # 获取请求头信息print('method:', request.method)        # 请求方法print('url:', request.url)              # URL全部内容,请求地址加参数print('url_rule:', request.url_rule)    # 请求URL不含请求地址和参数print('url_root:', request.url_root)    # 请求地址print('host_url:', request.host_url)    # 与url_root类似print('base_url:', request.base_url)    # 请求地址和URL和,不含参数print('path:', request.path)            # 请求URLprint('values:', request.values)        # 包含GET, POST请求的参数print('args:', request.args)            # 获取URL参数print('form:', request.form)            # 获取POST提交formdata的参数print('files:', request.files)          # 获取提交的文件print('json:', request.json)            # 获取header为applicaiton/json提交的数据return 'home page'# 用于创建响应对象。它通常用于在视图函数中设置响应的内容、状态码和头部
@app.route('/page1')
def page1():resp = make_response('<h1>hello world</h1>')resp.headers['name'] = 'hello'return resp#解除进程对SIGABRT信号的阻止,然后向调用进程发送该信号(阻止当去请求,跳转制定的状态)
@app.route('/page2')
def page2():abort(405)# 从服务器端发送内存中的文件给客户端
@app.route('/page3')
def page3():return send_file('test.jpg')#闪现(在视图函数调用flash()函数,传入消息内容,flash()函数把消息存储在session中,我们需要在模板中使用全局函数get_flashed_messages()获取消息并将它显示出)
#注意:app.secret_key = urandom(25)  ;flash消息存储在session中,一定要设置key值,相当于一个栈,访问一次/page4,相当于"hello","world","welcome"入栈一次,所以可以看到再次访问/page5,入栈的数据就会增加一次
#获取随机数(获取不同操作系统特定提供的随机源, 它可以被用来做随机加密的key使用)
app.secret_key = urandom(25)
@app.route('/page4')
def page4():flash('hello')flash('world')flash('welcome', 'success')return 'page4 page'@app.route('/page5')
def page5():print(get_flashed_messages())return 'page5 page'# 蓝图(路由组件,相当于路由分组组件,相当于Golang中的group)
# 定义
api = Blueprint('api', 'api')
admin = Blueprint('admin', 'admin')# 相当于/api/page6(api相当于模块)
@api.route('/page6')
def page6():return 'api page6'# 相当于/admin/page7(admin相当于模块)
@admin.route('/page7')
def page7():return 'admin page7'# 注册
app.register_blueprint(api)
app.register_blueprint(admin)#钩子函数(类似于php的laravel框架中的handle)
@app.route('/page8')
def page8():return 'page8'@app.route('/page9')
def page9():return 'page9'@app.before_request
def first_request():print('请求进入视图函数之前')@app.after_request
def after_request(response):print('视图函数结束之前调用')return response#cbv(装饰器:类似 restful API:相当于利用request.method去判断是页面还是操作,cbv就相当于集成版)
class Index(views.MethodView):def get(self):return 'get method page'def post(self):return 'post method page'class Upload(views.MethodView):methods = ['GET', 'POST']def get(self):return """<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>index</title>
</head>
<body><form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file"><input type="submit"></form>
</body>
</html>

    def post(self):
        file = request.files['file']
        file.save(file.filename)
        return 'upload successful'


app.add_url_rule('/index', view_func=Index.as_view(name='index'))
app.add_url_rule('/upload', view_func=Upload.as_view(name='upload'))

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

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

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

相关文章

牛客NC343 和大于等于K的最短子数组【困难 前缀和 Java/Go】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/3e1fd3d19fb0479d94652d49c7e1ead1 思路 本答案利用前缀和解答&#xff0c;Java&#xff0c;Go答案通过&#xff0c;但是同样的代码用PHP的话有一个测试用例超时 应该还有更优秀的答案&#xff0c;后面找到更优…

2022——蓝桥杯十三届2022国赛大学B组真题

问题分析 看到这个问题的同学很容易想到用十层循环暴力计算&#xff0c;反正是道填空题&#xff0c;一直算总能算得出来的&#xff0c;还有些同学可能觉得十层循环太恐怖了&#xff0c;写成回溯更简洁一点。像下面这样 #include <bits/stdc.h> using namespace std; in…

apk反编译修改教程系列-----反编译apk 去除软件强制更新的八种方式步骤解析【十七】

安卓有的apk 软件会不断更新。但有些用户需要旧版的有些功能或者新版功能增减原因等等。需要不更新继续使用。这类问题有的可以简单修改版本号来跳过更新。或者有的软件可以忽略。但对于某些无法跳过更新界面等等的apk。就需要深度反编译来去除软件的强制更新。 通过课程可以了…

wsl安装Xfce桌面并设置系统语言和输入法

一、安装xfce &#xff08;有相关的依赖都会安装&#xff09; sudo apt -y install xfce4 二、 安装远程连接组件 sudo apt install xrdp -y 并重新启动 Xrdp 服务&#xff1a; sudo systemctl restart xrdp 本地windows系统中请按 winR 键 呼出运行 在运行中输入 mstsc…

1067: 有向图的邻接表存储强连通判断

解法&#xff1a; 定理&#xff1a;有向图G是强连通图的充分必要条件是G中存在一条经过所有节点的回路 跟上道题一样 这是错误代码 #include<iostream> #include<vector> using namespace std; int arr[100][100]; void dfs(vector<bool>& a,int u) {a…

唤醒手腕 Go 语言 并发编程、Channel通道、Context 详细教程(更新中)

并发编程概述 ​ 一个进程可以包含多个线程&#xff0c;这些线程运行的一定是同一个程序&#xff08;进程程序&#xff09;&#xff0c;且都由当前进程中已经存在的线程通过系统调用的方式创建出来。进程是资源分配的基本单位&#xff0c;线程是调度运行的基本单位&#xff0c…

【JAVA进阶篇教学】第十二篇:Java中ReentrantReadWriteLock锁讲解

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第十二篇&#xff1a;Java中ReentrantReadWriteLock锁讲解。 在并发编程中&#xff0c;读写锁&#xff08;ReadWriteLock&#xff09;是一种用于管理对共享资源的访问的锁机制&#xff0c;它提供了比传统的互斥锁更高的…

BUG-ModuleNotFoundError: No module named ‘torchvision.models.utils‘

本专栏为深度学习的一些技巧,方法和实验测试,偏向于实际应用,后续不断更新,感兴趣童鞋可关,方便后续推送 现象 在转onnx模型时&#xff0c;保错如下: from torchvision.models.utils import load_state_dict_from_url ModuleNotFoundError: No module named torchvision.mod…

栈的讲解

栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底&#xff08;因为先进后出&#xff09;。栈中的数据元素遵守后进先出LIFO&#xff08;Last In Firs…

数据结构与算法===回溯法

文章目录 原理使用场景括号生成代码 小结 原理 回溯法是采用试错的思想&#xff0c;它尝试分步骤的去解决一个问题。在分步骤解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff0c;它将取消上一步甚至是上几步的计算&#x…

函数模板底层本质

#include<iostream> using namespace std;template<typename T1> T1 ave(T1 a, T1 b) { return a b; }int main() {ave(100, 200);ave(short(100), short(200));return 0; }反汇编代码 模板本质是编译器帮忙生成了不同的函数 就算非类型参数值不一样编译器也重新…

HCIP(BGP综合实验)--8

一&#xff1a;实验要求 二&#xff1a;实现过程 &#xff08;一&#xff09;配置IP地址&#xff1a; AR1: [AR1]int g0/0/0 [AR1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [AR1-GigabitEthernet0/0/0]int l0 [AR1-LoopBack0]ip add 172.16.0.1 32 [AR1-LoopBack0]int l1 […

2024OD机试卷-按身高和体重排队 (java\python\c++)

题目:按身高和体重排队 题目描述 某学校举行 运动会 ,学生们按编号(1、2、3…n)进行标识,现需要按照身高由低到高排列,对身高相同的人,按体重由轻到重排列;对于身高体重都相同的人,维持原有的 编号顺序关系。请输出排列后的学生编号。 输入描述 两个序列,每个序列由…

TM1650 并联在I2C 信号线的处理方法

目的是可以并联多个TM1650 在标准I2C 总线上&#xff0c;并且不影响其他标准I2C 器件。思路就是拿个额外的开关控制每一片TM1650 的使能&#xff0c;就像SPI 的CS 信号那样。 协议 TM1650 的通信协议虽说不是标准I2C&#xff0c;但也算是比较兼容的&#xff0c;比方说&#x…

springboot实现Aop

一、原理 AOP&#xff08;Aspect Oriented Programming&#xff09;的意思是&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可对业务逻辑进行增强&#xff0c;在不改变原有逻辑的基础上&#xff0c;在其前后进…

JVM调优:JVM常用调优命令和参数

JVM调优是调整和配置Java虚拟机&#xff08;JVM&#xff09;的过程&#xff0c;以便最大限度地提高应用程序的性能和效率。这涉及到调整内存设置、选择合适的垃圾收集器&#xff0c;以及配置各种性能参数。 今天我们来了解一下参数如何设置 JVM调优的重要性 1.通过调整JVM参数…

YOLOv8独家原创改进: AKConv(可改变核卷积)

1.AKConv原理介绍 地址:2311.11587 (arxiv.org) 摘要:基于卷积运算的神经网络在深度学习领域取得了令人瞩目的成果,但标准卷积运算存在两个固有的缺陷。一方面,卷积运算仅限于局部窗口,无法捕获其他位置的信息, 并且它的采样形状是固定的。 另一方面,卷积核的大小固定为…

合肥知识付费系统解决方案,培训机构试听课不理想要怎么转化成学员?

现在到处都是培训机构&#xff0c;机构之间的竞争也是越发激烈的&#xff0c;很多机构为了获得生源&#xff0c;都会利用试听课来让家长或孩子&#xff0c;感受机构教学以及服务&#xff0c;那培训机构试听课不理想要怎么转化学员&#xff1f; 因为机构的试听课课程并不是同一种…

基于yolov8+gradio目标检测演示系统设计

YOLOv8与Gradio&#xff1a;开启目标检测的可视化新篇章 随着人工智能技术的飞速发展&#xff0c;目标检测作为计算机视觉领域的重要分支&#xff0c;已经广泛应用于安防监控、自动驾驶、医疗影像等多个领域。而YOLO&#xff08;You Only Look Once&#xff09;系列算法作为目…

光线追踪的渲染流程

光线追踪是一种基于物理的渲染技术&#xff0c;它模拟了光线在场景中的传播和相互作用过程。以下是光线追踪的基本渲染流程&#xff1a; 场景描述&#xff1a; 首先&#xff0c;需要描述场景&#xff0c;包括物体的几何形状、材质、光源等信息。每个物体通常由其几何形状&#…