巨蟒python全栈开发flask3

2024-02-28 23:10

本文主要是介绍巨蟒python全栈开发flask3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先,我们新建一个项目:

这个时候,我们调用ab函数,可以在所有的模板中使用.

 上边是一个特殊装饰器,

1.flask特殊装饰器

下面说几个特殊的装饰器

再请求之前的装饰器

运行:

这个时候,服务端打印的结果是GET和index Page

一开始可能打印多个,可能是请求图标,请求一次就会打印一个GET

 

 

下面是我们打印的结果:

这个时候装饰器里边的东西就没有用了(仔细理解)

在请求之前和之后理解的都是不严谨的.

 应该理解的是"在请求"进入服务之后,在请求进入视图函数之前

 

 我们再写一个login页面

运行,这样就会造成重定向次数过多而报错.

运行:

 

函数不停的在下面的两个红框位置进行跳转:

下面我们再引入白名单机制:直接进入视图函数

这个时候,再次运行:

也就是说,跳过了上图的内容:之前的请求,再走到下图中的login视图函数,走到下面的函数,直接返回"login Page"

我们在修改一下视图函数,也就是说,我们直接加入session

 这样只会在访问的一瞬间,加入session.

这样也就是基于before_request加入的login页面

 

@app.after_request这个表示的是在请求结束视图函数之后,返回客户端之前

]访问上边的页面:

服务端打印出下面的内容:

其中包括response,

 

再次运行:

服务端得到下图的内容:

我们对列表里边的内容进行替换:换成2000000

 

 

 服务端得到的结果,见下图.

注意,上边必须是一个唯一的,不能再多添加内容了.

 

运行:

 

 修改下面的内容

运行:

得到下图内容的结果:

 

1.Flask 中的特殊装饰器 
- 自己写的装饰视图函数用来验证登录
- Flask提供了几个小的装饰器 用来装饰函数1.# 在请求进入服务之后, 进入视图函数之前@app.before_requestdef look():2.# 在请求 结束视图函数之后 响应返回客户端之前@app.after_request def af1(res)3.请求顺序:正常 : be1 - be2 - be3 - vf - af3 - af2 - af1异常 :  be1 - af3 - af2 - af14.重定义错误信息@app.errorhandler(404)def error404(errormessage):

 

多写几个,看一下结果:

也就相当于是中间件;

django 的方式,和falsk在上边的这种方式是一样的

异常的话,应该怎样处理?

django的方式

 

而现在的flask对应的b1和a1,b2和a2,b3和a3不一定是对应关系.在上边我们写的代码中flask看似有关系,实际上没有任何的关系 

新版本django是绿色的箭头,老版本django的是红色的箭头,具体看下面:

而我们的flask遵循的就是老版本的django的方式,具体见下图:(粉色的箭头)

 

 下图是,在django中有关系的情况下,才会用,注意这个点:

先将,下面的session清除,再访问下面的界面:

这个时候,我们把session去除掉

再次访问,在be1里边就会发生阻塞问题.,就不会走到be2了

 

 @app.errorhandler()

括号里边需要填写异常的编号.

 

重新运行:前端得到的页面,注意:我们写的是错误的地址

服务端打印的只是,请求之前和之后的内容,以及errormessage返回的信息

 

 我们也可以向下面的写法,如果错误,直接跳转到百度的首页

访问下面的网址:

直接就得到下面的百度首页

 

如果函数,我们不懈404参数,

运行:得到下面的结果:报错

错误的内容,就是一个参数,注意函数里边的参数,就可以随便定义,毕竟只是一个形参,但是必须写这个参数,不写这个参数,就会报上边页面的问题.

 

修改之后,运行:服务端得到下面的页面.

 

2.flask之CBV

FBV我们已经熟悉了,只是加上一个装饰器,CBV这节课我们再次学习一下.

重新开始写我们的CBV

处理,

下面,我们运行一下,看一下效果.

我们看到了这个,支持get请求.

我们看一下是不是支持post,下面,我们将get请求函数注释掉,得到下面的内容

运行,下面叫做不支持方法,不叫报错

 

这个时候,服务端得到的是405错误

我们在和这个类中添加一个列表,注释get

我们,再次访问下面的内容,报错原因是,没有对应的方法GET

下图这个是指的是,抛出的异常,是错误

 

 在这里边有很多问题需要解释一下

 

这个时候,是函数里边包含函数

 

__doc__指代的就是下面的注释的内容

我们可以确定上边的methods是个None,

也就是说,view_func的结果是login,那么endpoint的结果是什么呢?

 

 

这个时候,cls加上括号,表示的就是初始化的对象.

上边的cls指代的是login,

 

上图是八种请求协议

 

现在的情况是,遍历里边的每一个值.从类里边找key.

执行的位置见下图:

