【百度云搜索恕稠,搜各種資料: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> {{ 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> {{ 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> {{ 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> {{ 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> {{ 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> {{ 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> {{ 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> {{ 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