Python制作简易注册登录系统
这篇文章主要为大家详细介绍了 Python 简易注册登录系统的制作方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
这次我主要讲解如何用 Python 基于 Flask 的登录和注册, 验证方式采用 Basic Auth
主要用以下库importos
#Flask的基础库
fromflaskimportFlask,abort,request,jsonify,g,url_for
#Flaks的数据库操作的库
fromflask.ext.sqlalchemyimportSQLAlchemy
#Flask登录注册的库
fromflask.ext.httpauthimportHTTPBasicAuth
#加密解密密码的库
frompasslib.appsimportcustom_app_contextaspwd_context
#URL安全序列化工具
fromitsdangerousimport(TimedJSONwebSignatureSerializer
asSerializer,BadSignature,SignatureExpired)
首先当然是初始化app=Flask(__name__)
# 设置密钥
app.config['SECRET_KEY']='the quick brown fox jumps over the lazy dog'
# 数据库的配置
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///db.sqlite'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True
#数据库初始化
db=SQLAlchemy(app)
# 验证的初始化
auth=HTTPBasicAuth()
然后是建模
SQLAlchemy 是 ORM 模型操作数据库的,所以是非常的方便
除了基本的属性之后我们我定义了一些必要的方法classUser(db.Model):
__tablename__='users'
id=db.Column(db.Integer,primary_key=True)
username=db.Column(db.String(32),index=True)
password_hash=db.Column(db.String(64))
# 加密密码
defhash_password(self,password):
self.password_hash=pwd_context.encrypt(password)
# 验证密码
defverify_password(self,password):
returnpwd_context.verify(password,self.password_hash)
# 生成token,并设置过期时间
defgenerate_auth_token(self,expiration=600):
s=Serializer(app.config['SECRET_KEY'],expires_in=expiration)
returns.dumps({'id':self.id})
# 静态的验证token的方法
@staticmethod
defverify_auth_token(token):
s=Serializer(app.config['SECRET_KEY'])
try:
data=s.loads(token)
exceptSignatureExpired:
returnNone# token过期
exceptBadSignature:
returnNone# token无效
user=User.query.get(data['id'])
returnuser
注册功能@app.route('/api/users',methods=['POST'])
defnew_user():
username=request.json.get('username')
password=request.json.get('password')
ifusernameisNoneorpasswordisNone:
abort(400)# 用户名或者密码为空
ifUser.query.filter_by(username=username).first()isnotNone:
abort(400)# 用户已存在
user=User(username=username)
# 加密密码
user.hash_password(password)
# 保存进数据库
db.session.add(user)
db.session.commit()
# 成功注册后返回用户名,Location后面接着的是跳转的地址
return(jsonify({'username':user.username}),201,
{'Location':url_for('get_user',id=user.id,_external=True)})
登录功能# 登录后获取token
@app.route('/api/token')
@auth.login_required
defget_auth_token():
# 设置token过期时间
token=g.user.generate_auth_token(600)
returnjsonify({'token':token.decode('ascii'),'duration':600})
获取 token 后之后,每次请求只需传 token 就好了
我们可以通过一个方法验证 token 是否有效# 可以通过token或者账号密码登录
@app.route('/api/resource')
@auth.login_required
defget_resource():
# 如果token有效的话就返回username
returnjsonify({'data':'Hello, %s!'%g.user.username})
细心的人会发现上面这两个方法前都带有 @auth.login_required,这其实就是奥妙之处# 有@auth.login_required标志的都要调用这个方法,传token或者传账号和密码
@auth.verify_password
defverify_password(username_or_token,password):
# 首先验证token
user=User.verify_auth_token(username_or_token)
ifnotuser:
# 然后再验证用户名和密码
user=User.query.filter_by(username=username_or_token).first()
ifnotuserornotuser.verify_password(password):
returnFalse
g.user=user
returnTrue
最后写一个入口方法if__name__=='__main__':
# 如果这个数据库不存在就创建
ifnotos.path.exists('db.sqlite'):
db.create_all()
app.run(debug=True)
这样就大功告成了
效果图
注册
登录
验证 token
来源: http://www.phperz.com/article/17/0320/315072.html