我有一个使用flask安全性设置的登录页面,一旦用户登录将其重定向到管理页面,现在我想为最终用户(客户)创建另一个登录页面。
我创建了一个将电子邮件和密码发布到flask的表单。烧瓶,然后检查数据库中是否存在电子邮件和密码,然后检查login_user(user)。 jQuery假定使用当前用户ID加载另一个页面,但返回None。
Login.py
@login.route('/userLogin/log', methods=['GET','POST'])
def Login():
data = request.get_json()
email = data["email"]
passw = data["password"]
user = UsersModel.query.filter_by(email=email).first()
if user:
if verify_password(user.password, passw):
login_user(user)
return jsonify({'message':"done"})
else:
return jsonify({'message':gettext('Email and Password do not exist')}),422
return render_template('front/cart.html')
@login.route('/homepage')
def homepage():
id = "Hello" + str(current_user.get_id())
return id
初始化 .py
app.config['SQLALCHEMY_DATABASE_URI'] ='mysql://root:@127.0.0.1/docwhere'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
#app.config['JWT_AUTH_USERNAME_KEY']='phoneNo'
#app.config['WTF_CSRF_CHECK_DEFAULT']=False
app.config['SECURITY_REGISTERABLE'] = False
app.config['SECURITY_PASSWORD_SALT']='rreer##@'
app.config['CKEDITOR_FILE_UPLOADER'] = '/admin/upload/'
app.config['CKEDITOR_FILE_BROWSER']='/fm/index.html'
app.config['UPLOADED_FILES_DEST'] = '/static/uploads'
app.secret_key = 'EiEiO##$'
app.config['FLASKFILEMANAGER_FILE_PATH'] = '/static/uploads'
app.config['BABEL_DEFAULT_LOCALE']='en'
app.path = '/static/uploads/'
app.database_path = '/static/uploads/'
db.init_app(app)
class JSONEncoder(BaseEncoder):
def default(self, o):
if isinstance(o, _LazyString):
return text_type(o)
return BaseEncoder.default(self, o)
app.json_encoder = JSONEncoder
babel = Babel(app)
csrf = CSRFProtect(app)
ckeditor = CKEditor(app)
login_manager = LoginManager()
login_manager.init_app(app)
security = Security(app, user_datastore)
更新:jQuery提交按钮
$('#login').click(function(e){
e.preventDefault();
url = "/userLogin/log "
var csrf_token = "%% csrf_token() %%";
var ob = {"email": $("#login-user").val(),
"password": $('#login-pass').val()
};
console.log(ob);
$.ajax({
url: url,
type: 'post',
headers: {
"Content-Type": "application/json",
"X-CSRFToken": csrf_token,
},
traditional: true,
data: JSON.stringify(ob),
success: function (message) {
window.location.replace("%%
url_for('login.homepage')%%%%process_query_string(request)%%");
},
error: function (err) {
error = "";
$(".btn").removeAttr("disabled");
for (key in err.responseJSON) {
error += key + ":" + err.responseJSON[key] + "<br>";
}
if (error)
$("#error").html("<p>" + error + "</p>");
else
$("#error").html("<p>" + err.responseText + "</p>");
$("#error").show();
}
});
return false;
});
答案 0 :(得分:0)
您想做的事很好。没有足够的调试信息来知道问题可能在哪里。您有可能在CSRF时被停止(我通常不使用CSRF而启动,以确保其他所有功能都可以正常工作)。 在您的代码段中-您正在使用Flask会话身份验证(隐式)。您不会在设置SECRET_KEY的位置显示您的代码,这是Flask生成会话cookie所必需的。 我将从使用浏览器调试器开始,查看/ userLogin / log的返回值,并确保它成功并返回会话cookie。 另外-确保在您随后的AJAX调用中-确保发送了cookie。 请注意,仅仅是因为您获得了会话cookie-并不意味着您已经登录-以便帮助检查-在引用current_user的端点上添加@login_required。