25、Flask构建弹幕微电影网站-会员中心登录要求,会员资料和密码修改

百度云搜索,搜各种资料:http://www.81ad.cn

Flask 构建微电影视频网站

已上线演示地址: http://movie.tbquan.cn

会员登录装饰器

在home.views.py中创建登录装饰器

from functools import wraps

# 要求登录才能访问
def user_login_require(func):
    @wraps(func)
    def decorated_function(*args, **kwargs):
        if session.get('login_user', None) is None:
            # 如果session中未找到该键,则用户需要登录
            return redirect(url_for('home.login', next=request.url))
        return func(*args, **kwargs)

    return decorated_function

增加登录装饰器

@home.route('/user/')
@user_login_require
def user():
    return render_template('home/user.html')

也需要将以下功能添加要求登录。

BLOG_20181112_215345_11

会员资料修改

创建会员资料表单

class UserDetailForm(FlaskForm):
    name = StringField(
        label='昵称',
        validators=[
            DataRequired('请输入昵称!')
        ],
        description='昵称',
        render_kw={
            'class': "form-control",
            'placeholder': "请输入昵称",
            'required': "required",
            'autofocus': "autofocus"
        }
    )
    email = StringField(
        label='邮箱',
        validators=[
            DataRequired('请输入邮箱!'),
            Email('邮箱格式不正确')
        ],
        description='邮箱',
        render_kw={
            'class': "form-control",
            'placeholder': "请输入邮箱",
            'required': "required",
            'autofocus': "autofocus"
        }
    )
    phone = StringField(
        label='手机',
        validators=[
            DataRequired('请输入手机!'),
            Regexp('^1[3|4|5|6|7|8][0-9]\d{4,8}$', message='手机格式不正确')
        ],
        description='手机',
        render_kw={
            'class': "form-control",
            'placeholder': "请输入手机",
            'required': "required",
            'autofocus': "autofocus"
        }
    )
    face = FileField(
        label='头像',
        validators=[
            DataRequired('请上传头像')
        ],
        description='头像',
    )
    info = TextAreaField(
        label='简介',
        validators=[
            DataRequired('请输入简介!')
        ],
        description='简介',
        render_kw={
            'class': "form-control",
            'rows': "10",
        }
    )
    submit = SubmitField(
        label='保存',
        render_kw={
            'class': "btn btn-success"
        }
    )

修改user会员资料视图

from werkzeug.utils import secure_filename
import os
from app import db, app

@home.route('/user/', methods=['GET', 'POST'])
@user_login_require
def user():
    login_user = User.query.get_or_404(int(session['login_user_id']))
    form = UserDetailForm(
        name=login_user.name,
        email=login_user.email,
        phone=login_user.phone,
        info=login_user.info
    )
    form.face.validators = []
    form.face.render_kw = {'required': False}
    if form.validate_on_submit():
        data = form.data
        face_save_path = app.config['USER_IMAGE']
        if not os.path.exists(face_save_path):
            os.makedirs(face_save_path)  # 如果文件保存路径不存在,则创建一个多级目录
            import stat
            os.chmod(face_save_path, stat.S_IRWXU)  # 授予可读写权限

        if form.face.data:
            # 上传文件不为空保存
            if login_user.face and os.path.exists(os.path.join(face_save_path, login_user.face)):
                os.remove(os.path.join(face_save_path, login_user.face))
            # 获取上传文件名称
            file_face = secure_filename(form.face.data.filename)
            # !!!AttributeError: 'str' object has no attribute 'filename',前端需要加上enctype="multipart/form-data"
            from app.admin.views import change_filename
            login_user.face = change_filename(file_face)
            form.face.data.save(face_save_path + login_user.face)

        if login_user.name != data['name'] and User.query.filter_by(name=data['name']).count() == 1:
            flash('昵称已经存在', 'err')
            return redirect(url_for('home.user'))
        login_user.name = data['name']

        if login_user.email != data['email'] and User.query.filter_by(email=data['email']).count() == 1:
            flash('邮箱已经存在', 'err')
            return redirect(url_for('home.user'))
        login_user.email = data['email']

        if login_user.phone != data['phone'] and User.query.filter_by(phone=data['phone']).count() == 1:
            flash('手机号已经存在', 'err')
            return redirect(url_for('home.user'))
        login_user.phone = data['phone']

        login_user.info = data['info']

        db.session.commit()
        flash('修改资料成功', 'ok')
        return redirect(url_for('home.user'))
    return render_template('home/user.html', form=form, login_user=login_user)

