欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python sqlalchemy时间戳及密码管理实现代码详解

程序员文章站 2022-04-05 18:33:17
一、时间戳实际开发中,我们一般希望create_time和update_time这两个属性能自动设置,所以在建表的时候需要在model上特殊处理一下:from sqlalchemy.sql impor...

一、时间戳

实际开发中,我们一般希望create_time和update_time这两个属性能自动设置,所以在建表的时候需要在model上特殊处理一下:

from sqlalchemy.sql import func

class user(db.model):
  __tablename__ = 'user'
  id = db.column(db.integer, primary_key = true)
  email = db.column(db.string(128))
  password_hash = db.column(db.string(128))
  create_time = db.column(db.datetime, server_default = func.now())
  update_time = db.column(db.datetime, server_default = func.now(), onupdate = func.now())

关于datetime转时间戳的方法,例如‘2020-07-09 14:15:31'(从数据库读取一般为字符串),首先需要将它转换成timetuple:

import time
timetuple = time.strptime('2020-07-09 14:15:31', '%y-%m-%d %h:%m:%s')

如果你拿到的是datetime对象,那么更简单:

now = datetime.datetime.now()
timetuple = now.timetuple()

然后将timetuple转化为时间戳:

timestamp = int(time.mktime(timetuple))

那么,时间戳又要如何转回datetime呢?方法如下:

last_time = datetime.datetime.fromtimestamp(timestamp)

二、密码管理

在数据库中一般不要明文存储密码,可以用散列值替换,修改model:

from sqlalchemy.sql import func
from werkzeug.security import generate_password_hash, check_password_hash

class user(db.model):
  __tablename__ = 'user'
  id = db.column(db.integer, primary_key = true)
  email = db.column(db.string(128))
  password_hash = db.column(db.string(128))
  create_time = db.column(db.datetime, server_default = func.now())
  update_time = db.column(db.datetime, server_default = func.now(), onupdate = func.now())

  @property
  def password(self):
    raise attributeerror('password is not a readable attribute')

  @password.setter
  def password(self, password):
    self.password_hash = generate_password_hash(password)
  
  def verify_password(self, password):
    return check_password_hash(self.password_hash, password)

将password设置成只写,使用verify_password来校验密码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。