美文网首页
Flask基础知识点2

Flask基础知识点2

作者: SlashBoyMr_wang | 来源:发表于2018-10-11 16:51 被阅读0次

    怒发冲冠,凭栏处、潇潇雨歇。抬望眼,仰天长啸,壮怀激烈。三十功名尘与土,八千里路云和月。莫等闲,白了少年头,空悲切!
    靖康耻,犹未雪。臣子恨,何时灭!驾长车,踏破贺兰山缺。壮志饥餐胡虏肉,笑谈渴饮匈奴血。待从头、收拾旧山河,朝天阙。

    一、Flask的视图CBV

    as_view中的name参数是在路由中endpoint参数不存在时代替endpoint来实现反向解析url的功能的,这个参数是必传的,在endpoint和name同时存在是name作用不生效!!!

    两个视图类方法:

    • methods = ["GET","POST"] //视图类的方法
    • decorators = ["wrapper1","wrapper2"] //给类添加装饰器
    from flask import Flask,url_for,views
    
    app = Flask(__name__)
    
    class Index(views.MethodView):
        methods = ["GET","POST"]   //视图类的方法
        decorators = ["wrapper1","wrapper2"]   //给类添加装饰器
    
        def get(self):
            print(url_for("indexs"))
            return "this is GET request"
    
        def post(self):
            return "this is POST request"
    
    app.add_url_rule("/index", view_func=Index.as_view(name = "indexs"))
    
    app.run()
    

    二、Flask中的插件Flask-Session

    • 下载Flask-Session:
      pip3 install redis
      pip3 install Flask-Session
    • 导入:
      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.get("user")

    使用示例:

    from flask import Flask, url_for, views
    from flask_session import Session
    from flask import session
    from redis import Redis
    
    app = Flask(__name__)
    
    app.config["SESSION_TYPE"] = "redis"
    app.config["SESSION_REDIS"] = Redis(host="127.0.0.1", port=6379, db=5)
    app.secret_key = "wangjifei111"   //可有可无
    
    Session(app)
    
    class Index(views.MethodView):
    
        def get(self):
            session["name"] = "wangjifei"
            return "this is GET request"
    
        def post(self):
            return "this is POST request"
    
    app.add_url_rule("/index", view_func=Index.as_view("indexs"))
    
    app.run()
    

    三、Flask中的WTforms的使用(和Django的form非常类似,就不累述了)

    • 下载:
      pip3 install wtforms

    • 简单使用:

    from flask import Flask, url_for, views, render_template, request
    from flask_session import Session
    from flask import session
    from redis import Redis
    from wtforms.fields import simple, core
    from wtforms import Form
    from wtforms import validators
    
    app = Flask(__name__)
    
    app.config["SESSION_TYPE"] = "redis"
    app.config["SESSION_REDIS"] = Redis(host="127.0.0.1", port=6379, db=5)
    
    Session(app)
    
    
    class LoginForm(Form):
        username = simple.StringField(
            label="用户名",
            validators=[
                validators.DataRequired(message="数据不能为空"),
                validators.Length(min=5, max=16, message="大于5小于16")
            ],
            render_kw={"class": "form-control"}
        )
    
        password = simple.PasswordField(
            label="密码",
            validators=[
                validators.DataRequired(message="数据不能为空"),
                validators.Length(min=5, max=16, message="大于5小于16"),
                validators.Regexp(regex="\d+", message="密码必须为数字")
            ],
            render_kw={"class": "form-control"}
        )
    
    class Login(views.MethodView):
        def get(self):
            loginfm = LoginForm()
            return render_template("login.html", login_html=loginfm)
    
        def post(self):
            loginfm = LoginForm(request.form)
            if not loginfm.validate():
                return render_template("login.html", login_html=loginfm)
            session["user"] = "wangjifei"
            return "登陆成功"
    
    app.add_url_rule("/login", endpoint="class_login", view_func=Login.as_view(name="login"))
    app.run()
    

    login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>login界面</title>
        <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.css" rel="stylesheet">
    </head>
    <body>
    
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <form action="" method="post">
                {% for field in login_html %}
                    <div class="form-group">
                        {{ field.label }}:{{ field }}<br>{{ field.errors.0 }}
                    </div>
                {% endfor %}
                <input type="submit" class="btn btn-seccess" value="提交">
            </form>
        </div>
    </div>
    </body>
    </html>
    
    • 略微复杂的使用:
    from flask import Flask, url_for, views, render_template, request
    from flask_session import Session
    from flask import session
    from redis import Redis
    from wtforms.fields import simple, core
    from wtforms import Form
    from wtforms import validators
    
    app = Flask(__name__)
    
    app.config["SESSION_TYPE"] = "redis"
    app.config["SESSION_REDIS"] = Redis(host="127.0.0.1", port=6379, db=5)
    
    Session(app)
    
    class RegForm(Form):
        username = simple.StringField(
            label="用户名",
            validators=[
                validators.DataRequired(message="数据不能为空"),
                validators.Length(min=5, max=16, message="大于5小于16")
            ],
            render_kw={"class": "form-control"}
        )
    
        password = simple.PasswordField(
            label="密码",
            validators=[
                validators.DataRequired(message="数据不能为空"),
                validators.Length(min=5, max=16, message="大于5小于16"),
                validators.Regexp(regex="\d+", message="密码必须为数字")
            ],
            render_kw={"class": "form-control"}
        )
    
        repassword = simple.PasswordField(
            label="密码",
            validators=[
                validators.DataRequired(message="数据不能为空"),
                validators.EqualTo("password", message="两次密码不一致")
            ],
            render_kw={"class": "form-control"}
        )
    
        gender = core.RadioField(
            label="性别",
            choices=(
                (1, "女"),
                (2, "男"),
                (3, "未知")
            ),
            coerce=int,
            default=3,
        )
    
        hobby = core.SelectMultipleField(
            label="嗜好",
            choices=[(1, "健身"),(2,"喝酒"),(3,"旅游")],
            coerce=int,
            default=1,
            render_kw={"class": "form-control"}
        )
    
    @app.route("/register", methods=["GET", "POST"])
    def reg():
        if request.method == "GET":
            regfm = RegForm()
            return render_template("reg.html", reg_html=regfm)
        else:
            regfm = RegForm(request.form)
            if not regfm.validate():
                return render_template("reg.html", reg_html=regfm)
    
            print(regfm.data.get("hobby"),
                  regfm.data.get("gender")
                  )
    
            return "注册成功"
    
    app.run()
    

    reg.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.css" rel="stylesheet">
    </head>
    <body>
    
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <form action="" method="post">
                {% for field in reg_html %}
                    <div class="form-group">
                        {{ field.label }}:{{ field }}<br>{{ field.errors.0 }}
                    </div>
                {% endfor %}
                <input type="submit" class="btn btn-seccess" value="提交">
            </form>
        </div>
    </div>
    </body>
    </html>
    

    相关文章

      网友评论

          本文标题:Flask基础知识点2

          本文链接:https://www.haomeiwen.com/subject/szpbaftx.html