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 ...
随机推荐
- lamda表达式和stream
stream主要用于处理数据,看一下jdk的文档,并且主要处理集合对象: int sum = widgets.stream() .filter(w -> w.getColor() == RED) ...
- vue里computed的get和set
computed里的对象有get和set方法. get是当该对象所依赖的变量发生变化是执行,重新returncomputed结果. set是该对象的值变化时会执行,并且将变化的结果作为参数传进set里 ...
- (转)JVM中的OopMap(zz)
原文地址: http://www.cnblogs.com/strinkbug/p/6376525.html 在读周智明的深入理解JVM虚拟机时,关于枚举根节点/安全点这部分感觉书上写的不是太明白,找了 ...
- ie9 remove出错 jquery SCRIPT5007: 缺少对象
针对IE11 remove不起作用的问题. 其中IE11.0.37也不支持 IE11.0.42支持可能是由于客户机器设置了兼容模式的原因. 因为里面包含了object元素,移除数据的时候发生的bug. ...
- Python中time模块详解(转)
在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: ...
- day5_不能循环删除list-深拷贝、浅拷贝(import copy)
一.循环删list里面的元素,会导致下标错位,结果是不对的举例:想删除奇数 l = [1,1,1,2,3,4,5] for i in l: if i%2 !=0: l.remove(i) #删除后,导 ...
- Visual Studio中配置Beyond Compare为版本比较工具
VS自带的合并工具并不理想,个人比较习惯Beyond Compare,这里替换成Beyond Compare,因为并不想改变所有的VS项目设置,这里以单个仓库项目为例,源代码管理器使用GIT 找到.g ...
- Postman 进阶(pre-request scripts&test script)
Postman 进阶 1. pre-request scripts pre-request scripts是一个关联了收藏夹内request,并且在发送request之前执行的代码片段.这对于在r ...
- 记录常用的adb命令
1.启动adb服务 adb start-server 2.关闭服务 adb kill-server 3.进入shell环境 adb shell 4.安装应用 adb install -r xxx.ap ...
- 解决IE浏览器兼容问题的一行代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...