day62-flask项目爱家头像上传及认证
2019-02-12 本文已影响0人
barriers
在flask中用函数名实现跳转的只有反向解析。其他都是由蓝图别名加路由实现跳转。而反向解析为蓝图的第一个参数加重定向的函数名实现跳转。形式为url_for('生成蓝图的第一个参数.重定向的函数名')。
在js中实现页面跳转有两种方式,location.href = '/user/my/'和('#user-avatar').attr('src', data.data.avatar)
1登陆校验装饰器
def need_check(func):
@wraps(func)
def check_path(*args, **kwargs):
if 'user_id' in session:
# 判断session中是否存在登陆的标识user_id
return func(*args, **kwargs)
else:
return redirect(url_for('user.my_login'))
return check_path
登陆成功时向session中存值
3.密码校验
if user.check_pwd(passwd):
session['user_id'] = user.id
return jsonify({'code': 200, 'msg': '请求成功'})
2解析当前登陆用户
前后分离过程中在页面解析当前登陆用户的相关信息(不使用current_user),通过使用自定义的对象方法to_basic_dict()将对象序列化传递给前端,然后前端获取到相关标签并对其进行解析。
@user_blue.route('/user_info/', methods=['GET'])
def user_info():
user_id = session['user_id']
user = User.query.get(user_id)
return jsonify({'code': 200, 'msg': '请求成功', 'data': user.to_basic_dict()})
$(document).ready(function(){
$.ajax({
url:'/user/user_info/',
dataType:'json',
type:'GET',
success:function (data) {
$('#user-name').html(data.data.name)
$('#user-mobile').html(data.data.phone)
$('#user-avatar').attr('src', '/static/media/'+data.data.avatar)
}
})
})
3修改头像
$(document).ready(function () {
$('#form-avatar').submit(function (e) {
e.preventDefault();
$(this).ajaxSubmit({
url:'/user/profile/',
type:'PATCH',
dataType:'json',
success:function (data) {
if(data.code == 200){
$('#user-avatar').attr('src', '/static/media/'+data.avatar)
}
if(data.code == 1009){
$('#avatar-err span').html(data.msg)
$('#avatar-err').show()
}
}
})
})
@user_blue.route('/profile/', methods=['PATCH'])
@need_check
def patch_profile():
# 1.获取图片
ima = request.files.get('avatar')
if not ima:
return jsonify({'code': 1009, 'msg': '上传图片不能为空'})
else:
# 2.获取项目路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 3.获取媒体文件的路径
STATIC_DIR = os.path.join(BASE_DIR, 'static')
MEDIA_DIR = os.path.join(STATIC_DIR, 'media')
# 4.生成随机图片名称
filename = str(uuid.uuid4())
# 5.获取图片的后缀
a = ima.mimetype.split('/')[-1]
# 6.生成文件名
name = filename + '.' + a
# 7.拼接图片地址
path = os.path.join(MEDIA_DIR, name)
# 8.将图片保存到media文件夹中
ima.save(path)
# 9.获取用户对象
user_id = session['user_id']
user = User.query.filter_by(id=user_id).first()
# 10.给用户头像赋值并保存
user.avatar = name
user.add_update()
return jsonify({'code': 200, 'msg': '请求成功', 'avatar': user.avatar})
4修改姓名
$('#form-name').submit(function (e) {
e.preventDefault();
$(this).ajaxSubmit({
url:'/user/my_profile/',
type:'POST',
dataType:'json',
success:function (data) {
if(data.code == 200){
location.href = '/user/my/'
}
if(data.code == 1010){
$('#name-err span').html(data.msg)
$('#name-err').show()
}
if(data.code == 1011){
$('#name-err span').html(data.msg)
$('#name-err').show()
}
}
})
})
@user_blue.route('/my_profile/', methods=['POST'])
@need_check
def my_profile():
# 1.获取用户名
name = request.form.get('name')
if not name:
return jsonify({'code': 1010, 'msg': '姓名不能为空'})
else:
user = User.query.filter(User.name == name).first()
if user:
return jsonify({'code': 1011, 'msg': '已存在该用户名,请重新输入'})
else:
user_id = session['user_id']
user = User.query.get(user_id)
user.name = name
user.add_update()
return jsonify({'code': 200, 'msg': '修改成功'})
5实名认证
$(document).ready(function () {
$('#form-auth').submit(function (e) {
e.preventDefault();
$(this).ajaxSubmit({
url:'/user/auth/',
dataType:'json',
type:'POST',
success:function (data) {
if(data.code == 200){
location.href = '/user/my/'
}
if(data.code == 2000){
$('.error-msg span').html(data.msg)
$('.error-msg').show()
}
if(data.code == 2001){
$('.error-msg span').html(data.msg)
$('.error-msg').show()
}
if(data.code == 2002){
$('.error-msg span').html(data.msg)
$('.error-msg').show()
}
if(data.code == 2003){
$('.error-msg span').html(data.msg)
$('.error-msg').show()
}
}
})
})
})
@user_blue.route('/auth/', methods=['POST'])
@need_check
def my_auth():
# 1.获取用户名和身份证号
real_name = request.form.get('real_name')
id_card = request.form.get('id_card')
# 2.判断用户名及身份证是否填写完全
if not (2 <= len(real_name) <= 4 or len(id_card) == 18):
return jsonify({'code': 2000, 'msg': '请填写合法的用户名(2至4个字符)或身份证号(18个字符)'})
else:
if re.search(r'[^\u4e00-\u9fa5]', real_name):
return jsonify({'code': 2001, 'msg': '姓名中包含不合法的字符(请全部使用汉字)'})
if not re.fullmatch(r'^\d{17}[xX\d]$', id_card):
return jsonify({'code': 2002, 'msg': '身份证号不合法'})
# 3.查询该身份证号是否已被用于实名认证过
user = User.query.filter_by(id_card=id_card).first()
if user:
return jsonify({'code': 2003, 'msg': '该身份证号已被实名认证'})
# 4.保存实名认证信息
user_id = session['user_id']
user = User.query.get(user_id)
user.id_name = real_name
user.id_card = id_card
user.add_update()
return jsonify({'code': 200, 'msg': '实名认证成功'})
6退出
@user_blue.route('/logout/', methods=['GET'])
def logout():
del session['user_id']
return jsonify({'code': 200, 'msg': '请求成功', 'errno': 0})
function logout() {
$.get("/user/logout", function(data){
if (0 == data.errno) {
location.href = "/user/my_login/";
}
})
}