一、安装pbkdf2
包
pip install pbkdf2
二、创建数据表的时候
1、引入加密的模块(必须的)
from pbkdf2 import PBKDF2
2、引入
uuid4
作为用户id
(非必须的)from uuid import uuid4
3、定义类创建表的代码
# coding=utf-8 from datetime import datetime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import create_engine, Column, Integer, String, Boolean, DateTime, ForeignKey from models import engine from models import dbSession from sqlalchemy.orm import relationship #引入uuid4作为id from uuid import uuid4 #引入第三方模块加密处理 from pbkdf2 import PBKDF2 Base = declarative_base(engine) # 定义好一些属性,与user表中的字段进行映射,并且这个属性要属于某个类型 class User1(Base): __tablename__ = 'user1' #设置uuid4的id(防止别人知道你用户量多少) uuid = Column(String(36),unique=True,nullable=False,default=lambda: str(uuid4())) id = Column(Integer, primary_key=True, autoincrement=True) username = Column(String(50), nullable=False) #Column('password',...)表示使用password作为列名 _password = Column('password', String(64)) createtime = Column(DateTime, default=datetime.now) last_login = Column(DateTime) loginnum = Column(Integer, default=0) _locked = Column(Boolean, default=False, nullable=False) #定义一个内部使用加密的方法 def _hash_password(self,password): return PBKDF2.crypt(password, iterations=0x2537) #使用property装饰器使方法变为属性 @property def password(self): return self._password #设置加密后给类属性赋值 @password.setter def password(self,password): self._password = self._hash_password(password) #定义一个密码校验的方法 def auth_password(self,pwd): if self._password is not None: return self.password == PBKDF2.crypt(pwd, self.password) else: return False
4、总结上面的代码:
- 1、 使用
lambda: str(uuid4())
生成uuid
- 2、使用
@property
使方法变成类属性 - 3、在密码字段使用
_password = Column('password', String(64))
详解见上面代码 - 4、在类里面定义密码赋值的方法与密码校验的方法
- 1、 使用
三、测试
1、用户注册的试图函数
```python # 注册试图 class RegistHandle(BaseHandle): def get(self): self.render("regist.html") def post(self): username = self.get_argument("username", "") password = self.get_argument("password", "") if not username and not password: self.write(u"用户名或密码输入有错误") # 先查询数据库是否已经存在该用户 search_name = self.db.query(User1).filter_by(username=username).first() if search_name: self.write(u"该用户名已经存在,不能重复注册") else: user = User1() user.username = username user.password = password self.db.add(user) self.db.commit() self.write(u"注册成功") ```
2、用户登录的试图函数
```python # 登录试图 class LoginHandle(BaseHandle): def get(self): self.render("login.html", next=self.get_argument("next")) def post(self): username = self.get_argument("username", "") password = self.get_argument("password", "") # 根据用户名去查找数据库 search_user = self.db.query(User1).filter_by(username=username).first() if search_user and search_user.auth_password(password): # 登录成功调用方法 self.success_login(search_user) self.redirect(self.get_argument("name")) else: self.write(u"登录失败") # 登录成功附加别的属性 def success_login(self, user): user.last_login = datetime.now() user.loginnum += 1 self.db.add(user) self.db.commit() self.session.set('username', user.username) ```