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

waller      2022-02-12     683

关键词:

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)(?=.*[$@$!%*?&])[A-Za-zd$@$!%*?&]{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>

 

多线程 Delphi 7 App - 应用程序终止问题

】多线程Delphi7App-应用程序终止问题【英文标题】:MultithreadedDelphi7App-aproblemwithapptermination【发布时间】:2010-12-1720:25:58【问题描述】:我有一个TThread的后代和一个对象列表,每个对象都有自己的此类线程的副本,以及使用CreateE... 查看详情

app多版本共存,服务端如何兼容?

 做过APP产品的技术人员都知道,APP应用属于一种C/S架构的,所以在做多版本兼容,升级等处理则比较麻烦,不像web应用那么容易。下面将带大家分析几种常见的情况和应对方式: 小改动或者新加功能的 这种情况,数... 查看详情

thinkphpv6开启多应用模式(代码片段)

开启多应用模式(1)使用多应用模式,需要安装多应用模式扩展think-multi-app定位到WWW下的tp6ceshiban目录下,执行composerrequiretopthink/think-multi-app(2)在app目录下新建index(前台)和admin(后 查看详情

flask:flask-script;多app应用;wtforms;sqlchmy

一. flask-script一.flask-script简介1.什么是flask-script:是一个让你的命令行支持自定义命令的工具,它为Flask程序添加一个命令行解释器。可以让我们的程序从命令行直接执行相应的程序(用于实现类似于django中python3manage.pyrunserver...... 查看详情

react-多页面应用(代码片段)

1初始化项目npminitcreate-react-appmy-app2.修改indeximportReactfrom‘react‘;importReactDOMfrom‘react-dom‘;import‘./index.css‘;importAppfrom‘./App‘;ReactDOM.render(<App/>,document.getElementById(‘root‘));3.修改app.js文件importReactfrom‘react‘;import‘./App.css... 查看详情

uni-app186多进程实现(代码片段)

...config文件已经被读取并合并,但是还并未生效//这是应用层修改配置的最后时机//注意:此函数只支持同步调用asyncdidLoad()//所有的配置已经加载完毕//constapp=this.app;//constctx=awaitapp.createAnonymousContext();//app.messenger.send//... 查看详情

关于tp6项目搭建的坑(多应用模式)(代码片段)

TP6默认是单应用模式,开启多应用要分以下几个步骤1.安装多应用模式扩展think-multi-appcomposerrequiretopthink/think-multi-app2.删除原有的controller(PS:这个必须得删,tp6按这个判断是否为单应用模式!!!)3.新建应用目录(例:index/con... 查看详情

WAR - Gradle 多模块应用程序 - TypeNotPresentException

】WAR-Gradle多模块应用程序-TypeNotPresentException【英文标题】:WAR-Gradlemulti-moduleapp-TypeNotPresentException【发布时间】:2020-07-1010:49:24【问题描述】:我有一个类似Gradle模块结构的应用程序:app-applieswarcommon/utilitiescommon/auth等app模块应... 查看详情

如何在 Google App Engine 中计算多对多关系的双方

...9:03【问题描述】:考虑一个允许用户评论歌曲的GAE(python)应用程序。预期用户数为1,000,000+。预计歌曲数量为5,000。应用必须能够:给出用户评论过的歌曲数量给出评论过歌曲的用户数 查看详情

用uniapp开发打包多端应用完整指南(代码片段)

一、uni-app项目介绍用uni-app开发多端项目,一套代码可同时打包出各端小程序、h5和app,uni-app支持通过HBuilderX可视化界面和vue-cli命令行两种方式创建项目,下面示例项目采用HBuilderX可视化界面的方式创建,cli项目... 查看详情

用uniapp开发打包多端应用完整指南(代码片段)

一、uni-app项目介绍用uni-app开发多端项目,一套代码可同时打包出各端小程序、h5和app,uni-app支持通过HBuilderX可视化界面和vue-cli命令行两种方式创建项目,下面示例项目采用HBuilderX可视化界面的方式创建,cli项目... 查看详情

django所有应用放到一个apps目录配置和应用之外独立使用model

多应用统一目录管理在实际Django项目开发中,创建工程之后比如demoproj,在工程目录下会存在一个同名的文件夹作为项目的入口(比如,公共配置、URL规则等)和一个manage.py管理文件。默认创建应用的时候,会在manage.py同级目录... 查看详情

在 iPad App 中实现多用户聊天

...发布时间】:2015-06-1717:04:05【问题描述】:我有一个iPad应用程序。我打算给它添加一个群聊功能。这意味着1)用户可以创建或加入群组2)可以向其他登录该应用的用户发送文本或音频片段。我正在寻找有关如何实现这一点的指针... 查看详情

穿衣搭配app应用软件开发

衣食住行,人人都离不开,随着互联网的发展,越来越多的人注重自己的外在打扮,注重自己外在表现中的教养和品位,地位及生活的情调表现,也因此,越来越多的人选择网络购物,而便捷的选择穿衣搭配则是很多人非常注重... 查看详情

位于多租户环境中的逻辑应用程序的超时期限?

】位于多租户环境中的逻辑应用程序的超时期限?【英文标题】:Timeoutperiodforalogicappsittinginmulti-tenantenvironment?【发布时间】:2021-04-1405:56:50【问题描述】:多租户环境中逻辑应用的总超时时间是多少?当我从链接https://docs.microso... 查看详情

mobtech秒验应用介绍

...比如下图二、秒验解决登录注册难题手机号码一键登录可应用于一切注册和登录场景,为用户提供真正意义上的一键免密注册/登录,整个过程只需1.5秒,大幅提高用 查看详情

tp6多应用多入口

参考技术A我们公司有些应用都是分前后台的,前端都是用户访问,后端都是产品经理或管理人员在使用。但现在有前后端分离的技术,可以考虑,这个应用我们只要后端,前端就是静态页面,可以考虑是使用vue。composerrequiretopth... 查看详情

elk高级配置之多应用索引过滤

...常是多个网站或者服务端在一台服务器上,但是如果这些应用全部记录到一台logstash服务器,大家日志都混在一起不好区分。有人说,我可以在日志中打项目名,但是这样并不方便。其实,我们可以在索引上做文章。配置如下:i... 查看详情