25、Flask構(gòu)建彈幕微電影網(wǎng)站-會(huì)員中心登錄要求麦锯,會(huì)員資料和密碼修改

百度云搜索恕稠,搜各種資料:http://www.81ad.cn

Flask 構(gòu)建微電影視頻網(wǎng)站

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

會(huì)員登錄裝飾器

在home.views.py中創(chuàng)建登錄裝飾器

from functools import wraps

# 要求登錄才能訪問(wèn)
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

會(huì)員資料修改

創(chuàng)建會(huì)員資料表單

class UserDetailForm(FlaskForm):
    name = StringField(
        label='昵稱(chēng)',
        validators=[
            DataRequired('請(qǐng)輸入昵稱(chēng)谱俭!')
        ],
        description='昵稱(chēng)',
        render_kw={
            'class': "form-control",
            'placeholder': "請(qǐng)輸入昵稱(chēng)",
            'required': "required",
            'autofocus': "autofocus"
        }
    )
    email = StringField(
        label='郵箱',
        validators=[
            DataRequired('請(qǐng)輸入郵箱!'),
            Email('郵箱格式不正確')
        ],
        description='郵箱',
        render_kw={
            'class': "form-control",
            'placeholder': "請(qǐng)輸入郵箱",
            'required': "required",
            'autofocus': "autofocus"
        }
    )
    phone = StringField(
        label='手機(jī)',
        validators=[
            DataRequired('請(qǐng)輸入手機(jī)宵蛀!'),
            Regexp('^1[3|4|5|6|7|8][0-9]\d{4,8}$', message='手機(jī)格式不正確')
        ],
        description='手機(jī)',
        render_kw={
            'class': "form-control",
            'placeholder': "請(qǐng)輸入手機(jī)",
            'required': "required",
            'autofocus': "autofocus"
        }
    )
    face = FileField(
        label='頭像',
        validators=[
            DataRequired('請(qǐng)上傳頭像')
        ],
        description='頭像',
    )
    info = TextAreaField(
        label='簡(jiǎn)介',
        validators=[
            DataRequired('請(qǐng)輸入簡(jiǎn)介昆著!')
        ],
        description='簡(jiǎn)介',
        render_kw={
            'class': "form-control",
            'rows': "10",
        }
    )
    submit = SubmitField(
        label='保存',
        render_kw={
            'class': "btn btn-success"
        }
    )

修改user會(huì)員資料視圖

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)  # 如果文件保存路徑不存在,則創(chuàng)建一個(gè)多級(jí)目錄
            import stat
            os.chmod(face_save_path, stat.S_IRWXU)  # 授予可讀寫(xiě)權(quán)限

        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))
            # 獲取上傳文件名稱(chēng)
            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('昵稱(chēng)已經(jīng)存在', '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('郵箱已經(jīng)存在', '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('手機(jī)號(hào)已經(jīng)存在', '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會(huì)員資料模板

<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

會(huì)員密碼修改

創(chuàng)建會(huì)員密碼修改表單

class PwdForm(FlaskForm):
    oldpwd = PasswordField(
        label='舊密碼',
        validators=[
            DataRequired('請(qǐng)輸入舊密碼凑懂!')
        ],
        description='舊密碼',
        render_kw={
            'class': "form-control",
            'placeholder': "請(qǐng)輸入舊密碼",
            'required': "required",
            'autofocus': 'autofocus'
        }
    )
    newpwd = PasswordField(
        label='新密碼',
        validators=[
            DataRequired('請(qǐng)輸入新密碼!')
        ],
        description='新密碼',
        render_kw={
            'class': "form-control",
            'placeholder': "請(qǐng)輸入新密碼",
            'required': "required",
            'autofocus': 'autofocus'
        }
    )
    repwd = PasswordField(
        label='重復(fù)密碼',
        validators=[
            DataRequired('請(qǐng)輸入重復(fù)密碼梧宫!'),
            EqualTo('newpwd', message='兩次密碼不一致')
        ],
        description='重復(fù)密碼',
        render_kw={
            'class': "form-control",
            'placeholder': "請(qǐng)輸入重復(fù)密碼",
            '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('密碼修改成功接谨,請(qǐng)重新登錄', 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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市塘匣,隨后出現(xiàn)的幾起案子脓豪,更是在濱河造成了極大的恐慌,老刑警劉巖忌卤,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扫夜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡驰徊,警方通過(guò)查閱死者的電腦和手機(jī)笤闯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)棍厂,“玉大人颗味,你說(shuō)我怎么就攤上這事∥” “怎么了浦马?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵时呀,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我捐韩,道長(zhǎng)退唠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任荤胁,我火速辦了婚禮,結(jié)果婚禮上屎债,老公的妹妹穿的比我還像新娘仅政。我一直安慰自己,他們只是感情好盆驹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布圆丹。 她就那樣靜靜地躺著,像睡著了一般躯喇。 火紅的嫁衣襯著肌膚如雪辫封。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天廉丽,我揣著相機(jī)與錄音倦微,去河邊找鬼。 笑死正压,一個(gè)胖子當(dāng)著我的面吹牛欣福,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播焦履,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拓劝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了嘉裤?” 一聲冷哼從身側(cè)響起郑临,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屑宠,沒(méi)想到半個(gè)月后厢洞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侨把,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年犀变,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秋柄。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡获枝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骇笔,到底是詐尸還是另有隱情省店,我是刑警寧澤嚣崭,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站懦傍,受9級(jí)特大地震影響雹舀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜粗俱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一说榆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寸认,春花似錦签财、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至灸叼,卻和暖如春神汹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背古今。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工屁魏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沧卢。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓蚁堤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親但狭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子披诗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 目錄 上一章 美好的半年學(xué)前班生活 第四章 初識(shí)彭飛 時(shí)光似水,歲月如梭立磁。轉(zhuǎn)眼間暑假即將過(guò)完呈队,還有兩天就開(kāi)學(xué)了。 ...
    青梅夢(mèng)語(yǔ)閱讀 546評(píng)論 2 6
  • 讀論語(yǔ)-45 原文(3-5): 子曰:“夷狄之有君唱歧,不如諸夏之亡也宪摧。” 譯文: 夷狄這樣文化落后的國(guó)家都有君主颅崩,而...
    建泉愛(ài)讀書(shū)閱讀 224評(píng)論 0 4
  • 【日精進(jìn)打卡第130天】 【知~學(xué)習(xí)】 《六項(xiàng)精進(jìn)》2遍 共172遍 《大學(xué)》2遍 共170遍 【經(jīng)典名句分享】 ...
    喲喲切克鬧come閱讀 146評(píng)論 0 0
  • 清晨几于,箐箐躺在柔柔的云朵里,在夢(mèng)空遨游沿后。昨晚玩的太開(kāi)心了沿彭,看著媽媽把手中的不織布變成了一個(gè)個(gè)顏色鮮艷的水果,忘記了...
    夜空中最亮的星Z閱讀 411評(píng)論 0 1
  • ——減肥比治病便宜[微笑]對(duì)于體重超標(biāo)的肥胖者而言尖滚,減肥不僅僅是為了好身材喉刘,更是為了健康瞧柔!有人覺(jué)得花幾百元減肥貴,...
    傻子林閱讀 136評(píng)論 0 0