1.9flask sqlalchemy和wtforms
2019-1-9 15:28:07
还有2天视频flask结束,然后到爬虫了
发现好快 学的东西好多!
到时候来个综合整理!!!!
越努力,越幸运!!!
sqlalchemy 参考连接: https://www.cnblogs.com/wupeiqi/articles/8259356.html
MySQL练习题参考连接: https://www.cnblogs.com/wupeiqi/articles/5729934.html
永远不要高估自己!!
外面下雪了!!整理完今天博客,看会书,晚上看122天视频!
sqlalchemy实例:
models.py
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy import Integer,String,Text,Date,DateTime
from sqlalchemy import create_engine Base = declarative_base()
# 直接运行就好啦,Django得 python manage makemigrations 和 makemigrate
class Users(Base):
__tablename__ = 'users' id = Column(Integer, primary_key=True)
name = Column(String(32), index=True, nullable=False)
depart_id = Column(Integer) def create_all():
engine = create_engine(
"mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
) Base.metadata.create_all(engine) def drop_all():
engine = create_engine(
"mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
)
Base.metadata.drop_all(engine) if __name__ == '__main__':
drop_all()
create_all()
demo.py
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import Users engine = create_engine(
"mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
)
SessionFactory = sessionmaker(bind=engine) # 根据Users类对users表进行增删改查
session = SessionFactory() # ############################## 基本增删改查 ###############################
# 1. 增加
# obj = Users(name='alex')
# session.add(obj)
# session.commit() # session.add_all([
# Users(name='小东北'),
# Users(name='龙泰')
# ])
# session.commit() # 2. 查
# result = session.query(Users).all()
# for row in result:
# print(row.id,row.name) # result = session.query(Users).filter(Users.id >= 2)
# for row in result:
# print(row.id,row.name) # result = session.query(Users).filter(Users.id >= 2).first()
# print(result) # 3.删
# session.query(Users).filter(Users.id >= 2).delete()
# session.commit() # 4.改
# session.query(Users).filter(Users.id == 4).update({Users.name:'东北'})
# session.query(Users).filter(Users.id == 4).update({'name':'小东北'})
# session.query(Users).filter(Users.id == 4).update({'name':Users.name+"DSB"},synchronize_session=False)
# session.commit() # ############################## 其他常用 ###############################
# 1. 指定列
# select id,name as cname from users;
# result = session.query(Users.id,Users.name.label('cname')).all()
# for item in result:
# print(item[0],item.id,item.cname)
# 2. 默认条件and
# session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
# 3. between
# session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
# 4. in
# session.query(Users).filter(Users.id.in_([1,3,4])).all()
# session.query(Users).filter(~Users.id.in_([1,3,4])).all()
# 5. 子查询
# session.query(Users).filter(Users.id.in_(session.query(Users.id).filter(Users.name=='eric'))).all()
# 6. and 和 or
# from sqlalchemy import and_, or_
# session.query(Users).filter(Users.id > 3, Users.name == 'eric').all()
# session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
# session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
# session.query(Users).filter(
# or_(
# Users.id < 2,
# and_(Users.name == 'eric', Users.id > 3),
# Users.extra != ""
# )).all() # 7. filter_by
# session.query(Users).filter_by(name='alex').all() # 8. 通配符
# ret = session.query(Users).filter(Users.name.like('e%')).all()
# ret = session.query(Users).filter(~Users.name.like('e%')).all() # 9. 切片
# result = session.query(Users)[1:2] # 10.排序
# ret = session.query(Users).order_by(Users.name.desc()).all()
# ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all() # 11. group by group_by最后的聚合count 必须用having
from sqlalchemy.sql import func # ret = session.query(
# Users.depart_id,
# func.count(Users.id),
# ).group_by(Users.depart_id).all()
# for item in ret:
# print(item)
#
# from sqlalchemy.sql import func
#
# ret = session.query(
# Users.depart_id,
# func.count(Users.id),
# ).group_by(Users.depart_id).having(func.count(Users.id) >= 2).all()
# for item in ret:
# print(item) # 12.union 和 union all
"""
select id,name from users
UNION
select id,name from users;
"""
# q1 = session.query(Users.name).filter(Users.id > 2)
# q2 = session.query(Favor.caption).filter(Favor.nid < 2)
# ret = q1.union(q2).all()
#
# q1 = session.query(Users.name).filter(Users.id > 2)
# q2 = session.query(Favor.caption).filter(Favor.nid < 2)
# ret = q1.union_all(q2).all() session.close()
metaclass.py
# 1. 类创建的两种方式 # class Foo(object):
# a1 = 123
# def func(self):
# return 666 # Foo = type("Foo",(object,),{'a1':123,'func':lambda self:666}) # 2. 自定义type # class MyType(type):
# pass
#
# class Foo(object,metaclass=MyType):
# a1 = 123
# def func(self):
# return 666
#
# Foo = MyType("Foo",(object,),{'a1':123,'func':lambda self:666}) # 注意:metaclass作用是指定当前类由谁来创建。 # 3. metaclass
class MyType(type):
def __init__(self,*args,**kwargs):
super(MyType,self).__init__(*args,**kwargs) def __call__(cls, *args, **kwargs):
obj = cls.__new__(cls) cls.__init__(obj,*args, **kwargs) return obj class Foo(object,metaclass=MyType):
a1 = 123
def __init__(self):
pass def __new__(cls, *args, **kwargs):
return object.__new__(cls) def func(self):
return 666 # Foo是类
# Foo是MyType的一个对象 obj = Foo()
wtforms的实现.py new方法是决定了对象名字, init是构造了一个对象
from flask import Flask,request,render_template,session,current_app,g,redirect
from wtforms import Form
from wtforms.fields import simple
from wtforms.fields import html5
from wtforms.fields import core from wtforms import widgets
from wtforms import validators app = Flask(__name__) # FormMeta(type):
"""
LoginForm._unbound_fields = None
LoginForm._wtforms_meta = None
"""
class LoginForm(Form):
name = simple.StringField(
validators=[
validators.DataRequired(message='用户名不能为空.'),
# validators.Length(min=6, max=18, message='用户名长度必须大于%(min)d且小于%(max)d')
],
widget=widgets.TextInput(),
render_kw={'placeholder':'请输入用户名'}
)
pwd = simple.PasswordField(
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个特殊字符') ],
render_kw={'placeholder':'请输入密码'}
)
x = 123
"""
LoginForm._unbound_fields = None
LoginForm._wtforms_meta = None
LoginForm.name = UnboundField(creation_counter=1,simple.StringField)
LoginForm.pwd = UnboundField(creation_counter=2,simple.PasswordField)
LoginForm.__str__ = asdf
LoginForm.__str__ = asdf
LoginForm.__str__ = asdf
LoginForm.__str__ = asdf
""" @app.route('/login',methods=['GET','POST'])
def login():
if request.method == "GET":
form = LoginForm()
"""
执行formmeta的__call__
LoginForm._unbound_fields = [
('name',UnboundField(creation_counter=1, simple.StringField),),
('pwd',UnboundField(creation_counter=2,simple.PasswordField,),
]
LoginForm.__new__ """
# print(form.name,type(form.name)) # form.name是StringField()对象, StringField().__str__
# print(form.pwd,type(form.pwd)) # form.pwd是PasswordField()对象,PasswordField().__str__
return render_template('login.html',form=form) form = LoginForm(formdata=request.form)
if form.validate():
print(form.data)
return redirect('https://www.luffycity.com/home')
else:
# print(form.errors)
return render_template('login.html', form=form) if __name__ == '__main__':
app.run()
面向对象中的new.py
class Bar(object):
pass class Foo(object): def __new__(cls, *args, **kwargs):
# return super(Foo,cls).__new__(cls,*args, **kwargs)
return Bar()
obj = Foo()
print(obj) # class Bar(object):
# def __init__(self,cls):
# self.cls = cls
#
# class Foo(object):
#
# def __new__(cls, *args, **kwargs):
# # return super(Foo,cls).__new__(cls,*args, **kwargs)
# return Bar(cls)
# obj = Foo()
# print(obj)
贴上笔记!!
s9day120 内容回顾:
记得两句话:
1. 创建类时先执行type的init方法
2. 当一个类实例化时,先执行type的call方法 第一部分:Flask
1. flask和django比较? 2. wsgi? 3. flask上下文理解?
两类:
请求上下文管理
应用上下文管理
流程:
请求到来:
将请求和session相关封装到ctx = RequestContext对象中。
将app和g封装到app_ctx = AppContext对象中。
再通过LocalStack对象将ctx、app_ctx封装到Local对象中。 问题:
Local是什么?作用?
LocalStack是什么?作用?
获取数据
通过LocalProxy对象+偏函数,调用LocalStack去Local中获取响应ctx、app_ctx中封装的值。 问题:
为什么要把 ctx=request/session app_ctx = app/g ?
答:因为离线脚本需要使用app_ctx。
请求结束:
调用LocalStack的pop方法,将ctx和app_ctx移除。 4. threading.local 5. 偏函数 6. 单例模式 7. 问题:
before_request的执行时机(源码实现) 第一部分:MySQL
1. 数据库引擎 2. 数据库授权 3. 表结构设计:代码统计(教育机构,班级表结构设计) 4. SQL语句
https://www.cnblogs.com/wupeiqi/articles/5729934.html 5. 了解:https://www.cnblogs.com/wupeiqi/articles/5713323.html
- 视图
- 存储过程
- 触发器
- 函数
select max(id) from tb group by xid; 6. 索引
索引作用:加速查找+约束。
索引种类:
- 主键索引:加速查找、不重复、非空
- 唯一索引:加速查找、不重复
- 普通索引:加速查找
- 联合索引:加速查找
- 联合唯一索引:加速查找、不重复
PS:联合索引遵循最左前缀原则。 id name pwd email select * from tb where name='x'
select * from tb where name='x' and pwd=''
select * from tb where name='x' and pwd='' and email='xs' 名词:
- 覆盖索引:在索引文件中就可以把想要的数据得到。
select name from tb1;
- 索引合并:使用多个单列索引去查找数据。 今日内容:
1. wtforms 2. SQLAlchemy 3. flask-sqlalchemy 内容详细:
1. wtforms
作用:生成HTML标签+用户请求数据进行校验。
使用:
- 用户登录示例
- 用户注册示例
- 数据库获取数据实时更新(重写构造方法) 测试:django的form(重写构造方法) 问题:
- form对象为什么可以被for循环?
答:变为可迭代对象。
class Foo(object): # def __iter__(self):
# return iter([11,22,33]) def __iter__(self):
yield 1
yield 2
yield 3 obj = Foo() for item in obj:
print(item)
- new方法的返回值决定对象到底是什么?
class Bar(object):
pass class Foo(object): def __new__(cls, *args, **kwargs):
# return super(Foo,cls).__new__(cls,*args, **kwargs)
return Bar()
obj = Foo()
print(obj) 记得两句话:
- metaclass
- 创建类时,先执行type的__init__。
- 类的实例化时,执行type的__call__,__call__方法的的返回值就是实例化的对象。
__call__内部调用:
- 类.__new__,创建对象
- 类.__init__,对象的初始化 class MyType(type):
def __init__(self,*args,**kwargs):
super(MyType,self).__init__(*args,**kwargs) def __call__(cls, *args, **kwargs):
obj = cls.__new__(cls) cls.__init__(obj,*args, **kwargs) return obj class Foo(object,metaclass=MyType):
a1 = 123
def __init__(self):
pass def __new__(cls, *args, **kwargs):
return object.__new__(cls) def func(self):
return 666 # Foo是类
# Foo是MyType的一个对象 obj = Foo() - 源码:
- 类的创建
type.__init__
- 对象的创建
type.__call__
- 类.__new__
- 类.__init__ 2. SQLAlchemy
SQLAlchemy,ORM框架。
作用:帮助我们使用类和对象快速实现数据库操作。 数据库:
- 原生:
- MySQLdb:py2
- pymysql:py2/py3
http://www.cnblogs.com/wupeiqi/articles/5095821.html - ORM框架
- SQLAlchemy SQLAlchemy使用:
参考:https://www.cnblogs.com/wupeiqi/articles/8259356.html 1. 单表操作
表:
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column
from sqlalchemy import Integer,String,Text,Date,DateTime
from sqlalchemy import create_engine Base = declarative_base() class Users(Base):
__tablename__ = 'users' id = Column(Integer, primary_key=True)
name = Column(String(32), index=True, nullable=False) def create_all():
engine = create_engine(
"mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
) Base.metadata.create_all(engine) def drop_all():
engine = create_engine(
"mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
)
Base.metadata.drop_all(engine) if __name__ == '__main__':
create_all() 行:
示例:
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import Users engine = create_engine(
"mysql+pymysql://root:123456@127.0.0.1:3306/s9day120?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
)
SessionFactory = sessionmaker(bind=engine) # 根据Users类对users表进行增删改查
session = SessionFactory() # 1. 增加
# obj = Users(name='alex')
# session.add(obj)
# session.commit() # session.add_all([
# Users(name='小东北'),
# Users(name='龙泰')
# ])
# session.commit() # 2. 查
# result = session.query(Users).all()
# for row in result:
# print(row.id,row.name) # result = session.query(Users).filter(Users.id >= 2)
# for row in result:
# print(row.id,row.name) # result = session.query(Users).filter(Users.id >= 2).first()
# print(result) # 3.删
# session.query(Users).filter(Users.id >= 2).delete()
# session.commit() # 4.改
# session.query(Users).filter(Users.id == 4).update({Users.name:'东北'})
# session.query(Users).filter(Users.id == 4).update({'name':'小东北'})
# session.query(Users).filter(Users.id == 4).update({'name':Users.name+"DSB"},synchronize_session=False)
# session.commit() session.close() 基本增删改查:
# 添加
session.add(对象)
session.add_all([
对象1,
对象2
])
session.commit() # 查询
session.query(Users).all()
session.query(Users).filter(Users.id>4) # 删除
session.query(Users).filter(Users.id>4).delete() # 修改
session.query(Users).filter(Users.id>4).update({Users.age:19}) 常用操作:
见代码示例
1.9flask sqlalchemy和wtforms的更多相关文章
- Flask-Session SQLAlchemy Script Migrate wtforms
Flask-session Flask-session跟框架自带的session有什么区别呢~ 框架自带的session是通过请求上下文~放入到Local中的~那如果我们想把session放入别的地方 ...
- flask-admin章节二:wtforms的使用以及在数据库场景中使用QuerySelectField代替SelectField
概述 flask admin可以支持自定义视图,对于涉及到比较复杂的视图可以选择继承flask_admin.BaseView来定义自己期待的结构. 自定义的视图的每个函数可以使用flask_admin ...
- flask连接sqlalchemy数据库,实现简单的登录跳转功能
环境:python2.7 python库:flask,flask_wtf,wtforms,sqlalchemy 原理:运行app-连接数据库-打开登录页面-输入登录信息(错误->提示错误信息:正 ...
- 9、flask之SQLAlchemy
本篇导航: 介绍 使用 SQLAlchemy-Utils 一. 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之 ...
- flask之SQLAlchemy
本篇导航: 介绍 使用 SQLAlchemy-Utils 一. 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之 ...
- SQLAlchemy Script
SQLAlchemy: 1.由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 from sqlalchemy_utils impo ...
- Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号
Flask框架 (四)—— 请求上下文源码分析.g对象.第三方插件(flask_session.flask_script.wtforms).信号 目录 请求上下文源码分析.g对象.第三方插件(flas ...
- sqlalchemy学习
sqlalchemy官网API参考 原文作为一个Pythoner,不会SQLAlchemy都不好意思跟同行打招呼! #作者:笑虎 #链接:https://zhuanlan.zhihu.com/p/23 ...
- tornado+sqlalchemy+celery,数据库连接消耗在哪里
随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知. 最近老是发现数据库的连接数如果 ...
随机推荐
- H5传奇世界服务器架设技术及源码
以前是传奇迷,虽然现在不玩,但当作兴趣,研究了一下H5传奇世界的架设,架设成功并分享给大家.注意,此技术只可用于个人娱乐,不可用于商业用途. 首先下载 传奇世界H5源码 450M的样子. H5传奇 ...
- C# Xamarin移动开发基础进修篇
一.课程介绍 英文原文:C# is the best language for mobile app development. Anything you can do in Objective-C, ...
- nginx -- 单独访问某个页面404
- MySQL监控全部执行过的sql语句
MySQL监控全部执行过的sql语句 查看是否开启日志记录show variables like “general_log%” ; +——————+———-+|Variable_name|Value| ...
- 【Tomcat】Tomcat报错追踪
应用部署上之后无法正常启动.tomcat启动日志例如以下: 信息: Starting service Catalina 2015-7-22 18:39:31 org.apache.catalina.c ...
- 时间mysql
查询一天/今天: select * from table where to_days(column_time) = to_days(now()) select * from table where d ...
- mysql官方驱动jar
问题描述: 在mysql5.7版本,发现登录不了,找不到原因.有人说是驱动的问题,下载最新的驱动,问题得到解决! 问题解决: 下载最新mysql-jar驱动,传统版本最新mysql-jar驱动版本5. ...
- 【C++】C++中的数组
目录结构: contents structure [-] 一维数组 数组的定义和初始化 数组元素的访问 数组和指针 多维数组 数组是存放相同类型的容器,数组的大小确定不变,不能随意向数组中添加元素.因 ...
- linux内核剖析(八)进程间通信之-管道
管道 管道是一种两个进程间进行单向通信的机制. 因为管道传递数据的单向性,管道又称为半双工管道. 管道的这一特点决定了器使用的局限性.管道是Linux支持的最初Unix IPC形式之一,具有以下特点: ...
- 使用phpstorm进行PHP断点调试
PHP开发中都说一个会偷懒的程序员才是合格的程序员,在PHP开发中调试是必须要有的,可能要重复很多次的去调试,一次又一次,今天我们就来教教大家如何偷懒的,那么就来讲讲使用phpstorm进行偷懒吧! ...