flask --- 03 .特殊装饰器, CBV , redis ,三方组件
一.特殊装饰器(中间件)
1.before_request
在请求进入视图函数之前
@app.before_request
def look():
2. after_request
在结束视图函数之后,响应返回客户端之前
@app.after_request
def af1(res)
from flask import Flask, request, session, redirect app = Flask(__name__)
app.secret_key = "#$%^&*(" @app.before_request # 在请求 之前
def look():
print("be1")
if request.path == "/login":
return None
if session.get("username"):
return None
else:
return redirect("/login")
# print(request.method)
# return "我是before 我不让你走" @app.before_request # 在请求 之前
def be2():
print("be2") @app.before_request # 在请求 之前
def be3():
print("be3") @app.route("/")
def index():
print("index page")
return "index page" @app.route("/login")
def login():
print("正在登陆......")
session["username"] = "username"
return "login" @app.after_request
def af1(vf_ret):
# vf_ret.response[]=b'2000000 OK!'
print("af1")
return vf_ret @app.after_request
def af2(vf_ret):
# vf_ret.response[]=b'2000000 OK!'
print("af2")
return vf_ret @app.after_request
def af3(vf_ret):
# vf_ret.response[]=b'2000000 OK!'
print("af3")
return vf_ret
if __name__ == '__main__':
app.run(debug=True)
打印的结果为:

请求顺序:
正常 : be1 - be2 - be3 - vf - af3 - af2 - af1
异常 : be1 - af3 - af2 - af1
3. errorhandler( )
重定义错误信息
@app.errorhandler()
def error404(errormessage):
实例:
from flask import Flask, request, session, redirect
app = Flask(__name__)
@app.route("/login")
def login():
print("正在登陆......")
return "login"
@app.errorhandler(404) # 重定义404的错误
def error404(error_message):
print(error_message)
return f"你确定你要查看{request.path}这个页面吗?它已经走丢了,你快去找吧 "
# return redirect("http://baidu.com")
if __name__ == '__main__':
app.run(debug=True)

二. Flask 中的 CBV
基本格式为:
from flask import Flask, request,views app = Flask(__name__) class 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")) # endpoint = None 默认视图函数名as_view(name="login") name="login" if __name__ == '__main__':
app.run(debug=True)
三. windows 下 redis的使用
1.下载安装
①

②

③启动服务端: redis-server
启动客户端: redis-cli

2.redis 模块的使用
①模块下载


②简单使用
from redis import Redis re = Redis(host="127.0.0.1",port=,db=) # db 的范围在 1~15 类似于15 个库
# 切换时 用 select 1 re.set("kkk","") print(re.get("kkk"))

四. 三方组件 之 Flask-session
# .不想将Session的信息存放在Cookie
# .将Session存放在Redis
# .Cookie中保存Session的ID
1.组件下载

2.简单使用
①直接进行初始化
from flask import Flask, request, session
from flask_session import Session
from redis import Redis # from setting import Set app = Flask(__name__)
#初始化
app.config["SESSION_TYPE"] = "redis"
app.config["SESSION_REDIS"] = Redis(host="127.0.0.1",port=,db=) Session(app) @app.route("/login")
def login():
session["user"] = "username"
return "OK" @app.route("/see")
def see():
return session.get("user","还没有session") if __name__ == '__main__':
app.run(debug=True) # app.wsgi_app
② 设置setting.py 初始化 进行导入
1.在setting.py中
from redis import Redis
class Set(object):
SESSION_TYPE = "redis"
SESSION_REDIS = Redis()
2.使用时导入

五. 三方组件 之 WTForms
①下载