修改user.html会员资料模板

<div class="panel-body">
    {% with msgs = get_flashed_messages(category_filter=['ok']) %}
        {% if msgs %}
            {% for msg in msgs %}
                <p>{{ msg }}</p>
            {% endfor %}
        {% endif %}
    {% endwith %}
    {% with msgs = get_flashed_messages(category_filter=['err']) %}
        {% if msgs %}
            {% for msg in msgs %}
                <p>{{ msg }}</p>
            {% endfor %}
        {% endif %}
    {% endwith %}
    <form role="form" method="post" enctype="multipart/form-data">
        <fieldset>
            <div class="form-group">
                <label for="input_name"><span class="glyphicon glyphicon-user"></span>&nbsp;{{ form.name.label }}</label>
                {{ form.name }}
            </div>
            {% for err in form.name.errors %}
                <div class="col-md-12" style="color: red">{{ err }}</div>
            {% endfor %}
            <div class="form-group">
                <label for="input_email"><span class="glyphicon glyphicon-envelope"></span>&nbsp;{{ form.email.label }}</label>
                {{ form.email }}
            </div>
            {% for err in form.email.errors %}
                <div class="col-md-12" style="color: red">{{ err }}</div>
            {% endfor %}
            <div class="form-group">
                <label for="input_phone"><span class="glyphicon glyphicon-phone"></span>&nbsp;{{ form.phone.label }}</label>
                {{ form.phone }}
            </div>
            {% for err in form.phone.errors %}
                <div class="col-md-12" style="color: red">{{ err }}</div>
            {% endfor %}
            <div class="form-group">
                <label for="input_face"><span class="glyphicon glyphicon-picture"></span>&nbsp;{{ form.face.label }}</label>
                {% if login_user.face %}
                    <img src="{{ url_for('static', filename='user/'+login_user.face) }}" class="img-responsive img-rounded" style="width: 100px">
                {% else %}
                    <img data-src="holder.js/100x100" class="img-responsive img-rounded">
                {% endif %}
                {{ form.face }}
            </div>
            {% for err in form.face.errors %}
                <div class="col-md-12" style="color: red">{{ err }}</div>
            {% endfor %}
            <div class="form-group">
                <label for="input_info"><span class="glyphicon glyphicon-edit"></span>&nbsp;{{ form.info.label }}</label>
                {{ form.info }}
            </div>
            {% for err in form.info.errors %}
                <div class="col-md-12" style="color: red">{{ err }}</div>
            {% endfor %}
            {{ form.csrf_token }}
            {{ form.submit }}
        </fieldset>
    </form>
</div>

BLOG_20181112_215403_90

会员密码修改

创建会员密码修改表单

class PwdForm(FlaskForm):
    oldpwd = PasswordField(
        label='旧密码',
        validators=[
            DataRequired('请输入旧密码!')
        ],
        description='旧密码',
        render_kw={
            'class': "form-control",
            'placeholder': "请输入旧密码",
            'required': "required",
            'autofocus': 'autofocus'
        }
    )
    newpwd = PasswordField(
        label='新密码',
        validators=[
            DataRequired('请输入新密码!')
        ],
        description='新密码',
        render_kw={
            'class': "form-control",
            'placeholder': "请输入新密码",
            'required': "required",
            'autofocus': 'autofocus'
        }
    )
    repwd = PasswordField(
        label='重复密码',
        validators=[
            DataRequired('请输入重复密码!'),
            EqualTo('newpwd', message='两次密码不一致')
        ],
        description='重复密码',
        render_kw={
            'class': "form-control",
            'placeholder': "请输入重复密码",
            'required': "required"
        }
    )
    submit = SubmitField(
        label='修改密码',
        render_kw={
            'class': "btn btn-success"
        }
    )

