python之flask安装以及使用
1 flask介绍
Flask是一个非常小的Python Web框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用。
2 python虚拟环境搭建
python虚拟环境管理方法: 1.virtualenv 2.Virtualenvwrapper 3.conda 4.pipenv

3 pipenv使用
┌──(kali㉿kali)-[~/Desktop/python_code] └─$ ls flask1 ┌──(kali㉿kali)-[~/Desktop/python_code] └─$ cd flask1 ┌──(kali㉿kali)-[~/Desktop/python_code/flask1] └─$ pipenv shell

┌──(flask1-l5Pm-i-x)─(kali㉿kali)-[~/Desktop/python_code/flask1] └─$ ls Pipfile #Pipfile 等于安装的插件包名 ┌──(flask1-l5Pm-i-x)─(kali㉿kali)-[~/Desktop/python_code/flask1] └─$ cat Pipfile 安装 flask ┌──(flask1-l5Pm-i-x)─(kali㉿kali)-[~/Desktop/python_code/flask1] └─$ pipenv install flask
4 flask第一个应用
新建app.py
#!/usr/bin/env python3
from flask import Flask
#初始化
app =Flask(__name__)
@app.route('/')
def index():return 'Hello World!'
if __name__ == '__main__':app.run()
执行app.py

游览器效果

