Python Flask框架使用介绍

目录
  • 1. 数据库连接池
  • 2. wtfroms
  • 3. 信号
    • 3.1 内置信号
    • 3.2 使用信号
    • 3.3 自定义信号
  • 4. 多app应用
  • 5. flask-script
    • 5.1 快速使用
    • 5.2 自定制命令

1. 数据库连接池

使用 pymsql 链接数据库

导入:pip3 install dbutils

pool.py 创建数据库连接池

from dbutils.pooled_db import PooledDB
import pymysql
POOL = PooledDB(
    creator=pymysql,  	# 使用链接数据库的模块
    maxconnections=6,  	# 连接池允许的最大连接数,0和None表示不限制连接数
    mincached=2,  		# 初始化时,链接池中至少创建的空闲的链接,0表示不创建
    maxcached=5,  		# 链接池中最多闲置的链接,0和None不限制
    maxshared=3,		# 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用,因为pymysql和MySQLdb等模块的threadsafety都为1,所有值无论设置为多少,_maxcached永远为0,所以永远是所有链接都共享。
    blocking=True,  	# 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
    maxusage=None,  	# 一个链接最多被重复使用的次数,None表示无限制
    setsession=[],  	# 开始会话前执行的命令列表。
    ping=0,				# ping MySQL服务端,检查是否服务可用。
    host='127.0.0.1',
    port=3306,
    user='???',
    password='???',
    database='???',
    charset='utf8'
)

使用连接池

from flask import Flask
# 导入类对象
from pool import POOL
import pymysql
app = Flask(__name__)
app.debug = True
# 定义在外面,全局conn,cursor会出现数据错乱,正常情况应该放在视图函数内部建立链接,但是会影响
# 性能,所以需要建立数据库连接池,限制连接的数量
# conn = pymysql.connect(
# 	host='127.0.0.1',
# 	port=3306,
# 	database='数据库',
# 	user='用户',
# 	password='密码'
# )
# cursor = conn.cursor()
@app.route('/user')
def user():
    # 从池中拿链接,创建出cursor对象
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute('select * from index_user')
    print(cursor.fetchall())
    # 并未关闭连接,只是将连接重新放回池子
    conn.close()
    return 'hello'
@app.route('/username')
def username():
	# 该方式对数据库的连接会一直增加,有可能造成数据压力过大
    conn = pymysql.connect(
    	host='127.0.0.1',
    	port=3306,
    	database='???',
    	user='???',
    	password='???')
    cursor = conn.cursor()
    cursor.execute('select username from index_user')
    print(cursor.fetchall())
    return 'hello'
if __name__ == '__main__':
    app.run()

2. wtfroms

其类似于 django 的 forms 组件,不过在 flask 中使用第三方 wtfroms 完成 forms 的功能。

安装:pip3 install wtforms