meth指代的是get的视图函数.

2.Flask 中的 CBVclass Login(views.MethodView):# methods=["POST","GET"]# decorators = []def get(self):return "login"def post(self):return "post_login"app.add_url_rule("/login",view_func=Login.as_view(name="login"))

 

 

3.Falsk回顾基础:::三天结束(回顾整个flask基础)

1.response 
from flask import render_template,redirect,send_file,jsonifyHTTPResponserender_template redirect特殊类型返回值:1.send_file(文件路径) 打开并返回文件内容 Content-Type:文件类型 自动识别文件类型2.jsonify({k:v}) Content-Type:application/json app.config["JSONIFY_MIMETYPE"]2.requestrequest.method 请求方式request.args url参数request.form FormData 数据request.json 请求头 Content-Type:application/json 数据序列化至此request.data 只要请求体中有内容 b"
    request.files 接收FormData中的文件 3.sessionfrom flask import sessionapp.secret_key = "$%^&*("session["user"] = "username"将session存放在 客户端的Cookie中 ,CookieKey 在app.config["SESSION_COOKIE_NAME"]中存储4.路由动态参数路由 @app.route("/detail/<stu_id>")def detail(stu_id)1.endpoint   Flask Mapping 路由和视图的指向2.methods 允许进入视图函数的请求方式其他内容就不再这里回顾了
5.初始化配置Flask(__name__)1.template_folder   模板存放路径2.static_folder    静态文件存放路径3.static_url_path   静态文件访问路径大部分会由nginx帮助我们配置静态文件. 6.config对象class Setting(object):DEBUG=Trueapp.config.from_object(Setting)  #这个用的最多7.蓝图 重点from flask import Blueprintbp = Blueprint("bp",__name__,url_perfix="/前缀")@bp.route("/bp")def bp_func():app.register_blueprint(pb)    #重点位置目录结构app01的结构,几乎和django是一样的8.特殊装饰器 中间件(三种)@app.before_request   # 在请求进入视图函数之前@app.after_request   # 在结束视图函数之后,在响应返回客户端之前def af5(ret):正常 be1 - be2 - vf - af5 - af4 - af3 - af2 - af1异常 be1 - af5 - af4 - af3 - af2 - af1@app.errorhandler(404)def error404(error_message):9.CBVfrom flask import viewsclass Login(views.MethodView):def get(self):passdef post(self):passapp.add_url_rule("/login",endpoint=None,view_func=Login.as_view(name="login"))endpoint == as_view(name="login") 中的 "login"

 

 

4.flask-session(三方组件重点)

 我们需要在设置中安装第三方组件:

武佩奇是某个tarnado的源码贡献值,基本没人用.但是确实是很强啊

现在,我们用的大写的Session已经将Flask自带的session替换掉了.

用法:

下面,我们说一下这个第三方组件的一些注意事项:
(1)不想将Session的信息存放在Cookie中

(2)将Session存放在Redis  (redis一般情况下放在内网中)

(3)Cookie中保存Session的ID

 通过session中ID查找redis,想要破解信息,先破解ID,再破解Redis,Session中的信息还是加密的.

 

 

 

 这里边是Session初始化,走的是init

上图中,session的接口指的是什么?很想存放在config中的字典内.

 

 

点击进去,看一下这个自定义的配置

redis和memcached,后者更快一点点,容量小一点,处理的快一点点,不是太多.

 memcached只支持三方的持久化,自身不支持//只支持字符串和int//目前大家都是认可的但是很少用的.

redis支持两种持久化方式.//支持hash存储.

两者都有致命的bug.不要放在公网上.

MongoDB一般不用来作缓存,用redis,但是可以有一些其他处理

SQLALCHEMY其实就是ORM的操作对象.(三方的框架)

最好的框架是models.

sqlalchemy可能需要这个.这个也是很重要的.

猜测,自伤而下读取其中的数据库.

读远吗,我们知道要小写redis.

 

在上图中我们知道redis是小写的,并且和session_interface接口

这个时候,我们需要在python中装redis模块

 图形化操作安装和pip install也是可以的

开始学习1分钟学会

没有安装,怎么办?先下载,再安装

在官网上下载的是linux的redis,在window上没有

 没有找到,我们该如何处理?在github上边下载.

找到第二篇的内容,

 

这样我们就能下载完成了.

注意,端口就是6379

安装完成后,我们看下是否开启服务

 

 下图中,我们看到环境白能量中已经添加了redis了,同时也验证了上边控制中,添加了开启服务的命令.

 

 

 

 

控制台也可以get到在pycharm刚才写的内容

 

db参数有16(0-15)个数据库:

上边的实例化的过程中,我们可以设置一个参数.db=1

 

 

 这个时候,我们get最后的kkk,结果显示是空的.

 

现在我们查询一下数据库1

