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 ...
随机推荐
- python2.7.X 升级至Python3.6.X
安装Python3 项目是在py3环境下进行编码的,正好yczhang默认的py版本是2,我们还需要安装py3才能让程序run起来,在此之前,需要安装开发工具包,因为要编译安装Python [root ...
- Educational Codeforces Round 50
1036A - Function Height 20180907 \(ans=\left \lceil \frac{k}{n} \right \rceil\) #include<bits/ ...
- 小程序里let和var以及const区别
在JavaScript中有三种声明变量的方式:var.let.const. var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用. [JavaScript] 纯文 ...
- MySQL数据库报错pymysql.err.InterfaceError: (0, '')
今天入库的时候出现了报错pymysql.err.InterfaceError: (0, ''),经过排查,发现是由于把连接数据库的代码放到了插入函数的外部,导致多线程运行出错 def write_in ...
- python全栈开发 * 10知识点汇总 * 180612
10 函数进阶 知识点汇总 一.动态参数 形参的第三种1.动态接收位置传参 表达:*args (在参数位置编写 * 表⽰接收任意内容) (1)动态位置参数def eat(*args): print(a ...
- 创业维艰-->>书摘+乱七八糟
我把我的思路告诉了比尔:在不破产的情况下, 退出云计算服务的唯一办法是提高销售额, 因为即“即使我们将所有员工全部辞掉,如果销售额无法实现大幅增长的话, 基础设施成本依然会把我们逼上绝路.我进一步解释 ...
- 代码块事务—TransactionScope
今天上班遇到这样的业务:将删除的用户信息记录到记录表,再删除用户表中的信息. 可以说是不幸也可以说是幸运的. 在以往遇到这样的业务,我会考虑到各种出现异常或者失败的情况.在删除一张表数据失败的情况,对 ...
- MVEAN_day05 Nexus私服对的搭建
序言:为什么要搭建私服 因为在公司中我们是以团队进行开发的,不在是在自己的本地仓库中进行,我们需要连接公司远程仓库进行jar依赖.在公司的局域网中搭建的私服,然后开发人员连接这台计算机,进行团队开发. ...
- websocket作用
1.即时通讯 web即时通讯(网页的QQ,聊天系统等)可以通过websocket实现. 2.轮询 web开发中,有时需要通过轮询(比如时间间隔5秒)去服务器读取数据. 使用HTTP协议向服务器发送re ...
- 关于Oracle归档的一些操作
1.查看日志模式archive log list,或者select name,log_mode from v$database; 2.数据库非归档模式改为归档模式: 关闭数据库:shutdown im ...