5 路由和视图函数
#!/usr/bin/env python3
# 这一行告诉系统使用哪个解释器来执行脚本,这里指定为 python3 from flask import Flask
# 从flask模块中导入Flask类,用于创建Flask web应用程序实例 # 初始化
app = Flask(__name__)
# 创建一个Flask应用程序实例,并赋值给变量app。__name__是当前模块的名字,代表应用程序的根路径 # 设置多个路由
@app.route('/')
# 定义一个路由装饰器,当访问根路径'/'时,会调用下面的index函数
def index(): return 'Hello World!'
# 定义一个视图函数index,当访问'/'路径时,返回'Hello World!'字符串 @app.route('/a')
# 定义另一个路由装饰器,当访问'/a'路径时,会调用下面的add函数
def add(): return '1+1=2'
# 定义一个视图函数add,当访问'/a'路径时,返回'1+1=2'字符串 @app.route('/user/<username>')
# 定义一个带有动态部分的路由装饰器,'<username>'是一个动态部分,可以匹配任何字符串
def user_index(username): # 在函数中指明变量名称username,就能获取到通过路由传入的变量username return 'Hello {} '.format(username)
# 定义一个视图函数user_index,该函数接受一个参数username,这是从路由动态部分获取的。函数返回'Hello '加上用户名 @app.route('/post/<int:post_id>')
# 定义一个带有动态部分且类型指定的路由装饰器,'<int:post_id>'表示动态部分必须是整数类型
def show_post(post_id): return 'Post {} '.format(post_id)
# 定义一个视图函数show_post,该函数接受一个整数类型的参数post_id,这是从路由动态部分获取的。函数返回'Post '加上文章ID if __name__ == '__main__': # 判断当前脚本是否作为主程序运行 app.run(debug=True)
6URL重定向
#!/usr/bin/env python3 # 导入 Flask 框架
from flask import Flask
from flask import url_for
from flask import redirect # 初始化 Flask 应用
app = Flask(__name__) # 设置路由到根路径 '/'
@app.route('/')
def index(): return 'Hello World!' # 返回欢迎信息 # 设置路由到 '/a'
@app.route('/a')
def add(): return '1+1=2' # 返回加法运算结果 # 设置路由到 '/user/<username>',其中 <username> 是一个动态部分
@app.route('/user/<username>')
def user_index(username): # 在视图函数中通过参数获取路由中的动态部分 username return 'Hello {} '.format(username) # 返回包含用户名的欢迎信息 # 设置路由到 '/post/<int:post_id>',其中 <int:post_id> 是一个整数类型的动态部分
@app.route('/post/<int:post_id>')
def show_post(post_id): return 'Post {} '.format(post_id) # 返回包含帖子ID的字符串 # 设置路由到 '/test'
@app.route('/test')
def test(): # 使用 url_for 函数生成路由的 URL,并打印出来 print(url_for('index')) # 打印根路径的 URL print(url_for('user_index', username='scj')) # 打印用户路径的 URL,传入用户名 'scj' print(url_for('show_post', post_id=1)) # 打印帖子路径的 URL,传入帖子ID 1 return 'test' # 返回测试字符串 # 设置路由到 '/<username>',其中 <username> 是一个动态部分
@app.route('/<username>')
def hello(username): if username == 'handsomescj': return 'Hello {}' .format(username) # 如果用户名是 'handsomescj',则返回欢迎信息 else: return redirect(url_for('index')) # 否则重定向到根路径 # 主程序入口
if __name__ == '__main__': app.run(debug=True) # 运行 Flask 应用,并开启调试模式
请注意,代码中有个小的错误,app =Flask(__name__) 这一行应该去掉变量名 app 前的空格,修改为 app = Flask(__name__)。
在 Flask 应用中,注释是一个很好的习惯,它们可以帮助你和其他开发者理解代码的功能和逻辑。在编写代码时,记得添加足够的注释,尤其是在复杂的逻辑部分。
7模板渲染
python
#!/usr/bin/env python3 # 导入 Flask 框架
from flask import Flask
from flask import url_for
from flask import redirect
from flask import render_template # 初始化 Flask 应用
app = Flask(__name__) # 设置路由到根路径 '/'
@app.route('/')
def index(): return 'Hello World!' # 返回欢迎信息 # 设置路由到 '/a'
@app.route('/a')
def add(): return '1+1=2' # 返回加法运算结果 # 设置路由到 '/user/<username>',其中 <username> 是一个动态部分
@app.route('/user/<username>')
def user_index(username): # 使用 render_template 函数渲染 'user_index.html' 模板,并传入变量 username return render_template('user_index.html', username=username) # 返回渲染后的页面 # 设置路由到 '/post/<int:post_id>',其中 <int:post_id> 是一个整数类型的动态部分
@app.route('/post/<int:post_id>')
def show_post(post_id): return 'Post {} '.format(post_id) # 返回包含帖子ID的字符串 # 设置路由到 '/test'
@app.route('/test')
def test(): # 使用 url_for 函数生成路由的 URL,并打印出来 print(url_for('index')) # 打印根路径的 URL print(url_for('user_index', username='scj')) # 打印用户路径的 URL,传入用户名 'scj' print(url_for('show_post', post_id=1)) # 打印帖子路径的 URL,传入帖子ID 1 return 'test' # 返回测试字符串 # 设置路由到 '/<username>',其中 <username> 是一个动态部分
@app.route('/<username>')
def hello(username): if username == 'handsomescj': return 'Hello {}' .format(username) # 如果用户名是 'handsomescj',则返回欢迎信息 else: return redirect(url_for('index')) # 否则重定向到根路径 # 主程序入口
if __name__ == '__main__': app.run(debug=True) # 运行 Flask 应用,并开启调试模式
新建templates 文件夹
以及在templates 文件中新建user_index.html
<h1>hello,{{ username }}!</h1>
8 get与post请求
get请求
#!/usr/bin/env python3
from flask import Flask
from flask import url_for
from flask import redirect
from flask import render_template
#初始化
app =Flask(__name__)
#设置多个路由
@app.route('/')
def index():return 'Hello World!'
@app.route('/a')
def add():return '1+1=2'
@app.route('/user/<username>')
def user_index(username):#在函数中指明变量名称username,就能获取到通过路由传入的变量usernamereturn render_template('user_index.html',username=username)
@app.route(' /user/<password>' )
def user_password(password) :print( 'User-Agent :' , request.headers.get ( 'User-Agent ' ))print( 'time: ' , request.args. get( 'time'))print( 'q: ' , request.args. get( 'q'))print ( 'issinge : ' , request.args.get( ' issinge ' ))return ' password is{} '.format(password)
@app.route('/post/<int:post_id>')
def show_post(post_id):return 'Post {} '.format(post_id)
@app.route('/test')
def test():print(url_for('index'))print(url_for('user_index',username='scj'))print(url_for('show_post',post_id=1))return 'test'
@app.route('/<username>')
def hello(username):if username =='handsomescj':return 'Hello {}' .format(username)else:return redirect(url_for('index'))
if __name__ == '__main__':app.run(debug=True)
post请求
#!/usr/bin/env python3 from flask import Flask, request, render_template, redirect, url_for # 初始化
app = Flask(__name__) # 设置多个路由
@app.route('/')
def index(): return 'Hello World!' @app.route('/a')
def add(): return '1+1=2' @app.route('/user/<username>')
def user_index(username): # 在函数中指明变量名称username,就能获取到通过路由传入的变量username return render_template('user_index.html', username=username) @app.route('/user/<password>')
def user_password(password): print('User-Agent:', request.headers.get('User-Agent')) print('time:', request.args.get('time')) print('q:', request.args.get('q')) print('issinge:', request.args.get('issinge')) return 'password is {}'.format(password) @app.route('/post/<int:post_id>')
def show_post(post_id): return 'Post {}'.format(post_id) @app.route('/test')
def test(): print(url_for('index')) print(url_for('user_index', username='scj')) print(url_for('show_post', post_id=1)) return 'test' @app.route('/<username>')
def hello(username): if username == 'handsomescj': return 'Hello {}'.format(username) else: return redirect(url_for('index')) @app.route('/register', methods=['GET', 'POST'])
def register(): print('method:', request.method) print('name:', request.form['name']) print('password:', request.form.get('password')) print('hobbies:', request.form.getlist('hobbies')) print('age:', request.form.get('age', default=18)) return 'register success!' if __name__ == '__main__': app.run(debug=True)
新建client.py
#!/usr/bin/env python3 import requests # 设置需要发送的数据
user_info = { 'name': 'scj', # 去掉键和值之间的空格 'password': '123456', # 去掉键和值之间的空格 'hobbies': ['code', 'run'] # 列表中的字符串去掉空格
} # 向url发送post请求
r = requests.post("http://127.0.0.1:5000/register", data=user_info) print(r.status_code) # 打印请求返回的状态码
9session与cookie
#!/usr/bin/env python3 from flask import Flask
from flask import url_for
from flask import redirect
from flask import render_template
from flask import request
from flask import session
from flask import make_response# 初始化
app = Flask(__name__) app.secret_key='kdjklfjkd87384hjdhjh'# 设置多个路由
@app.route('/')
def index(): return 'Hello World!' @app.route('/a')
def add(): return '1+1=2' #@app.route('/user/<username>')
#def user_index(username): # 在函数中指明变量名称username,就能获取到通过路由传入的变量username #return render_template('user_index.html', username=username) @app.route('/user/<password>')
def user_password(password): print('User-Agent:', request.headers.get('User-Agent')) print('time:', request.args.get('time')) print('q:', request.args.get('q')) print('issinge:', request.args.get('issinge')) return 'password is {}'.format(password) @app.route('/post/<int:post_id>')
def show_post(post_id): return 'Post {}'.format(post_id) @app.route('/test')
def test(): print(url_for('index')) print(url_for('user_index', username='scj')) print(url_for('show_post', post_id=1)) return 'test' @app.route('/<username>')
def hello(username): if username == 'handsomescj': return 'Hello {}'.format(username) else: return redirect(url_for('index')) @app.route('/register', methods=['GET', 'POST'])
def register(): print('method:', request.method) print('name:', request.form['name']) print('password:', request.form.get('password')) print('hobbies:', request.form.getlist('hobbies')) print('age:', request.form.get('age', default=18)) return 'register success!' @app.route('/set_session')
def set_session(): # 设置session的持久化 session.permanent = True session['username'] = 'scj' return '成功设置session' @app.route('/get_session')
def get_session(): value = session.get('username') return '成功获取session值为:{}'.format(value)@app.route('/set_cookie/<username>')
def set_cookie(username): resp = make_response(render_template('user_index.html', username=username)) resp.set_cookie('user', username) # 使用'user'作为cookie的名字 return resp @app.route('/get_cookie')
def get_cookie(): username = request.cookies.get('username') # 使用'user'来检索cookie的值 return 'Hello {}'.format(username) # 修正格式化字符串的语法 if __name__ == '__main__': app.run(debug=True)
10 errot404
#!/usr/bin/env python3 from flask import Flask
from flask import url_for
from flask import redirect
from flask import render_template
from flask import request
from flask import session
from flask import make_response# 初始化
app = Flask(__name__) app.secret_key='kdjklfjkd87384hjdhjh'# 设置多个路由
@app.route('/')
def index(): return 'Hello World!' @app.route('/a')
def add(): return '1+1=2' @app.route('/user/<username>')
def user_index(username): if username == 'invalid'abort(404)return render_template('user_index.html',username=username)@app.route('/user/<password>')
def user_password(password): print('User-Agent:', request.headers.get('User-Agent')) print('time:', request.args.get('time')) print('q:', request.args.get('q')) print('issinge:', request.args.get('issinge')) return 'password is {}'.format(password) @app.route('/post/<int:post_id>')
def show_post(post_id): return 'Post {}'.format(post_id) @app.route('/test')
def test(): print(url_for('index')) print(url_for('user_index', username='scj')) print(url_for('show_post', post_id=1)) return 'test' #@app.route('/<username>')
#def hello(username):
# if username == 'handsomescj':
# return 'Hello {}'.format(username) # else:
# return redirect(url_for('index')) @app.route('/register', methods=['GET', 'POST'])
def register(): print('method:', request.method) print('name:', request.form['name']) print('password:', request.form.get('password')) print('hobbies:', request.form.getlist('hobbies')) print('age:', request.form.get('age', default=18)) return 'register success!' @app.route('/set_session')
def set_session(): # 设置session的持久化 session.permanent = True session['username'] = 'scj' return '成功设置session' @app.route('/get_session')
def get_session(): value = session.get('username') return '成功获取session值为:{}'.format(value)@app.route('/set_cookie/<username>')
def set_cookie(username): resp = make_response(render_template('user_index.html', username=username)) resp.set_cookie('user', username) # 使用'user'作为cookie的名字 return resp @app.route('/get_cookie')
def get_cookie(): username = request.cookies.get('username') # 使用'user'来检索cookie的值 return 'Hello {}'.format(username) # 修正格式化字符串的语法 @app.route(404)
def not_found(error):return render_template('404.html'),404if __name__ == '__main__': app.run(debug=True)
404.html
错了,sb
相关文章:
python之flask安装以及使用
1 flask介绍 Flask是一个非常小的Python Web框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用。 2 python…...
汽车笔记-保险
保险 1.交强险 上路必须买的, 国家规定必须要买。交强险不管你是有责还是无责,它都是可以赔偿的。交强险还有一个18000的垫付功能,比如说我们出了交通事故后,对方住院治疗需要你垫付钱,那么这个时候就可以用到交强险…...
人工智能时代的图像识别:机遇与挑战并存
人工智能(AI)时代为图像识别领域带来了前所未有的机遇,同时也伴随着一系列挑战。这一领域的发展不仅深刻影响了科技、医疗、教育、娱乐等多个行业,还在一定程度上改变了人们的生活方式。 机遇: 技术突破与创新&#…...
工作 9 年后,回老家当计算机老师的真实感受
北京某程序员发帖,他说自己工作了整整 9 年后,今年六月就告别了北京这个大都市,安安心心地回老家当起了计算机老师。 工作日,每天早上 8 点就得按点上班儿,到了下午 4 点半,下班儿的铃声一响,就…...
二叉树的镜像【c++】
#include <iostream> #include <vector> using namespace std;//双链表节点结构 typedef struct treeNode {int value;struct treeNode* left;struct treeNode* right;treeNode(int x) : value(x), left(nullptr), right(nullptr) {} } TreeNode;void mirrorTree(T…...
记录Python的pandas库详解
如何生成一个pd import pandas as pd df pd.DataFrame([[1,2,3],[4,5,6]],index[A,B],columns[C1,C2,C3])df ---------------------------------------------------------------------------C1 C2 C3 A 1 2 3 B 4 5 6df.T -------------------------------------------------…...
阻碍团队使用工具的原因竟然是……
本文首发于个人网站「BY林子」,转载请参考版权声明。 工具化、自动化、数字化,这些都是逐步改善工作的质量和效率的方式,是时代不断进步的表现。然而,还是有很多软件开发团队的工作还处于手工阶段,这是为什么呢&#x…...
【并发】第九篇 Atomic原子操作类 - 字段更新器类详解
导航 简介AtomicIntegerFieldUpdater简介 Atomic的字段更新器类是Java中一种用于实现线程安全的字段更新操作的类。它提供了一组原子操作,可以对字段进行原子性的更新。在并发环境中,多个线程同时更新一个字段可能会出现竞态条件(Race Condition)导致数据不一致的问题。At…...
FFmpeg: 自实现ijkplayer播放器--03UI界面设计
文章目录 UI设计流程图UI设计界面点击播放功能实现 UI设计流程图 UI设计界面 主界面 控制条 播放列表 画面显示 标题栏 设置界面 提示框 点击播放功能实现 槽函数实现: connect(ui->ctrlBarWind, &CtrlBar::SigPlayOrPause, this, &Main…...
【安装部署】Apache SeaTunnel 和 Web快速安装详解
版本说明 由于作者目前接触当前最新版本为2.3.4 但是官方提供的web版本未1.0.0,不兼容2.3.4,因此这里仍然使用2.3.3版本。 可以自定义兼容处理,官方提供了文档:https://mp.weixin.qq.com/s/Al1VmBoOKu2P02sBOTB6DQ 因为大部分用…...
泰迪智能科技携手洛阳理工学院共建“泰迪·洛阳理工数据智能工作室”
为深化校企合作,实现应用型人才培养目标,4月11日,洛阳理工学院携手广东泰迪智能科技股份有限公司举行“泰迪洛阳理工数据智能工作室”揭牌仪式暨工作室成员动员会在洛阳理工学院举行。洛阳理工学院计算机与信息工程学院院长石念峰、副院长李明…...
jenkins构建微信小程序并展示二维码
测试小程序的过程中,很多都是在回头和前端开发说一句,兄弟帮我打一个测试版本的测试码,开发有时间的情况下还好,就直接协助了,但是很多时候他们只修复了其中几个bug,其他需要修复的bug代码正在编写…...
阿里云大学考试python中级题目及解析-python中级
阿里云大学考试python中级题目及解析 1.WEB开发中,下列选项中能够实现客户端重定向的设置是() A.响应头设置Location状态码200 B.响应头设置Location状态码302 C.响应头设置Accept-Location状态码301 D.响应头设置Accept-Location状态码…...
攻防演练作为红方,怎么绕过Web应用防火墙
在攻防演练中,作为红方尝试绕过Web应用防火墙(WAF)是一项常见且具有挑战性的任务。这要求你对WAF的工作原理有深入的理解,并且能够创造性地应用各种技术来测试WAF的防御限制。以下是一些更专业且可操作的策略,用于尝试…...
AI音乐,8大变现方式——Suno:音乐版的ChatGPT - 第505篇
悟纤之歌 这是利用AI为自己制作的一首歌,如果你也感兴趣,可以花点时间阅读下本篇文章。 导读 随着新一代AI音乐创作工具Suno V3、Stable audio2.0、天工SkyMusic的发布,大家玩自创音乐歌曲,玩的不亦乐乎。而有创业头脑的朋友…...
【C++】模拟list
list的模拟真的很震撼,第一次学习时给我幼小的心灵留下了极大地冲击 接下来我们一起看看list模拟究竟是怎样一回事 目录 节点的封装:list类的实现:私有成员变量:构造函数:push_back && pop_back: 迭代器类的实…...
SAP项目任务一览表
根据SAP Activate项目管理方法论的主要精神,浓缩到一些主要的团队和任务。 主要的团队有: 项目管理(办公室)Project Management(office):项目经理团队,包括项目办公室。负责项目整体运行和监控,项目办公室负责项目的…...
130个学术网站和26个科研工具
我们平时可以见到不少学术资源,但是很多信息里会有一些重叠网站、无效网站,导致我们虽然收藏了很多网址,但是却并不都能用,学妹特地整合了130个学术资源网站和26个科研工具,每一个都是亲自试过有效的,希望能…...
《一键搞定!揭秘微信公众号文章批量下载的终极神器》
大家好!今天我要给大家介绍一个超级好用的小工具,能帮你轻松批量下载微信公众号的文章,还不需要安装任何证书哦!无论你是学生还是普通爱好者,只要你想保存一些精彩的公众号内容,这个工具都能帮到你。 概览 …...
鸿蒙入门02-首次安装和配置
注:还没有安装编辑器( deveco studio )的小伙伴请看鸿蒙入门01-下载和安装-CSDN博客 首次安装配置 编辑器( deveco studio )安装完毕以后需要进入配置界面进行相关配置配置完毕以后才可以正常使用 环境配置…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
