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", ("哈哈哈"))