from flask import Flask,request,render_template
app = Flask(__name__)
from wtforms.fields import core
from wtforms import Form
from wtforms.fields import html5
from wtforms.fields import simple
from wtforms import validators
from wtforms import widgets
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-z\d$@$!%*?&]{8,}",
                              message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符')
        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control'}
    )
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('/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)
@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">
    <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>

register.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>

3. 信号

Flask 信号,是由 signal 翻译过来的。

Flask框架中的信号基于 blinker,其主要就是让开发者可是在 Flask 请求过程中定制一些用户行为。

在某种情况下会触发某个函数执行( aop理念,面向切面编程的理念 ),例如在用户注册后统计用户的数量

安装:pip3 install blinker

3.1 内置信号

# 请求到来前执行
request_started = _signals.signal('request-started')

# 请求结束后执行           
request_finished = _signals.signal('request-finished')

# 模板渲染前执行 
before_render_template = _signals.signal('before-render-template')

# 模板渲染后执行
template_rendered = _signals.signal('template-rendered')

# 请求执行出现异常时执行
got_request_exception = _signals.signal('got-request-exception')

# 请求执行完毕后自动执行(无论成功与否) 
request_tearing_down = _signals.signal('request-tearing-down')

# 应用上下文执行完毕后自动执行(无论成功与否)      
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')

# 应用上下文push时执行 
appcontext_pushed = _signals.signal('appcontext-pushed')

# 应用上下文pop时执行            
appcontext_popped = _signals.signal('appcontext-popped')

# 调用flask在其中添加数据时,自动触发        
message_flashed = _signals.signal('message-flashed')

3.2 使用信号

from flask import Flask, render_template
from flask import signals
app = Flask(__name__)
app.debug = True
# 第一步:编写需要执行的函数
def render_before(*args, **kwargs):
    print(args)
    print(kwargs)
    print('模板渲染前执行')
# 第二步:绑定信号
signals.before_render_template.connect(render_before)	# 模板渲染前执行
# 第三步:自动触发信号
@app.route('/home')
def home():
    return render_template('home.html')
if __name__ == '__main__':
    app.run()

3.3 自定义信号

from flask import Flask
from flask.signals import _signals
app = Flask(import_name=__name__)
# 第一步:自定义信号
x = _signals.signal('x')
# 第二步:编写函数
def func(sender, *args, **kwargs):
    print(sender)
    print(args)
    print(kwargs)
# 第三步:自定义信号中注册函数
x.connect(func)
@app.route("/index")
def index():
    # 第四步:触发信号
    x.send('123123', k1='v1')
    return 'Index'
if __name__ == '__main__':
    app.run()

4. 多app应用

在一个 flask 项目,可以支持多个 app 对象。

from flask import Flask
from werkzeug.middleware.dispatcher import DispatcherMiddleware
from werkzeug.serving import run_simple
# 创建多个 app
app1 = Flask('app01')
app2 = Flask('app02')
# 第一个 app 的根路径
@app1.route('/')
def home():
    return "app1"
# 第二个 app 的根路径
@app2.route('/')
def sec():
    return "app2"
# 访问 /sec 才是访问第二个 app 的根路径
dm = DispatcherMiddleware(app1, {
    '/sec': app2,
})
if __name__ == "__main__":
    # 请求来了,会执行 dm(),触发DispatcherMiddleware的__call__
    run_simple('localhost', 5000, dm)

5. flask-script

原本启动项目右键运行即可,若要以命令的方式,类似于 django 的 python3 manage.py runserver 命令可以使用 flask-script 实现。

安装:pip3 install flask-script

5.1 快速使用

from flask_script import Manager
app = Flask(__name__)
manager=Manager(app)
if __name__ == '__main__':
    manager.run()
# 以后在执行,直接:python3 manage.py runserver
# python3 manage.py runserver --help

有可能会出现如下错误,由于 flask 的版本太高只需要将 flask 的版本降低即可

Traceback (most recent call last):
  File "manage.py", line 3, in <module>
    from flask_script import Manager
  File "D:\python36\lib\site-packages\flask_script\__init__.py", line 15, in <module>
    from flask._compat import text_type
ModuleNotFoundError: No module named 'flask._compat'

5.2 自定制命令

可以编一个功能,通过execl,把execl的数据存同步到某个数据表中得命令

from flask import Flask
from flask_script import Manager
app = Flask('__name__')
# 基本使用,多了runserver命令
manager = Manager(app)
@manager.command
def dbinit():
    """
    python manage.py dbinit
    """
    print("数据库初始化完成")
@manager.option('-n', '--name', dest='name')
@manager.option('-a', '--age', dest='age')
def user(name, age):
    """
    自定义命令(-n也可以写成--name)
    执行: python manage.py  user -n xwx -a 12
    执行: python manage.py  user --name xwx --age 12
    """
    print(name, age)
@app.route('/index')
def index():
    return "index"
if __name__ == "__main__":
    manager.run()

到此这篇关于Python Flask框架使用介绍的文章就介绍到这了,更多相关Python Flask 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Python Flask框架的安装及应用

    目录 1.安装 1.1 创建虚拟环境 1.2 进入虚拟环境 1.3 安装 flask 2.上手 2.1 最小 Demo 2.2 基本知识 3.解构官网指导 Demo 3.1 克隆与代码架构分析 3.2 入口文件 init.py 3.3 数据库设置 3.4 蓝图和视图 4.其他 5.跑起 DEMO 1.安装 1.1 创建虚拟环境 mkdir myproject cd myproject python3 -m venv venv 1.2 进入虚拟环境 . venv/bin/activate 1.3

  • python中的flask框架Jinja 模板入门教程

    目录 1.快速体验 2.Flask 最小 DEMO 3.模板继承 4.Super Blocks 5.Macros 6.自定义过滤器 7.结论 Flask 和 Django 附带了强大的 Jinja 模板语言. 对于之前没有接触过模板语言的人来说,这类语言基本上就是包含一些变量,当准备渲染呈现 HTML 时,它们会被实际的值替换. 这些变量放在标记或分隔符之前.例如:Jinja 模板使用 {% ... %} 表示循环,{{ ... }} 表示一个表达式运算结果返回. Jinja 模板其实是 htm

  • python Flask框架之HTTP请求详解

    我们的浏览器访问网站时,默认为发送了一个HTTP的GET请求. 在浏览网站时,会经常填写表单,比如填写用户名密码.点击登录后,会跳转到我们的主页. 接下来,我们实现这个案例. 首先我们先写一个登录页面 <!doctype html> <html lang="en"> <head> <title>Hello from Flask</title> </head> <body> <form action

  • 深入了解Python Flask框架之蓝图

    目录 随着Flask项目越来越复杂,把所有视图函数放在一个应用文件中会很不方便我们管理,所以需要对程序进行模块化的处理.Flask内置了一个模块化处理的类--Blueprint蓝图. Blueprint 是一种组织一组相关视图及其他代码的方式.与把视图及其他代码直接注册到应用的方式不同,蓝图方式是把它们注册到蓝图,然后在工厂函数中把蓝图注册到应用. 简单来说就把app应用分为很多个小模块,把这些小模块放在一个包里,这个包叫做蓝图,如下图所示: 项目目录如下图所示: 这里创建了一个名为apps的包

  • 使用python flask框架开发图片上传接口的案例详解

    python版本:3.6+ 需要模块:flask,pillow 需求:开发一个支持多格式图片上传的接口,并且将图片压缩,支持在线预览图片. 目录结构: app.py编辑内容: from flask import Flask, request, Response, render_template from werkzeug.utils import secure_filename import os import uuid from PIL import Image, ExifTags app =

  • 浅谈Python flask框架

    目录 1. flask 框架概述 1.1flask 框架优势 1.2flask 框架获取 1.3flask 框架使用 2. flask demo步骤 3. flask 基础功能 3.1路由功能 3.2模版提供 4.总结  前言: Python 面向对象的高级编程语言,以其语法简单.免费开源.免编译扩展性高,同时也可以嵌入到C/C++程序和丰富的第三方库,Python运用到大数据分析.人工智能.web后端等应用场景上. Python 目前主要流行的web框架:flask.Django.Tornad

  • python编程Flask框架简单使用教程

    目录 基础知识 使用框架的优点: Flask常用扩展包: 基本格式: 拓展: return 重定向 取网址参数 content-type cookie\session flask路由 request属性 上下文 注册路由 基础知识 使用框架的优点: 稳定性和可扩展性强 可以降低开发难度,提高了开发效率 Flask诞生于2010年,是Armin ronacher用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架 Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件

  • Python中的flask框架详解

    Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档,大部分代码引用自官方文档. 安装flask 首先我们来安装Flask.最简单的办法就是使用pip. pip install flask 然后打开一个Python文件,输入下面的内容并运行该文件.然后访问localhost:5000,我们应当可以看到浏览器上输出了hello world. from flask import Flask app = Flask(

  • python flask框架详解

    Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档, 英文不好的同学也可以参考中文文档 1.安装flask pip install flask 2.简单上手 一个最小的 Flask 应用如下: from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World' if __na

  • Python Flask框架使用介绍

    目录 1. 数据库连接池 2. wtfroms 3. 信号 3.1 内置信号 3.2 使用信号 3.3 自定义信号 4. 多app应用 5. flask-script 5.1 快速使用 5.2 自定制命令 1. 数据库连接池 使用 pymsql 链接数据库 导入:pip3 install dbutils pool.py 创建数据库连接池 from dbutils.pooled_db import PooledDB import pymysql POOL = PooledDB( creator=p

  • Python flask框架定时任务apscheduler应用介绍

    目录 基本使用 trigger启动方式 cron启动方式 使用装饰器定时启动任务 flask-apscheduler将apscheduler移植到了flask应用中,使得在flask中可以非常方便的使用定时任务了,除此之外,它还有如下几个特性 根据Flask配置加载调度器配置 根据Flask配置加载任务调度器 允许指定服务器运行任务 提供RESTful API管理任务,也就是远程管理任务 为RESTful API提供认证 下载安装 pip install flask-apscheduler 基本

  • Python Flask框架开发之运用SocketIO实现WebSSH方法详解

    Flask 框架中如果想要实现WebSocket功能有许多种方式,运用SocketIO库来实现无疑是最简单的一种方式,Flask中封装了一个flask_socketio库该库可以直接通过pip仓库安装,如下内容将重点简述SocketIO库在Flask框架中是如何被应用的,最终实现WebSSH命令行终端功能,其可用于在Web浏览器内实现SSH命令行执行. 首先我们先来看一下SocketIO库是如何进行通信的,对于前端部分需要引入socket.io这个框架,然后就是利用该框架内提供的各类函数实现创建

  • Python Flask框架实现Proteus仿真Arduino与网页数据交互

    目录 实验原理 开发环境 Flask虚拟环境 Python Flask源码 用Proteus仿真Arduino 用com0com建立虚拟串口对 运行程序 实验原理 模拟电脑通过串口与Arduino开发板通信,并通过网页实现简单交互 开发环境 1.Windows10 2.Python3.10 3.Proteus8.6 4.com0com虚拟串口工具 Flask虚拟环境 先安装virtualenv: pip install virtualenv 建立项目文件夹(比如demo_4) 在demo_04文

  • Python Flask框架模板操作实例分析

    本文实例讲述了Python Flask框架模板操作.分享给大家供大家参考,具体如下: 模板 在前面的示例中,视图函数的主要作用是生成请求的响应,这是最简单的请求.实际上,视图函数有两个作用:处理业务逻辑和返回响应内容.在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本.本节学到的模板,它的作用即是承担视图函数的另一个作用,即返回响应内容. 模板其实是一个包含响应文本的文件,其中用占位符(变量)表示动态部分,告诉模板引擎其具体值需要从使用的数据中获取.使用真实值替换变量,再返

随机推荐