2019独角兽企业重金招聘Python工程师标准>>>

上一章讲了sqlalchemy的数据库创建,我想大家应该会慢慢喜欢上用这种方式来创建数据库吧,sqlalchemy不仅仅能自动创建数据库,更提供了其他更强大的功能,今天要介绍的就是sqlalchemy中的事件监听,并将其应用到数据库的初始化中。

上一章的数据库创建,除了将user表创建出来,我们并没有进行其他的操作,而往往我们的web开发,总需要在网站中设计一个超级管理员,这个超级管理员不是注册出来的,而是在数据库创建初期就有的,那么,我们可以在models.py中创建user表,并同时向user表插入超级管理员的信息,而在插入超级管理员或者以后的修改密码、新增用户的时候,我们的密码都是需要加密的,那么这时就可以添加一个事件触发,当插入设置password字段时,自动加密,好,需求有了,接下来就是行动了,我们把原来的models.py修改成以下代码:
models.py

# -*- coding:utf-8 -*-
from sqlalchemy import *
from sqlalchemy import event
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import scoped_session, sessionmaker
import hashlib#这里定义一个password加密混淆
password_prefix = "Ad%cvcsadefr^!deaf"#定义数据库的账号、端口、密码、数据库名,使用的连接模块,这里用的是mysqldb
engine = create_engine('mysql+mysqldb://root:1234567@localhost:3306/tech?charset=utf8',echo=False#是否输出数据库操作过程,很方便调试
)#定义一个函数,用来获取sqlalchemy的session
def bindSQL():return scoped_session(sessionmaker(bind=engine))Base = declarative_base()
Base.__table_args__ = {'mysql_engine':'InnoDB'}#定义数据表使用InnoDBclass User(Base):__tablename__ = "user"id = Column(Integer, primary_key=True)name = Column(String(20), unique=True)email = Column(String(32), unique=True)password = Column(String(32))superuser = Column(Boolean, default=False)metadata = Base.metadata#定义一个回调函数用于响应触发事件
def setPassword(target, value, oldvalue, initiator):if value == oldvalue:#如果新设置的值与原有的值相等,那么说明用户并没有修改密码,返回原先的值return oldvalue#如果新值与旧值不同,说明密码发生改变,进行加密,加密方法可以根据自己需求改变return hashlib.md5("%s%s" % (password_prefix, value)).hexdigest()
#设置事件监听,event.listen(表单或表单字段, 触发事件, 回调函数, 是否改变插入值)
event.listen(User.password, "set", setPassword, retval=True)#为了避免重复插入数据,定义一个get_or_create函数,这个是模仿django的,有兴趣的同学可以google下
def get_or_create(session, model, **kwargs):if "defaults" in kwargs:defaults = kwargs["defaults"]del kwargs["defaults"]else:defaults = {}instance = session.query(model).filter_by(**kwargs).first()if instance:return instance, Falseelse:kwargs.update(defaults)instance = model(**kwargs)session.add(instance)session.flush()session.refresh(instance)return instance, True#定义初始化函数
def initModel():metadata.create_all(engine)#创建数据库db = bindSQL()#获取sqlalchemy的session#创建超级管理员,这里为了避免多次运行initModel而发生重复插入的情况,使用了get_or_create方法obj, created = get_or_create(db,User,name="administrator",defaults={"email": "332535694@qq.com","password": "administrator","superuser": True})db.commit()#记得commit喔,不然数据最后还是没插入db.remove()if __name__ == "__main__":initModel()

将上一章创建的user表删除,运行下python models.py,看看是不是创建user表后插入了超级管理员的数据,并对密码进行加密了:)

转载于:https://my.oschina.net/zhengnazhi/blog/120800

