Flask - flask-script | 多app应用 | wtforms

时间:2021-06-18 18:18:35

flask-script

用于实现类似于django中 python3 manage.py runserver ...类似的命令

  • 安装

>: pip3 install flask-script
  • 使用

manage.py
from flask import Flask
# 1.导入Manager
from flask_script import Manager 
# 2. 实例化Flask生成对象app
app = Flask(__name__)
# 3.实例化Manager并将app传入生成对象manager
manager=Manager(app)

@app.route("/")
def index():
    return "ok"

if __name__ == __main__:
    # 4. 用manager.run()启动flask,即可实现类似django启动命令
    manager.run()

# flask 启动命令 python3 文件名.py runserver   这里的文件名是manage
  • 自定制命令

manage.py
from flask import Flask
from flask_script import Manager
app = Flask(__name__)
manager=Manager(app)

@app.route("/")
def index():
    return "ok"

# 1.装饰命令体函数
@manager.command
def custom1(arg,a):  # 2.命令体函数
    """
    使用自定义命令: python 文件名.py 函数名 参数1 参数2
    python manage.py custom 123  
    :param arg:
    :return:
    """
    print(arg,a)

@manager.option(-n, --name, dest=name)
@manager.option(-u, --url, dest=url)
def cmd(name, url):
    """
    自定义命令(-n也可以写成--name)
    执行: python manage.py  cmd -n haha -u http://www.baidu.com
    执行: python manage.py  cmd --name haha --url http://www.baidu.com
    :param name:
    :param url:
    :return:
    """
    print(name, url)


if __name__ == __main__:
    manager.run()

 

多app应用(了解)

from werkzeug.wsgi import DispatcherMiddleware
from werkzeug.serving import run_simple
from flask import Flask
app1 = Flask(app01)
app2 = Flask(app02)

@app1.route(/index)
def index():
    return "app01"

@app2.route(/index)
def index2():
    return "app2"
dm = DispatcherMiddleware(app1, {
    /sec12: app2,
})
if __name__ == "__main__":

    run_simple(localhost, 5000, dm)

 

wtforms

类似django的form组件

  • 安装

>: pip3 install wtforms
  • 使用1

from flask import Flask, render_template, request, redirect
from wtforms import Form
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgets

app = Flask(__name__, template_folder=templates)

app.debug = True


class LoginForm(Form):
    # 字段(内部包含正则表达式)
    name = simple.StringField(
        label=用户名,
        validators=[
            validators.DataRequired(message=用户名不能为空.),
            validators.Length(min=6, max=18, message=用户名长度必须大于%(min)d且小于%(max)d)
        ],
        widget=widgets.TextInput(), # 页面上显示的插件
        render_kw={class: form-control}

    )
    # 字段(内部包含正则表达式)
    pwd = simple.PasswordField(
        label=密码,
        validators=[
            validators.DataRequired(message=密码不能为空.),
            validators.Length(min=8, message=用户名长度必须大于%(min)d),
            validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*d)(?=.*[[email protected]$!%*?&])[A-Za-z[email protected]$!%*?&]{8,}",
                              message=密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符)

        ],
        widget=widgets.PasswordInput(),
        render_kw={class: form-control}
    )



@app.route(/login, methods=[GET, POST])
def login():
    if request.method == GET:
        form = LoginForm()
        return render_template(login.html, form=form)
    else:
        form = LoginForm(formdata=request.form)
        if form.validate():
            print(用户提交数据通过格式验证,提交的值为:, form.data)
        else:
            print(form.errors)
        return render_template(login.html, form=form)

if __name__ == __main__:
    app.run()
login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>登录</h1>
<form method="post">
    <p>{{form.name.label}} {{form.name}} {{form.name.errors[0] }}</p>

    <p>{{form.pwd.label}} {{form.pwd}} {{form.pwd.errors[0] }}</p>
    <input type="submit" value="提交">
</form>
</body>
</html>
  • 使用2:

from flask import Flask, render_template, request, redirect
from wtforms import Form
from wtforms.fields import core
from wtforms.fields import html5
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgets

app = Flask(__name__, template_folder=templates)
app.debug = True



class RegisterForm(Form):
    name = simple.StringField(
        label=用户名,
        validators=[
            validators.DataRequired()
        ],
        widget=widgets.TextInput(),
        render_kw={class: form-control},
        default=alex
    )

    pwd = simple.PasswordField(
        label=密码,
        validators=[
            validators.DataRequired(message=密码不能为空.)
        ],
        widget=widgets.PasswordInput(),
        render_kw={class: form-control}
    )

    pwd_confirm = simple.PasswordField(
        label=重复密码,
        validators=[
            validators.DataRequired(message=重复密码不能为空.),
            validators.EqualTo(pwd, message="两次密码输入不一致")
        ],
        widget=widgets.PasswordInput(),
        render_kw={class: form-control}
    )

    email = html5.EmailField(
        label=邮箱,
        validators=[
            validators.DataRequired(message=邮箱不能为空.),
            validators.Email(message=邮箱格式错误)
        ],
        widget=widgets.TextInput(input_type=email),
        render_kw={class: form-control}
    )

    gender = core.RadioField(
        label=性别,
        choices=(
            (1, ),
            (2, ),
        ),
        coerce=int # “1” “2”
     )
    city = core.SelectField(
        label=城市,
        choices=(
            (bj, 北京),
            (sh, 上海),
        )
    )

    hobby = core.SelectMultipleField(
        label=爱好,
        choices=(
            (1, 篮球),
            (2, 足球),
        ),
        coerce=int
    )

    favor = core.SelectMultipleField(
        label=喜好,
        choices=(
            (1, 篮球),
            (2, 足球),
        ),
        widget=widgets.ListWidget(prefix_label=False),
        option_widget=widgets.CheckboxInput(),
        coerce=int,
        default=[1, 2]
    )

    def __init__(self, *args, **kwargs):
        super(RegisterForm, self).__init__(*args, **kwargs)
        self.favor.choices = ((1, 篮球), (2, 足球), (3, 羽毛球))

    def validate_pwd_confirm(self, field):
        """
        自定义pwd_confirm字段规则,例:与pwd字段是否一致
        :param field:
        :return:
        """
        # 最开始初始化时,self.data中已经有所有的值

        if field.data != self.data[pwd]:
            # raise validators.ValidationError("密码不一致") # 继续后续验证
            raise validators.StopValidation("密码不一致")  # 不再继续后续验证


@app.route(/register, methods=[GET, POST])
def register():
    if request.method == GET:
        form = RegisterForm(data={gender: 2,hobby:[1,]}) # initial
        return render_template(register.html, form=form)
    else:
        form = RegisterForm(formdata=request.form)
        if form.validate():
            print(用户提交数据通过格式验证,提交的值为:, form.data)
        else:
            print(form.errors)
        return render_template(register.html, form=form)



if __name__ == __main__:
    app.run()
login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用户注册</h1>
<form method="post" novalidate style="padding:0  50px">
    {% for field in form %}
    <p>{{field.label}}: {{field}} {{field.errors[0] }}</p>
    {% endfor %}
    <input type="submit" value="提交">
</form>
</body>
</html>