生活随笔
收集整理的這篇文章主要介紹了
web.py开发web 第四章 Sqlalchemy(事件监听与初始化)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
? ? 上一章講了sqlalchemy的數(shù)據(jù)庫創(chuàng)建,我想大家應(yīng)該會慢慢喜歡上用這種方式來創(chuàng)建數(shù)據(jù)庫吧,sqlalchemy不僅僅能自動創(chuàng)建數(shù)據(jù)庫,更提供了其他更強(qiáng)大的功能,今天要介紹的就是sqlalchemy中的事件監(jiān)聽,并將其應(yīng)用到數(shù)據(jù)庫的初始化中。
? ? 上一章的數(shù)據(jù)庫創(chuàng)建,除了將user表創(chuàng)建出來,我們并沒有進(jìn)行其他的操作,而往往我們的web開發(fā),總需要在網(wǎng)站中設(shè)計一個超級管理員,這個超級管理員不是注冊出來的,而是在數(shù)據(jù)庫創(chuàng)建初期就有的,那么,我們可以在models.py中創(chuàng)建user表,并同時向user表插入超級管理員的信息,而在插入超級管理員或者以后的修改密碼、新增用戶的時候,我們的密碼都是需要加密的,那么這時就可以添加一個事件觸發(fā),當(dāng)插入設(shè)置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"#定義數(shù)據(jù)庫的賬號、端口、密碼、數(shù)據(jù)庫名,使用的連接模塊,這里用的是mysqldb
engine = create_engine('mysql+mysqldb://root:1234567@localhost:3306/tech?charset=utf8',echo=False#是否輸出數(shù)據(jù)庫操作過程,很方便調(diào)試
)#定義一個函數(shù),用來獲取sqlalchemy的session
def bindSQL():return scoped_session(sessionmaker(bind=engine))Base = declarative_base()
Base.__table_args__ = {'mysql_engine':'InnoDB'}#定義數(shù)據(jù)表使用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#定義一個回調(diào)函數(shù)用于響應(yīng)觸發(fā)事件
def setPassword(target, value, oldvalue, initiator):if value == oldvalue:#如果新設(shè)置的值與原有的值相等,那么說明用戶并沒有修改密碼,返回原先的值return oldvalue#如果新值與舊值不同,說明密碼發(fā)生改變,進(jìn)行加密,加密方法可以根據(jù)自己需求改變return hashlib.md5("%s%s" % (password_prefix, value)).hexdigest()
#設(shè)置事件監(jiān)聽,event.listen(表單或表單字段, 觸發(fā)事件, 回調(diào)函數(shù), 是否改變插入值)
event.listen(User.password, "set", setPassword, retval=True)#為了避免重復(fù)插入數(shù)據(jù),定義一個get_or_create函數(shù),這個是模仿django的,有興趣的同學(xué)可以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#定義初始化函數(shù)
def initModel():metadata.create_all(engine)#創(chuàng)建數(shù)據(jù)庫db = bindSQL()#獲取sqlalchemy的session#創(chuàng)建超級管理員,這里為了避免多次運(yùn)行initModel而發(fā)生重復(fù)插入的情況,使用了get_or_create方法obj, created = get_or_create(db,User,name="administrator",defaults={"email": "332535694@qq.com","password": "administrator","superuser": True})db.commit()#記得commit喔,不然數(shù)據(jù)最后還是沒插入db.remove()if __name__ == "__main__":initModel() ? ? ?將上一章創(chuàng)建的user表刪除,運(yùn)行下python models.py,看看是不是創(chuàng)建user表后插入了超級管理員的數(shù)據(jù),并對密碼進(jìn)行加密了:)
轉(zhuǎn)載于:https://my.oschina.net/zhengnazhi/blog/120800
總結(jié)
以上是生活随笔為你收集整理的web.py开发web 第四章 Sqlalchemy(事件监听与初始化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。