生活随笔
收集整理的這篇文章主要介紹了
web.py开发web 第四章 Sqlalchemy(事件监听与初始化)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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(事件监听与初始化)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。