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 "听说雪人很要走了,那些等有机会,等有时间,都觉的遥远了"
- def get(self):
- 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", ("哈哈哈"))
flask的CBV,flash,Flask-Session,及WTForms-MoudelForm的更多相关文章
- flask 之cbv ,flash闪现,Flask_Session,WTForms - MoudelForm
1.CBV : from flask import views class LoginView(views.MethodView): def get(self): return def ...
- python框架之Flask(2)-路由和视图&Session
路由和视图 这一波主要是通过看源码加深对 Flask 中路由和视图的了解,可以先回顾一下装饰器的知识:[装饰器函数与进阶] 路由设置的两种方式 # 示例代码 from flask import Fla ...
- flask之CBV模式
flask_cbv.py ''' flask中的CBV模式: (1)导入views模块: from flask import views (2)定义类,继承views.MethodView类: cla ...
- Flask中使用cookie和session
Flask中使用cookie和session 设置cookie from flask import Flask,Response app = Flask(__name__) @app.route('/ ...
- 初识Flask框架,以及Flask中的模板语言jinjia2和Flask内置的Session
一.web框架的对比 首先我们先来看下比较火的web框架 1.Django: 优点:大而全,所有组件都是组织内部开发高度定制化,教科书级别的框架 缺点:大到浪费资源,请求的时候需要的资源较高 2.Fl ...
- Flask(3)- flask中的CBV、werkzeug+上下文初步解读、偏函数和线程安全
一.flask中的CBV 对比django中的CBV,我们来看一下flask中的CBV怎么实现? from flask import Flask, render_template, url_for, ...
- python Flask框架CBV视图
1.演示之前需要先写一个装饰器 # 装饰器 def wrapper(func): def inner(*args, **kwargs): print('操作函数%s之前' % func.__name_ ...
- flask框架基本使用(3)(session与cookies)
#转载请留言联系 flask 框架基本使用(1):https://www.cnblogs.com/chichung/p/9756935.html flask 框架基本使用(2):https://www ...
- Flask框架(五) —— session源码分析
Flask框架(五) —— session源码分析 目录 session源码分析 1.请求来了,执行__call__方法 2.__call__方法 3.调用__call__方法 3.1.ctx = s ...
随机推荐
- 蓝牙bluez学习(1) Stack Architecture
Bluez支持的features Core Specification 4.2 (GAP, L2CAP, RFCOMM, SDP, GATT) Classic Bluetooth (BR/EDR) B ...
- 微信小程序request请求动态获取数据
微信小程序开发文档链接 1 后台代码: clickButton:function(){ var that = this; wx.request({ url: 'http://localhost:909 ...
- 使用github中py12306抢票系得
首先需要安装最新的python:安装步骤见:https://www.cnblogs.com/weven/p/7252917.html 其次下载python源码: 链接:https://pan.baid ...
- 转载:rest-framework框架的基本组件
知识预览 快速实例 序列化 视图三部曲 认证与权限组件 解析器 分页 回到顶部 快速实例 Quickstart 回到顶部 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们 ...
- 大数据学习——flume日志分类采集汇总
1. 案例场景 A.B两台日志服务机器实时生产日志主要类型为access.log.nginx.log.web.log 现在要求: 把A.B 机器中的access.log.nginx.log.web.l ...
- xtu summer individual 1 A - An interesting mobile game
An interesting mobile game Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on H ...
- python-001 第一个Python3.x程序 hello world
我们可以使用以下命令来查看我们使用的Python版本: (d:\ProgramData\Anaconda3) C:\Users\Administrator.2016-20160920ET>pyt ...
- NOIP2014D2T2寻找道路(Spfa)
洛谷传送门 这道题可以把边都反着存一遍,从终点开始深搜,然后把到不了的点 和它们所指向的点都去掉. 最后在剩余的点里跑一遍spfa就可以了. ——代码 #include <cstdio> ...
- 【构造+DFS】2017多校训练三 HDU 6060 RXD and dividing
acm.hdu.edu.cn/showproblem.php?pid=6060 [题意] 给定一棵以1为根的树,把这颗树除1以外的结点划分为k个集合(可以有空集),把1加入划分后的集合 每个集合的结点 ...
- javascript 保护变量不被随意修改------优雅的编程
/* * 1.如果在renderTitle,renderContent里面,这样总数据谁都能修改,不安全 * 改进 * 1.规定一个专门修改数据的方法,如果想修改数据只能走这个方法 * * actio ...