日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/3/17 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)容還不錯,歡迎將生活随笔推薦給好友。