flask _QQ第三方登录
采用js sdk,详情可参考腾讯开发平台
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<script type="text/javascript" src="http://qzonestyle.gtimg.cn/qzone/openapi/qc_loader.js" data-callback="true"
data-appid="APPID" data-redirecturi="回调地址" charset="utf-8"></script>
</head>
<body>
<a href="https://graph.qq.com/oauth2.0/authorize?client_id=101536330&response_type=token&scope=all&redirect_uri=回调地址" title="QQ登陆" class="login100-social-item bg2">
<i class="fa fa-qq"></i>
</a>
<script src="{{ url_for('static',filename='vendor/jquery/jquery-3.2.1.min.js') }}"></script>
<script type="text/javascript">
setTimeout(function () {
var paras = {};
QC.api("get_user_info", paras)
.success(function (s) {
QC.Login.getMe(function (openId, accessToken) {
qq_Login(s, openId, accessToken);
});
})
.error(function (f) {
alert("使用QQ登录失败");
});
}, 200);
function qq_Login(s, openId, accessToken) {
var params = {
'openId': openId,
'nickName': s.data.nickname,
'avatar': s.data.figureurl_qq_1,
'sex': s.data.gender = "男" ? 1 : 0
};
$.post("{{ url_for('cms.login') }}", params, function (result) {
if (result.dealFlag = '1') {
alert("欢迎登陆" + s.data.nickname);
window.location.href = "{{ url_for('cms.myindex') }}";
} else {
alert("登陆失败");
window.location.href = "{{ url_for('cms.login') }}"
}
})
}
</script>
</body>
</html>
后台路由应该与回调地址的路由一致
data = request.form.get('nickName')
openId = request.form.get('openId')
avatar = request.form.get('avatar')
return render_template('xxxx.html')
return json.dumps({"dealFlag ": "1"})
if (result.dealFlag = '1') {
alert("欢迎登陆" + s.data.nickname);
// 登录成功后跳转到验证通过后的界面
window.location.href = "{{ url_for('cms.myindex') }}";
} else {
alert("登陆失败");
window.location.href = "{{ url_for('cms.login') }}"
}
前端界面的渲染
1. 可以根据获取的参数值直接传递到对应的前端页面进行渲染
2. 使用flask-login将用户信息注册到session中,在页面中直接根据{{ current_user.数据库字段名 }
后台处理
@cms_bp.route('/afterlogin.do', methods=['POST', 'GET'])
def login():
form = LoginForm(request.form)
if request.method == "POST":
data = request.form.get('nickName')
openId = request.form.get('openId')
avatar = request.form.get('avatar')
if data:
user = db.session.query(User).filter(User.username == data).first()
if not user:
user = User()
user.username = data
user.password = openId
user.status = avatar
db.session.add(user)
db.session.commit()
user = db.session.query(User).filter(User.username == data).first()
login_user(user)
if user:
return json.dumps({"dealFlag ": "1"})