Python 简单的登录示例-这是正确的方法吗?
下面我尝试创建一个非常简化且简单的Python 简单的登录示例-这是正确的方法吗?,python,flask,flask-login,Python,Flask,Flask Login,下面我尝试创建一个非常简化且简单的flask\u登录实现。当它工作时,我只想确保我用正确的方式来做。特别是,我的密码验证方法正确吗?我的意思是,我应该使用另一个flask_登录函数来为我执行此检查吗?我这里有没有不必要的代码 python和flask还是新手,如有任何建议/编辑,将不胜感激 用户名/密码检查: if (username, password) in users_db.items(): login_user(User(username))
flask\u登录实现。当它工作时,我只想确保我用正确的方式来做。特别是,我的密码验证方法正确吗?我的意思是,我应该使用另一个flask_登录函数来为我执行此检查吗?我这里有没有不必要的代码
python和flask还是新手,如有任何建议/编辑,将不胜感激
用户名/密码检查:
if (username, password) in users_db.items():
login_user(User(username))
return redirect(request.args.get("next"))
else:
return abort(401)
else:
return Response('''
<form action="" method="post">
<p><input type=text name=username>
<p><input type=password name=password>
<p><input type=submit value=Login>
</form>
'''
if(用户名、密码)在users\u db.items()中:
登录\用户(用户(用户名))
返回重定向(request.args.get(“下一步”))
其他:
返回中止(401)
其他:
返回响应(“”)
'''
整个登录尝试:
from flask import Flask, jsonify, render_template, request, url_for, redirect, session, abort, Response
from flask_login import LoginManager, UserMixin, login_required, login_user, logout_user
from flask_wtf import Form
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired
#################### Instantiate APP ###################################
'''Application Factory'''
app = Flask(__name__)
app.config['SECRET_KEY'] = 'shhsecret' #make this more random and secret, i recommend using os.urandom(50)
#################### Authentication ####################################
# flask-login
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"
class LoginForm(Form):
username = StringField('Your username', validators=[DataRequired()])
password = PasswordField('Your password', validators=[DataRequired()])
submit = SubmitField('Sign In')
# silly user model
class User(UserMixin):
def __init__(self, username):
self.id = username
self.password = users_db[username]
def __repr__(self):
return "%s/%s" % ( self.id, self.password)
def is_active(self):
return True
#users database (used dictionary just as an example)
users_db = { 'bill':'password1'
,'jondoe': 'password2'
,'elonmusk' : 'passwordtesla'
}
# create users from our users database above
users_activated = {User(key) for (key,value) in users_db.items()}
# some protected url
@app.route('/protectedurl')
@login_required
def protectedurl_func():
return Response("Hello World!")
# somewhere to login
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if (username, password) in users_db.items():
login_user(User(username))
return redirect(request.args.get("next"))
else:
return abort(401)
else:
return Response('''
<form action="" method="post">
<p><input type=text name=username>
<p><input type=password name=password>
<p><input type=submit value=Login>
</form>
''')
# somewhere to logout
@app.route("/logout")
@login_required
def logout():
logout_user()
return Response('<p>Logged out</p>')
# handle login failed
@app.errorhandler(401)
def page_not_found(e):
return Response('<p>Login failed</p>')
# callback to reload the user object
@login_manager.user_loader
def load_user(userid):
return User(userid)
if __name__ == '__main__':
app.run(debug=True, use_reloader=True)
从flask导入flask、jsonify、呈现模板、请求、url、重定向、会话、中止、响应
从flask_login导入LoginManager、UserMixin、login_required、login_user、logout_user
来自WASKU wtf进口表格
从wtforms导入StringField、PasswordField、SubmitField
需要从wtforms.validators导入数据
####################实例化应用程序###################################
“应用程序工厂”
app=烧瓶(名称)
app.config['SECRET_KEY']='shhsecret'#让它更加随机和保密,我建议使用os.Uradom(50)
####################认证####################################
#烧瓶登录
login\u manager=LoginManager()
登录管理器。初始化应用程序(应用程序)
login\u manager.login\u view=“login”
类登录信息(表格):
username=StringField('您的用户名',验证器=[DataRequired()]))
password=PasswordField('您的密码',验证器=[DataRequired()]))
submit=SubmitField('登录')
#愚蠢的用户模型
类用户(UserMixin):
定义初始化(self,用户名):
self.id=用户名
self.password=用户\数据库[用户名]
定义报告(自我):
返回“%s/%s”%(self.id,self.password)
def处于活动状态(自):
返回真值
#用户数据库(以字典为例)
用户_db={'bill':'password1'
,'jondoe':'password2'
,'elonmusk':'passwordtesla'
}
#从上面的用户数据库创建用户
users_activated={users_db.items()中(key,value)的用户(key)}
#一些受保护的url
@app.route(“/protectedurl”)
@需要登录
def protectedurl_func():
返回响应(“你好,世界!”)
#登录的地方
@app.route(“/login”,methods=[“GET”,“POST”])
def login():
如果request.method==“POST”:
用户名=请求。表单['username']
密码=请求。表单['password']
如果用户\ db.items()中的(用户名、密码):
登录\用户(用户(用户名))
返回重定向(request.args.get(“下一步”))
其他:
返回中止(401)
其他:
返回响应(“”)
''')
#要注销的地方
@应用程序路径(“/注销”)
@需要登录
def注销():
注销用户()
返回响应(“注销””)
#句柄登录失败
@app.errorhandler(401)
未找到def页面(e):
返回响应(“登录失败”)
#回调以重新加载用户对象
@登录\u manager.user\u加载程序
def load_用户(用户ID):
返回用户(userid)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
运行(debug=True,use_reloader=True)
> > p>所有工作。但是,在处理用户数据时,有一些原则需要考虑:
- 密码决不能像用户给定的那样存储在数据库中
对于代码重用性,考虑关注点的分离。
通常用于进行密码散列。当密码被“散列”时,意味着它已被转换为自身的加扰表示
这是它在python shell中的工作方式:
>>>来自werkzeug.security import生成\u密码\u散列
>>>hash=generate_password_hash('my_password'))
>>>散列
'pbkdf2:sha256:150000$aRIbsDyl$90ae44b1a5c679e08685c75ff0750df7c6670582a5839072d35a713316816760'
>>>
my_password
已通过一系列没有已知反向操作的加密操作转换为长编码字符串,这意味着获得哈希密码的人将无法使用它来获取原始密码
要验证用户密码,您可以执行以下操作:
>>>来自werkzeug.security import check\u password\u hash
>>>检查\u密码\u散列(散列“我的\u密码”)
真的
>>>检查\u密码\u散列(散列“另一个\u密码”)
假的
>>>
此密码散列是您应该存储在数据库中的内容:
从应用程序导入数据库
类用户(db.Model):
id=db.Column(db.Integer,主键=True)
username=db.Column(db.String(64),index=True,unique=True)
密码\u hash=db.Column(db.String(128))
def设置_密码(自我、密码):
self.password\u hash=生成密码\u hash(密码)
def检查_密码(自我、密码):
返回检查\u密码\u散列(self.password\u散列,password)
现在,您可以在路由中创建登录逻辑:
@app.route('/login',methods=['GET','POST'])
def login():
form=LoginForm()
if form.validate_on_submit():
user=user.query.filter\u by(username=form.username.data).first()
如果用户为None或not user。请检查\u密码(form.password.data):
flash('无效的用户名或密码')
返回重定向(url_用于('login'))
login\u user(user,memory=form.memory\u me.data)
返回重定向(url_for('index'))
返回呈现模板('login.html',title='Sign-In',form=form)
验证检查基本上是试图找出数据库中是否已经存在该用户。如果用户已经存在,并且其用户名和密码正确,则他们已登录。否则,他们将被重定向以再次尝试登录。