②简单使用
在 .py 文件中
from flask import Flask,request,render_template app = Flask(__name__) from wtforms.fields import simple,core
from wtforms import Form
from wtforms import validators class RegForm(Form):
username = simple.StringField(
label="用户名",
validators=[
validators.DataRequired(message="数据不能为空"),
validators.Length(min=,max=,message="%(min)d数据长度问题%(max)d")
],
render_kw={"class":"my_class"},
id="my_username"
) password = simple.PasswordField(
label="密码",
validators=[
validators.DataRequired(message="数据不能为空"),
validators.Length(min=, max=, message="%(min)d数据长度问题%(max)d")
],
render_kw={"class": "my_class"},
id="my_pwd"
) repassword = simple.PasswordField(
label="确认密码",
validators=[
validators.EqualTo("password",message="密码不一致")
]
) email = simple.StringField(
label="电邮",
validators=[
validators.Email(message="邮箱格式有问题例如1@1.1")
]
) hobby = core.SelectMultipleField( # 多选
label="爱好",
choices=[
(,"小姐姐"),
(,"老阿姨"),
(,"小萝莉"),
(,"御姐"),
],
default=[,],
coerce = int
) gender = core.SelectField( # 单选
label="性别",
choices=[
(, "小姐姐"),
(, "小哥哥"),
],
default=,
coerce=int
) sub = simple.SubmitField( # 可直接写在 .html 中,更方便
label="登录",
render_kw={"class":"red"}
) @app.route("/reg",methods=["POST","get"])
def reg():
if request.method == "GET":
rf = RegForm()
return render_template("reg.html",rf=rf)
else:
rf_data = RegForm(request.form)
if rf_data.validate():
print(rf_data.data)
return f"登陆成功{rf_data.data.get('username')}"
else:
return render_template("reg.html",rf=rf_data) if __name__ == '__main__':
app.run(debug=True)
在 .html 文件中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post" novalidate>
{% for field in rf %}
<p>{{ field.label }}{{ field }}{{ field.errors. }}</p>
{% endfor %}
</form>
</body>
</html>
flask --- 03 .特殊装饰器, CBV , redis ,三方组件的更多相关文章
- flask 第三章 特殊装饰器 CBV Flask-Session WTForms
1.flask中的特殊装饰器 前面我们讲过的装饰器函数中,用来登录验证,这次我们来介绍几个flask中的特殊装饰器 1). @app.before_request 具体的用途是: 在请求进入视图函数之 ...
- Flask--特殊装饰器, CBV, 三方组件
一. Flask中的特殊装饰器 before_request # before_request 是在视图函数执行之前执行的 @app.before_request def before(): prin ...
- python flask route中装饰器的使用
问题:route中的装饰器为什么感觉和平时使用的不太一样,装饰器带参数和不太参数有什么区别?被修饰的函数带参数和不带参数有什么区别? 测试1:装饰器不带参数,被修饰的函数也不带参数. def log( ...
- flask session,蓝图,装饰器,路由和对象配置
1.Flask 中的路由 *endpoint - url_for 反向地址 *endpoint 默认是视图函数名 *methods 指定视图函数的请求方式,默认GET defaults={& ...
- Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler
一.使用 Flask中的特殊装饰器(中间件)方法常用的有三个 @app.before_request # 在请求进入视图函数之前 @app.after_request # 在请求结束视图函数之后 响应 ...
- flask(1.1)装饰器装饰多个视图函数出现的问题
目录 1.装饰器装饰多个视图函数出现的问题 2.使用装饰器修复技术解决该问题 1.装饰器装饰多个视图函数出现的问题 代码实例: from flask import Flask, request, re ...
- flask框架-decorator装饰器
调用包: from functools import wraps 装饰器其实就是一个函数:参数是一个函数,返回值是一个函数 1.装饰器使用是通过@符号,在函数的上面 2.装饰器中定义的函数,要使用*a ...
- Cookie与Session、CBV添加装饰器
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- flask模板语言,装饰器,路由及配置
1.模板语言jinja2 Flask中默认的模板语言是Jinja2 1.0 模板传参 from flask import Flask,render_template app = Flask(__nam ...
随机推荐
- 第二篇 Linux 虚拟机操作
下一个虚拟机 Oracle VM 新建一个 空间啥都给大点, 然后下一个Ubuntu镜像 然后打开 试用 try 然后进入后安装就可以用Linux 啦 发现Linux还是看着蛮牛逼,单纯的用于编程 ...
- java课程课后作业05之动手动脑
一.使用Files. walkFileTree()找出指定文件夹下所有大于指定大小(比如1M)的文件 此代码没有使用walkfiletree,两者的差别在于walkfiletree在遍历文件的时候有一 ...
- hive 限制本地内存使用量
hive.mapred.local.mem Mapper/Reducer 在本地模式的最大内存量,以字节为单位,0为不限制. hive-default.xml <property> < ...
- js设计模式(五)---观察者模式
概述: 观察者模式也叫 “ 发布-订阅 " 模式 , 发布者发布信息是不需要考虑订阅者是谁?添加订阅者的时候也不需要通知发布者. 应用: 最经典的就是: DOM事件 开发过程中我们常用自定义 ...
- linux命令sync,shutdown
1.数据同步写入磁盘: sync 输入sync,那举在内存中尚未被更新的数据,就会被写入硬盘中 hling@hling:~$ sync 2.惯用的关机指令:shutdown 实例:
- makefile编写规则
cc = g++ -std=c++11 prom = calc deps = FtTest.h obj = FtTest.o newft.o LIBS = -lgtest_c11 $(prom): $ ...
- LwIP协议栈规范翻译——摘要目录
摘要 LwIP是一种TCP/IP协议栈的实现.LwIP协议栈专注于减少内存的使用和代码的大小,使LwIP适用于嵌入式系统中在有限的资源下能够使用小型的客户机.为了减少处理和内存的需求,LwIP使用裁剪 ...
- 1、jeecg 笔记开篇
1. 前言 终究还是入了 jeecg 的 "坑",国庆后公司采用该框架开发,故开篇记录. 虽说入"坑",但不得不承认 jeecg 确实是一个非常强大的平台. 其 ...
- python使用MySQLdb实现连接数据库Mysql
python实现连接数据库mysql的步骤: 一.引入MySQLdb 二.获取与数据库的连接 三.执行SQL语句和存储过程 四.关闭数据库连接 1.什么是MySQLdb? MySQLdb是用于pyth ...
- openshift 容器云从入门到崩溃之五《部署应用》
1.配置部署模板 配置好用户权限之后就可以部署应用了oc常用的两种部署方式: Deploy Image方式 优点:这种方式是最简单的部署方式,你只需要有一个容器镜像就行了或者公开的docker hub ...