flask基础三
内容回顾:
1.解决视图函数名重复的问题,装饰器返回内部函数的名称是一样, endpoint = viewfunc.__name__ ,endpoint
2.flask中的路由:
@app.route("/login")
1.methods=("GET","POST") 允许请求方式
2.endpoint = "反向url" #
3.url_for("反向url - endpoint") == "/"
4.redirct_to = "/login" 在请求进入视图函数之前返回,跳转
5./<arg> 动态路由参数 def index(arg)
3.Flask中的配置:
1.Flask实例配置app
app.config.from_object(obj)
class obj():
DEBUG=True,
REDIS=redis.Redis("127.0.0.1",6379,db=1),
SECRET_KEY = "123123"
JSONIFY_MIMETYPE="application/json"
2.Flask初始化配置:
template_folder="模板存放目录"
static_folder = "静态文件存放目录"
static_url_path = 默认 f"/{static_folder}" "在URL路径上所使用的地址"
4.蓝图 (Buleprint)
from flask import Buleprint
bp = Buleprint("bluename",__name__,template_folder,static_folder,static_url_path)
@bp.route("/blue",methods=(),endpoint)
def bl()
return
5.before_request after_request errorhandler
1.before_request 在请求进入视图函数之前,做出处理 @app.before_request
2.after_request 在请求结束视图函数之后,返回客户端之前,做出处理
def affunc(response)
return response
正常场景
be1-be2-af2-af1
异常场景
be1-af2-af1
3.errorhandler(404) 定义错误信息的返回
def error(arg)
return render_template
6.闪现 flash
from flask import flash , get_flashed_messages
flash("123")
flash("123")
msg = get_flashed_messages()[0]
使用一次即可消失
7.send_file() jsonify
from flask import send_file ,jsonify
send_file("文件路径") 打开文件并返回客户端
jsonify({k:v}) 将dict序列化成json 返回给客户端之前加入一个Content-Type:application/json
今日内容:.
1.Flask 中的 CBV
flask中也有CBV的:
endpoint和as_view中的name可以相同也可以不同。as_view的name是必须写的。
endpoint是作为 这个cbv的标识。
如果endpoint为None,那么as_view中name作为cbv的标识。
2.Flask中的插件 之 终于可以不用session 使用 Flask-Session
之前flask在设置session的时候需要配置一个app.secret_key的参数,这样写就会显得不安全,使用Flask-Session插件,会将session保存在redis数据库中,相对来说比较安全。
导入:
from flask import Flask, session
from flask_session import Session
from redis import Redis
配置:
app.config["SESSION_TYPE"] = "redis"
app.config["SESSION_REDIS"] = Redis(host="127.0.0.1",port=6379,db=5)
替换:
Session(app)
使用:
session["user"] = "aasdf" 设置session
session.get("user") 获取session
这里有个db参数,他可以是0-15的任意一个数,这个db参数就相当于把redis数据库分成16区域,各个区域不联系,如果把数据存储在0区域,在1区域取是取不到的。
3.Flask中的插件 之 如果你不使用前后端分离的话,这东西很好用 WTForms
html代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>这是登录页面</h1> <form action="post"> <p>{{ fm.username.label }} {{ fm.username }} {{ fm.username.errors.0 }}</p> <p>{{ fm.password.label }} {{ fm.password }}{{ fm.password.errors.0 }}</p> <p><input type="submit" value="登录"></p> </form> </body> </html>
这是写了一个登陆的Form,然后再写一个注册的form。
视图函数:
html代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> {% for field in fm %} <p>{{field.label}} {{field}} {{field.errors.0}}</p> {% endfor %} <p><input type="submit" value="注册"></p> </form> </body> </html>
总结:
1.Flask CBV
from flask import views
class index(views.MethodView):
methods = ["GET"]
def get()
def post()
app.add_url_rule("/index",endpoint=None,view_func=index.as_view(name="index"))
2.Flask-Session
三方组件:
from flask import session
from flask_session import Session
app.config["SESSION_TYPE"] = "redis"
app.config["SESSION_REDIS"] = REDIS("127.0.0.1",6379,db=12)
Session(app)
session["key"] = "123"
session["key"]
前缀+sid(session:asdfas-fasdfasdf-asdfsafsadf)
3.WTForms
simple.StringField(
label = "name"
validators=[
validators.校验方法(message="")
]
)
PasswordField
core.SelectMuitilField(
label = "name"
validators=[
validators.校验方法(message="")
],
choices = [
[1,"1"],[2,"2"],[3,"3"]
],
coerce = int
)
传递From
fm = wtfFrom()
return render_template("tem.html",fm = fm)
校验:
fm = wtfFrom(request.form)
if fm.validate():
return 成功
return render_template("tem.html",fm = fm)