zoukankan      html  css  js  c++  java
  • flask的CBV,flash,Flask-Session,及WTForms-MoudelForm

    1,CBV:

    • from flask import vews
    • class LoginView(views.MethodView):
      • def get(self):
        • return "雪雪其实也很好,"
      • def post(self):
        • return "听说雪人很要走了,那些等有机会,等有时间,都觉的遥远了"
    • app.add_url_rule("/login", endpoint=None, view_func=LoginView.as_view("login"))

    2,flask:

    • from flask import flask,get_flash_messages
    • flash("雪雪", "tag")   # 闪存
    • get_flash_messages("tag")

    3,Flask-Session

    • from flask_session import Session
    • from flask import session
    • app.config["SESSION_TYPE"] = "redis"
    • app.config["SESSION_REDIS"] = Redis("127.0.0.1", 6379, db=7)
    • Session(app)

    4,WTForms - MoudelForm

    • from wtfroms.field import simple,core
    • from wtforms import Form,validators
    • class LoginForm(Form):
      • username = simple.StringField(label= "用户名")
    • loginForm = LoginForm()
    • render_template("login.html", loginForm=loginForm)
    • {{ loginForm.username }}
    • {{ loginForm.password }}
    • {{ loginForm.username.errors.0 }}
    • loginForm = LoginForm(request.forms)
    • if not loginForm.validata():
      • render_template("login.html", loginForm)

    具体代码:

    CBV的写法:

    from flask import Flask, flash, get_flashed_messages,render_template
    from flask import views
    # 实例化Flask对象
    app = Flask(__name__)  # type: Flask
    app.secret_key = "miss"
    
    
    @app.route("/")
    def index():
        # 这个flash取完值就没有了,一次性的事
        flash("xuexue", "小老弟")
        flash("xiaoxue")
        return "我的头可不是面团捏的!!!"
    
    
    # CBV的写法
    class LoginClass(views.MethodView):
        # get请求的方法
        def get(self):
            print(get_flashed_messages("小老弟"))
            print(get_flashed_messages())
            return render_template("login.html")
    
        # 提交数据的方法
        def post(self):
            return "来了, 老弟~~~"
    
    
    # 注册路由
    app.add_url_rule("/login", view_func=LoginClass.as_view("login"))
    
    
    @app.before_first_request
    def asd():
        # 在这根据flash判断是不是第一次请求
        # 第一次请求,就把flash的值取走,
        print("bf1")
        return "不知道该写什么了..."
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    APP-flask-Session

    from flask import Flask,render_template, redirect, session
    from flask import views
    from redis import Redis  # 这个必须写,重新封装Redis的时候用
    from flask_session import Session  # 用了这个Session就不用指定secret_key = xxxx
    # 实例化一个 Flask对象
    app = Flask(__name__)  # type:Flask
    app.config["SESSION_TYPE"] = "redis"
    app.config["SESSION_REDIS"] = Redis("127.0.0.1", 6379, db=7)  # db表示能开几个服务
    # 实例化一个Session的对象把Flask数理化的对象传进去,就不用指定secret_key=xxx了
    Session(app)
    
    @app.route("/")
    def index():
        session["user"] = "雪人"
    
        return "雪人哈哈哈哈哈~~~~"
    
    
    class LoginClass(views.MethodView):
    
        def get(self):
            print(session.get("user"))
            # 7b97e0ef-2a14-4725-842e-848fde4d2f15
            # 和uuid的值特别的像
            return render_template("login.html")
    
        def post(self):
            return "啧啧啧..."
    
    
    app.add_url_rule("/login", view_func=LoginClass.as_view("login"))
    
    
    if __name__ == '__main__':
        app.run(debug=True)

    app的视图函数

    from flask import Flask,render_template, request
    from flask import views
    from wtforms.fields import simple, core
    from wtforms import Form
    from wtforms import validators
    from wtforms import widgets
    
    
    # CBV的写法
    # 指定登录的类继承Form
    class LoginForm(Form):
        # 定义校验的字段
        username = simple.StringField(
            label="用户名",
            # 要校验该字段的内容
            validators=[
                validators.DataRequired(message="不能为空"),
                validators.Length(min=5, max=10, message="用户名不能小于5个字符求不能大于10个字符")
            ],
            # widget=widgets.TextInput
            render_kw={"class": "my_username"}  # 在标签上加一个样式类
        )
        password = simple.PasswordField(
            label="密码",
            # 要校验该字段的内容
            validators=[
                validators.DataRequired(message="不能为空"),
                validators.Length(min=6,message="密码最少要6位"),
                validators.Length(max=12, message="密码至多12位"),
                validators.Regexp(regex="d+", message="密码必须是纯数字"),
            ],
            render_kw={"class": "my_password"}
        )
    
    
    # 注册的Form
    class RegisterForm(Form):
        username = simple.StringField(
            label="用户名",
            validators=[
                validators.DataRequired(message="用户名不能为空"),
            ],
            render_kw={"class": "my_username"}
        )
        nickname = simple.StringField(
            label="昵称",
            validators=[
                validators.DataRequired(message="昵称不能为空")
            ],
            render_kw={"class": "my_username"}
        )
        password = simple.PasswordField(
            label="密码",
            validators=[
                validators.DataRequired(message="密码不能为空"),
                validators.Length(min=6, max=12, message="密码大于6小于12"),
                validators.Regexp(regex="d+", message="密码必须是数字"),
            ],
            render_kw={"class": "my_password"}
        )
        re_password = simple.PasswordField(
            label="重复密码",
            validators=[
                validators.EqualTo(fieldname="password",message="两次密码不一致"),
            ],
        )
        email = simple.StringField(
            label="邮箱",
            validators=[
                validators.Email(message="格式不正确"),
            ],
            render_kw={"class": "my_email"}
        )
        gender = core.RadioField(
            label="性别",
            coerce=int,  # 拿到的是性别在数据库中的前边数字
            choices=(
                (1, "女"),
                (2, "男"),
            ),
            default=1  # 设置默认值为1
        )
        hobby = core.SelectMultipleField(
            label="爱好",
            coerce=int,
            choices=(
                (1, "烤串"),
                (2, "烤面包片"),
                (3, "烤鱼"),
                (4, "pizza"),
                (5, "蝎王府"),
            ),
            default=(3,5)
        )
    # 实例化一个Flask的对象
    app = Flask(__name__)  # type:Flask
    
    @app.route("/")
    def index():
        return "我的头可不是面团捏的"
    
    # 登录页面
    class LoginView(views.MethodView):
        def get(self):
            loginForm = LoginForm()
            return render_template("login.html", loginForm=loginForm)
    
        def post(self):
            # 将获取到的数据放到LoginForm中进行
            loginForm = LoginForm(request.form)
            # 通过校验的数据
            if loginForm.validate():
                return "登录成功"
            else:
                return render_template("login.html", loginForm=loginForm)
    
    
    app.add_url_rule("/login", view_func=LoginView.as_view("login"))
    
    
    # 注册的业务逻辑函数
    class RegisterView(views.MethodView):
        def get(self):
            # 实例化注册的校验类
            regForm = RegisterForm()
            if regForm.validate():
                return "注册通过了校验"
            else:
                return render_template("register.html", regForm=regForm)
    
        def post(self):
            regForm = RegisterForm(request.form)
            if regForm.validate():
                return "通过校验的数据"
            else:
                return render_template("register.html", regForm=regForm)
    
    
    app.add_url_rule("/register", view_func=RegisterView.as_view("register"))
    
    
    if __name__ == '__main__':
            app.run(debug=True)

    5,DBUtils数据连接池

    import pymysql
    from DBUtils.PooledDB import PooledDB
    # 实例化pooleDB对象
    POOL = PooledDB(
        creator=pymysql,  # 使用连接数据库的模块
        maxconnections=6,  # 连接池允许的最大连接数, 0和None表示不限制连接数
        mincached=2,  # 初始化时,连接池中至少创建的空闲的连接,0表示不创建
        maxcached=5, # 连接池中最多闲置的连接, 0和None不限制
        maxshared=3,  # 连接池中最多共享的连接数量, 0和None表示全部共享.ps:无用,因为pymysql和mysqldb等模块的threadsafety都为1, 所有值无论设置为多少,maxacahed永远为0,所以永远是共享所有连接都共享
        blocking=True,  # 连接池中如果没有可用连接,是否阻塞等待.True,等待,False,不等待然后报错
        maxusage=None,  # 一个连接最多被重复使用的次数, None表示无限制
        setsession=[],  # 开始会话前执行的命令列表. 如["set datestyle to ...", "set time zone ..."]
        ping=0,  # ping Mysql服务端,检查是否服务可用. 如: 0 = None = nerver, 1 = default = whenever it is requested, 2 = when a cursor is created 4 = when a query is executed, 7 = always
        host="127.0.0.1",
        port=3306,
        user="root",
        password="123456",
        database="test",
        charset="utf8"
    )
    
    
    def func():
        # 在连接池中连接
        conn = POOL.connection()
        # 油表使用辟谣mysql
        cursor = conn.cursor(pymysql.cursors.DictCursor)
        # 从表中查询数据
        cursor.execute('select * from xueren ')
        result = cursor.fetchall()
        print(result)
        conn.close()
    
    func()
    from DBUtils.PooledDB import PooledDB
    import pymysql
    
    class MySQLhelper(object):
        def __init__(self, host, port, dbuser, password, database):
            self.pool = PooledDB(
                creator=pymysql,  # 使用连接数据库的模块
                maxconnections=6,  # 连接池允许的最大连接数, 0和None表示不限制连接数
                mincached=2,  # 初始化时,连接池中至少创建的空闲的连接,0表示不创建
                maxcached=5,  # 连接池中最多闲置的连接, 0和None不限制
                maxshared=3,
                # 连接池中最多共享的连接数量, 0和None表示全部共享.ps:无用,因为pymysql和mysqldb等模块的threadsafety都为1, 所有值无论设置为多少,maxacahed永远为0,所以永远是共享所有连接都共享
                blocking=True,  # 连接池中如果没有可用连接,是否阻塞等待.True,等待,False,不等待然后报错
                maxusage=None,  # 一个连接最多被重复使用的次数, None表示无限制
                setsession=[],  # 开始会话前执行的命令列表. 如["set datestyle to ...", "set time zone ..."]
                ping=0,
                # ping Mysql服务端,检查是否服务可用. 如: 0 = None = nerver, 1 = default = whenever it is requested, 2 = when a cursor is created 4 = when a query is executed, 7 = always
                host="127.0.0.1",
                port=3306,
                user="root",
                password="123456",
                database="test",
                charset="utf8"
            )
    
        # 创建连接油表
        def create_conn_cursor(self):
            conn = self.pool.connection()
            cursor = conn.cursor(pymysql.cursors.DictCursor)
            return conn, cursor
    
        # 获取所有的数据(从数据库中)
        def fetch_all(self, sql, args):
            conn, cursor = self.create_conn_cursor()
            cursor.execute(sql, args)
            result = cursor.fetchall()
            cursor.close(
            )
    
        # 插入数据
        def insert_one(self, sql, args):
            conn, cursor = self.create_conn_cursor()
            res = cursor.execute(sql, args)
            conn.commit()
            print(res)
            conn.close()
            return res
    
        # 更新数据
        def update(self, sql, args):
            conn,cursor = self.create_conn_cursor()
            res = cursor.execute(sql, args)
            conn.commit()
            print(res)
            conn.close()
            return res
    
    sqlhelper = MySQLhelper("127.0.0.1", 3306, "root", "", "test")
    
    
    # 查询表里所有的数据
    res = sqlhelper.fetch_all("select * from xueren where id=%s", (1,))
    print(res)
    
    # 插入数据
    # res = sqlhelper.insert_one("insert into xueren VALUES (%s,%s %s)", (1, "miss", "really"))
    # print(res)
    # 更新数据
    # res = sqlhelper.update("update user SET name=%s WHERE id=%s", ("哈哈哈"))
  • 相关阅读:
    微服务简介
    docker跨主机通信扁平化网络的设计与实现
    docker学习ppt
    docker原理介绍
    我的博客搬家啦
    响应式之像素和viewport
    换行+省略号
    ITerms2在mac系统下的安装和配色,并和go2shell关联
    利其器之webstorm快捷键
    React入门 (2)—实现微博展示列表
  • 原文地址:https://www.cnblogs.com/ljc-0923/p/10265393.html
Copyright © 2011-2022 走看看