下面是切换数据库和到某个数据库里边拿值

 上边我们简单学习了一下redis

 

下面我们进入上图的RedisSessionInterface接口

实例化的内容,包括下图:

 

 

这个时候,我们访问login

 

运行:得到下面的结果

 

 上边的四五张图片是错误的:

 

正确得见下图,主要是在配置中写错了,:

# Author: studybrother sun
from flask import Flask, request,session
from flask_session import Session
from redis import Redis
app=Flask(__name__)
app.config["SESSION_TYPE"]="redis"  #源码中的写法
app.config["SESSION_REDIS"]=Redis(host="127.0.0.1",port=6379,db=15)  #源码中的写法
# app.secret_key="12321jkjo"
# app.default_config
# app.secret_key="()&*&^*%"
Session(app)
#1.不想将Session的信息存放在Cookie中 
#2.将Session存放在Redis #3.Cookie中报错Session的ID
#下面写一个视图函数,思考为什么还用原来的session? @app.route("/login") def login():session["user"]="username"return "OK" if __name__ == '__main__':app.run(debug=True)

 运行:

 

F12得到下面的session内容,session对应的Value是一个不可以被破解的ID

 

这个时候,我们看到application里边的session中的Value存储的就是UID,代表的就是用户ID

也就是不可被破解的ID

下面,我们再写一个视图函数

运行:

出现上图的原因是因为我们login里边设置了session里边的user键对应的是username

现在,我们需要重新情况session里边的内容:

我们通过删除上图中的session,然后

再次访问.

这个时候,得到的是没有值情况下的默认值设置.

再次运行上边的url,插入一个新的session

通过控制台,利用键我们拿不到值,什么情况?

 

上图最后一条语句,显示的是取值的方法,我们可以看到user和username

其中还包括时间戳.

序列化:

这个时候,我们可以拿到字典

 

 

时间戳+k+v  时间是31天.

 

上边,理解成返回字典就可以了

 

这也就是,我们给错了redis,或者写错了键就会开启session

注意上边的写法也是会报错,但时,我们理解的是SESSION_TYPE对应的值必须是小写的redis才行

 

这个时候,我们可以先处理将类写在settings里边:

 

这个时候,我们只需要引入我们设置的属性即可

 

 

5.flask之WTForms(三方组件重点)

 不能叫组件,可以说是一个插件,django的modelform,在其他的组件中叫WTForms

首先,我们需要安装一下.

 

 

 

上图中的SQLAlchemy是可以直接对数据库进行读写的

 

 

这个时候,我们需要加上一个视图函数,我们需要对比一下django里边的modelform组件,进行处理这个问题

from flask import Flask,request,render_templateapp=Flask(__name__)
from wtforms.fields import simple,core  #flask里边的modelform
@app.route("/login")
def login():return render_template("index.html")
if __name__=="__main__":app.run(debug=True)

wtf_app.py里边写的内容:

# Author: studybrother sun
from flask import Flask,request,render_template
app=Flask(__name__)
from wtforms.fields import simple,core  #flask里边的modelform
from wtforms import Form
from wtforms import validators  #这个指的是校验条件class LoginForm(Form):username=simple.StringField(label="用户名",validators=[validators.DataRequired(message="数据不能为空"),validators.Length(min=6,max=10,message="%(min)d数据长度问题%(max)d")   #设置最小值,最大值
        ],render_kw={"class":"my_class"},id="my_username"#做css样式的
    )password=simple.StringField(label="密码",validators=[validators.DataRequired(message="数据不能为空"),validators.Length(min=6,max=10,message="%(min)d数据长度问题%(max)d")   #设置最小值,最大值
        ],render_kw={"class":"my_class"},id="my_pwd"#做css样式的
    )
@app.route("/login")
def login():lf =LoginForm() #实例化上边的类return render_template("index.html",lf=lf)  #传递参数
if __name__=="__main__":app.run(debug=True)

index.html里边的内容:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta http-equiv="content-Type" charset="UTF-8"><meta http-equiv="x-ua-compatible" content="IE=edge"><meta name="viewport" content="width=device-width" ,initial-scale="1"><!--上边这个表示手机版的调整尺寸--><!--上述2个meta标签"必须"放在最前面,任何其他内容都必须跟随其后--><title>Title</title>
</head>
<body>{{lf}}
</body>
</html>

运行:这个时候,我们得到的是对象属性.

 

 

修改上边的内容:

再次运行,我们得到的两个框

 

思考一下,能不能加上一个submit

这个时候,得到上边的界面.

 

运行:

点击"登录"

 显示下图,没有这个方法

这个时候,我们需要将方法写到路由中.

 

转载于:https://www.cnblogs.com/studybrother/p/10689812.html

这篇关于巨蟒python全栈开发flask3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/756903

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta