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)

 

posted @ 2018-10-11 20:45  黑猫不是警长  阅读(130)  评论(0编辑  收藏  举报