主要代码
-
后端代码
from werkzeug.utils import secure_filename import os # 修改文件名称 def change_filename(filename): # os.path.splitext(“文件路径”) 分离文件名与扩展名;默认返回(fname, fextension)元组,可做切片操作 意思是filename是个元祖(文件名, 后缀名) fileinfo = os.path.splitext(filename) # fileinfo[-1] 就是 fileinfo的后缀 filename = datetime.now().strftime("%Y%m%d%H%M%S") + str(uuid.uuid4().hex) + fileinfo[-1] return filename # 上传文件 # secure_filename是传入的文件名更加安全 # form.face.data.filename face头像的名称 file_face = secure_filename(form.face.data.filename) # 判断app.config["FC_DIR"]文件是否存在 if not os.path.exists(app.config["FC_DIR"]): # 递归创建app.config["FC_DIR"] os.makedirs(app.config["FC_DIR"]) # 给该文件设置读写权限 os.chmod(app.config["FC_DIR"], "rw") user.face = change_filename(file_face) form.face.data.save(app.config['FC_DIR'] + user.face)
案列
-
form.py
from flask_wtf import FlaskForm from wtforms import StringField, SubmitField, FileField, TextAreaField from wtforms.validators import DataRequired, Email class UserDetailForm(FlaskForm): name = StringField( label="昵称", validators=[ DataRequired("请输入昵称! ") ], description="昵称", render_kw={ "class": "form-control input-lg", "placeholder": "请输入昵称! " } ) email = StringField( label="邮箱", validators=[ DataRequired("请输入邮箱! "), Email(message="请输入正确格式的邮箱..") ], description="邮箱", render_kw={ "class": "form-control", "placeholder": "请输入邮箱! " } ) phone = StringField( label="手机号码", validators=[ DataRequired("请输入手机号码! "), Regexp("1[345789]\d{9}", message="请输入正确格式的手机号码.. ") ], description="手机号码", render_kw={ "class": "form-control", "placeholder": "请输入手机号码! " } ) face = FileField( label="头像", validators=[ DataRequired("请上传头像! ") ], description="头像", ) info = TextAreaField( label="简介", validators=[ DataRequired("请输入简介") ], description="简介", render_kw={ "class": "form-control", "rows": 10 } ) submit = SubmitField( '保存修改', render_kw={ "class": "btn btn-success" } )
-
view.py
from flask import render_template, redirect, url_for, flash from werkzeug.utils import secure_filename from . import home from .forms import UserDetailForm from ..models import User from app import db, app from datetime import datetime import os # 修改文件名称 def change_filename(filename): # os.path.splitext(“文件路径”) 分离文件名与扩展名;默认返回(fname, fextension)元组,可做切片操作 意思是filename是个元祖(文件名, 后缀名) fileinfo = os.path.splitext(filename) # fileinfo[-1] 就是 fileinfo的后缀 filename = datetime.now().strftime("%Y%m%d%H%M%S") + str(uuid.uuid4().hex) + fileinfo[-1] return filename @home.route("/user/", methods=['GET', 'POST']) @user_login_required def user(): form = UserDetailForm() user = User.query.filter_by(id=session["user_id"]).first() form.face.validators = [] if not user: flash("用户不存在", "err") return redirect(url_for("home.user")) if request.method == 'GET': form.name.data = user.name form.email.data = user.email form.phone.data = user.phone form.face.data = user.face form.info.data = user.info else: if form.validate_on_submit(): data = form.data # secure_filename是传入的文件名更加安全 # form.face.data.filename face头像的名称 file_face = secure_filename(form.face.data.filename) # 判断app.config["FC_DIR"]文件是否存在 if not os.path.exists(app.config["FC_DIR"]): # 递归创建app.config["FC_DIR"] os.makedirs(app.config["FC_DIR"]) # 给该文件设置读写权限 os.chmod(app.config["FC_DIR"], "rw") user.face = change_filename(file_face) form.face.data.save(app.config['FC_DIR'] + user.face) user_obj = User.query.filter_by(name=data["name"]).first() if user_obj: flash("该昵称已被使用..", "err_name") return redirect(url_for("home.user")) user_obj = User.query.filter_by(email=data["email"]).first() if user_obj: flash("该邮箱已被使用..", "err_email") return redirect(url_for("home.user")) user_obj = User.query.filter_by(phone=data["phone"]).first() if user_obj: flash("该电话号码已被使用..", "err_phone") return redirect(url_for("home.user")) user.name = data["name"] user.email = data["email"] user.phone = data["phone"] user.info = data["info"] db.session.commit() flash("修改成功..", "ok") return render_template("home/user.html", form=form, user=user)
-
html
<div class="panel-body"> {% for msg in get_flashed_messages(category_filter=['ok']) %} <p class="login-box-msg" style="color: green;">{{ msg }}</p> {% endfor %} {% for msg in get_flashed_messages(category_filter=['err']) %} <p class="login-box-msg" style="color: red;">{{ msg }}</p> {% endfor %} {% for msg in get_flashed_messages(category_filter=['err_name']) %} <p class="login-box-msg" style="color: red;">{{ msg }}</p> {% endfor %} {% for msg in get_flashed_messages(category_filter=['err_email']) %} <p class="login-box-msg" style="color: red;">{{ msg }}</p> {% endfor %} {% for msg in get_flashed_messages(category_filter=['err_phone']) %} <p class="login-box-msg" style="color: red;">{{ msg }}</p> {% endfor %} {# multipart/form-data 不设置这个文件上传就是string类型#} <form role="form" method="post" enctype="multipart/form-data"> {{ form.csrf_token }} <fieldset> <div class="form-group"> <label for="input_name"><span class="glyphicon glyphicon-user"></span> {{ form.name.label }}</label> {{ form.name }} {% for err in form.name.errors %} <div class="col-md-12" id="input_pwd"> <font style="color: red;">{{ err }}</font> </div> {% endfor %} </div> <div class="form-group"> <label for="input_email"><span class="glyphicon glyphicon-envelope"></span> {{ form.email.label }}</label> {{ form.email }} {% for err in form.email.errors %} <div class="col-md-12" id="input_pwd"> <font style="color: red;">{{ err }}</font> </div> {% endfor %} </div> <div class="form-group"> <label for="input_phone"><span class="glyphicon glyphicon-phone"></span> {{ form.phone.label }}</label> {{ form.phone }} {% for err in form.phone.errors %} <div class="col-md-12" id="input_pwd"> <font style="color: red;">{{ err }}</font> </div> {% endfor %} </div> <div class="form-group"> <label for="input_face"><span class="glyphicon glyphicon-picture"></span> {{ form.face.label }}</label> {{ form.face }} {% if user.face %} <img src="{{ url_for("static", filename="users/" + user.face) }}" width="300" height="500" class="img-responsive img-rounded"> {% else %} <img src="holder.js/100x100" width="300" height="500" class="img-responsive img-rounded"> {% endif %} {% for err in form.face.errors %} <div class="col-md-12" id="input_pwd"> <font style="color: red;">{{ err }}</font> </div> {% endfor %} </div> <div class="form-group"> <label for="input_info"><span class="glyphicon glyphicon-edit"></span> {{ form.info.label }}</label> {{ form.info }} {% for err in form.info.errors %} <div class="col-md-12" id="input_pwd"> <font style="color: red;">{{ err }}</font> </div> {% endfor %} </div> {{ form.submit }} </fieldset> </form> </div> </div>