修改pwd修改密码视图

@home.route('/pwd/', methods=['GET', 'POST'])
@user_login_require
def pwd():
    login_user = User.query.get_or_404(int(session['login_user_id']))
    form = PwdForm()
    if form.validate_on_submit():
        data = form.data
        if login_user.check_pwd(data['oldpwd']):
            login_user.pwd = generate_password_hash(data['newpwd'])
            db.session.commit()
            flash('密码修改成功,请重新登录', category='ok')
            return redirect(url_for('home.login'))
        else:
            flash('旧密码不正确', category='err')
            return redirect(url_for('home.pwd'))
    return render_template('home/pwd.html', form=form)

修改pwd.html修改密码模板

<div class="panel-body">
    {% with msgs = get_flashed_messages(category_filter=['ok']) %}
        {% if msgs %}
            {% for msg in msgs %}
                <p>{{ msg }}</p>
            {% endfor %}
        {% endif %}
    {% endwith %}
    {% with msgs = get_flashed_messages(category_filter=['err']) %}
        {% if msgs %}
            {% for msg in msgs %}
                <p>{{ msg }}</p>
            {% endfor %}
        {% endif %}
    {% endwith %}
    <form role="form" method="post">
        <fieldset>
            <div class="form-group">
                <label for="input_oldpwd"><span class="glyphicon glyphicon-lock"></span>&nbsp;{{ form.oldpwd.label }}</label>
                {{ form.oldpwd }}
            </div>
            {% for err in form.oldpwd.errors %}
                <div class="col-md-12" style="color: red">{{ err }}</div>
            {% endfor %}
            <div class="form-group">
                <label for="input_newpwd"><span class="glyphicon glyphicon-lock"></span>&nbsp;{{ form.newpwd.label }}</label>
                {{ form.newpwd }}
            </div>
            {% for err in form.newpwd.errors %}
                <div class="col-md-12" style="color: red">{{ err }}</div>
            {% endfor %}
            <div class="form-group">
                <label for="input_newpwd"><span class="glyphicon glyphicon-lock"></span>&nbsp;{{ form.repwd.label }}</label>
                {{ form.repwd }}
            </div>
            {% for err in form.repwd.errors %}
                <div class="col-md-12" style="color: red">{{ err }}</div>
            {% endfor %}
            {{ form.csrf_token }}
            {{ form.submit }}
        </fieldset>
    </form>
</div>

BLOG_20181112_215427_86
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 目录 上一章 美好的半年学前班生活 第四章 初识彭飞 时光似水,岁月如梭。转眼间暑假即将过完,还有两天就开学了。 ...
    青梅梦语阅读 543评论 2 6
  • 读论语-45 原文(3-5): 子曰:“夷狄之有君,不如诸夏之亡也。” 译文: 夷狄这样文化落后的国家都有君主,而...
    建泉爱读书阅读 221评论 0 4
  • 【日精进打卡第130天】 【知~学习】 《六项精进》2遍 共172遍 《大学》2遍 共170遍 【经典名句分享】 ...
    哟哟切克闹come阅读 143评论 0 0
  • 清晨,箐箐躺在柔柔的云朵里,在梦空遨游。昨晚玩的太开心了,看着妈妈把手中的不织布变成了一个个颜色鲜艳的水果,忘记了...
    夜空中最亮的星Z阅读 400评论 0 1
  • ——减肥比治病便宜[微笑]对于体重超标的肥胖者而言,减肥不仅仅是为了好身材,更是为了健康!有人觉得花几百元减肥贵,...
    傻子林阅读 132评论 0 0