web.py开发web 第四章 Sqlalchemy(事件监听与初始化)相关推荐

  1. web.py开发web 第一章 Hello World

    2019独角兽企业重金招聘Python工程师标准>>> 前言   这一系列的文章主要针对使用web.py+jinja2+sqlalchemy+formalchemy+jquery+k ...

  2. Web前端开发笔记——第四章 JavaScript程序设计 第五节 数组

    目录 一.数组的创建 (一)Array()构造函数 (二)字面量方法 二.数组元素的读写和遍历 三.添加和删除数组元素 (一)添加数组元素 (二)删除数组元素 (三)splice()方法 四.二维数组 ...

  3. Web前端开发笔记——第四章 JavaScript程序设计 第四节 条件语句和循环语句

    目录 一.if条件语句 二.while循环语句 (一)while()语句 (二)do--while语句 三.for循环语句 四.switch语句 五.break语句和continue语句 一.if条件 ...

  4. Web前端开发笔记——第四章 JavaScript程序设计 第三节 数据类型

    目录 一.基本数据类型 (一)String类型 (二)Number类型 1.字面量 2.无穷大 3.非数值 (三)Boollean类型 (四)Undefined类型和Null类型 二.引用数据类型 ( ...

  5. Web前端开发笔记——第四章 JavaScript程序设计 第二节 变量

    目录 一.JavaScript中的注释 二.变量的命名规则 三.变量声明以及赋值 四.变量作用域 五.变量提升 一.JavaScript中的注释 JavaScript中单行注释通过"//&q ...

  6. Web前端开发笔记——第四章 JavaScript程序设计 第一节 JavaScript的基础语法

    目录 一.JavaScript的定义 二.代码的创建和使用 (一)内嵌JavaScript代码 (二)引用JavaScript文件 三.代码的注释 四.输出数据 (一)alert()弹出警告框 (二) ...

  7. java web应用开发技术_第一章 Java Web应用开发技术

    Java Web应用开发是基于JavaEE(JavaEnterprise Edition)框架的,而JavaEE是建立在Java平台上的企业级应用解决方案.JavaEES框架提供的Web开发技术主要支 ...

  8. 雷火神山直播超两亿,Web播放器事件监听是怎么实现的?

    Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播.在视频业务大数据平台中,播放数据的统计分析非常重要,所以We ...

  9. 【COCOS CREATOR 系列教程之二】脚本开发篇事件监听、常用函数等示例整合

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos-creator/1959.htm ...

最新文章

  1. 2019年安徽省模块七满分多少_艺考资讯 | 2021年美术统考考多少分才能通过?过了合格线有什么意义?美术生一定要重视!...
  2. 最新综述 | 强化学习中从仿真器到现实环境的迁移
  3. 2017-11-26 编程语言试验之Antlr4+Java实现圈2
  4. Google帮助IE浏览器实现对SVG支持
  5. [转]IP动态切换脚本
  6. Jmeter+Ant+Jenkins集成抛出异常java.lang.ClassNotFoundException: javax.mail.internet.MimeMessage
  7. Spring Data Jpa 审计功能
  8. Vue之import
  9. Android Studio 下载 与 安装 详细步骤
  10. 软件基本功:测试听着简单,会做的没几个
  11. OpenCV python下载和安装
  12. ADASIS_v2:根据车辆位置和数字地图描述车辆前方的道路几何及其相关属性(use)
  13. Linux下搭建SVN
  14. HackingLab脚本关
  15. .vip域名是什么?
  16. 论文笔记:SemStyle: Learning to Generate Stylised Image Captions using Unaligned Text
  17. 数仓即席查询---Presto
  18. [jzoj 6093] [GDOI2019模拟2019.3.30] 星辰大海 解题报告 (半平面交)
  19. 计算机电缆传输频率,传输频率
  20. Java 中一个天天都在被人使用,但你并不知道为什么的知识点

热门文章

  1. Java打印车票主要学习Java的比较语句
  2. 何时使用[self release]
  3. zabbix NFS挂载 监控模板
  4. 《Java 7程序设计入门经典》一3.7 for循环
  5. 从零开始玩转logback
  6. 我想吐槽“吐槽 Google 换新 Logo 的人”
  7. 杭州优步uber司机第三组奖励政策
  8. propertychange input change
  9. iOS开发-文件上传原理
  10. JavaScript对象的创建之动态原型方式