在app/home/views.py
中:
# 导入home的蓝图对象
import os
from app import db, app
from app.home.forms import LoginForm, RegisterForm, EditUserForm, PwdForm
from app.home.utils import is_login, change_filename
from app.models import User, Comment, Userlog, MovieCollect, Movie, Preview
from . import home
from flask import render_template, flash, session, redirect, url_for, request
from werkzeug.security import generate_password_hash
@home.route('/')
@home.route('//')
def index(page=1):
page_movies = Movie.query.paginate(page, per_page=app.config['PER_PAGE'])
previews = Preview.query.all()
return render_template('home/index.html',
page_movies=page_movies,
app=app,
previews=previews)
# 注册页面
@home.route('/register/', methods=['POST', 'GET'])
def register():
form = RegisterForm()
if form.validate_on_submit():
# 1. 从前端获取用户输入的值
email = form.email.data
username = form.username.data
password = form.password.data
# 2. 判断用户是否已经存在? 如果返回位None, 说明可以注册
u = User.query.filter_by(name=username).first()
if u:
flash("用户%s已经存在" % (u.name))
return redirect(url_for('home.register'))
else:
u = User(name=username, email=email)
u.password = generate_password_hash(password) # 对于密码进行加密
db.session.add(u)
db.session.commit()
flash("注册用户%s成功" % (u.name))
return redirect(url_for('home.login'))
return render_template('home/register.html',
form=form)
@home.route('/login/', methods=['POST', 'GET'])
def login():
from app.models import User, Userlog
form = LoginForm()
if form.validate_on_submit():
username = form.username.data
password = form.password.data
user = User.query.filter_by(name=username).first()
if user and user.verify_password(password):
# session信息的保存
session['user_id'] = user.id
session['user'] = user.name
flash("用户%s登录成功" % (user.name))
remote_ip = request.remote_addr
# 将登录信息写到日志中;
userlog = Userlog(user_id=user.id,
ip=remote_ip,
area='xxx内网IP')
db.session.add(userlog)
db.session.commit()
# 从index蓝图里面寻找index函数;
return redirect(url_for('home.user'))
else:
flash("用户登录失败")
return redirect(url_for('home.login'))
return render_template('home/login.html',
form=form)
@home.route('/logout/')
@is_login
def logout():
session.pop('user_id', None)
session.pop('user', None)
return redirect(url_for('home.login'))
@home.route('/user/', methods=['GET', 'POST'])
@is_login
def user():
form = EditUserForm()
# 先在页面表单显示用户已经填写的信息
user = User.query.filter_by(name=session.get('user')).first()
form.username.data = user.name
form.email.data = user.email
form.phone.data = user.phone
if form.validate_on_submit():
# request.form - 获取表单填写的内容
username = request.form['username']
email = request.form['email']
phone = request.form['phone']
info = request.form['info']
# 1. 判断更改的用户名是否已经存在; --- 邮箱和电话自己判断, 此处省略
if username != user.name and User.query.filter_by(name=username).count():
flash("用户名%s已经存在" % (username))
return redirect(url_for('home.user'))
if User.query.filter_by(email=email).count() and email != user.email:
flash("邮箱%s已经注册" % (email))
return redirect(url_for('home.user'))
# 保存更改的信息到数据库中;(难点: 存储用户头像)
# *****存储用户的头像;
file_save_path = app.config['FC_DIR']
if not os.path.exists(file_save_path):
os.makedirs(file_save_path)
# 判断是否上传了新的头像;
if form.face.data:
# 判断之前是否已经有用户头像, 如果有, 则删除;
if user.face and os.path.exists(os.path.join(file_save_path, user.face)):
print(user.face)
os.remove(os.path.join(file_save_path, user.face)) # 删除旧头像
# 保存新的头像, 获取用户头像文件的文件名
face_name = form.face.data.filename
face_name = change_filename(face_name)
print(face_name)
# 保存新的头像文件
form.face.data.save(os.path.join(file_save_path, face_name))
user.face = face_name
user.name = username
user.email = email
user.phone = phone
user.info = info
db.session.add(user)
db.session.commit()
flash("修改会员信息成功")
# ******修改用户信息, 如果修改的是用户名, 一定要登录出, 再重新登录。
logout()
return redirect(url_for('home.login'))
return render_template('home/user.html',
form=form)
# 修改密码
@home.route('/pwd/', methods=['GET', 'POST'])
def pwd():
form = PwdForm()
if form.validate_on_submit():
# 获取当前登录用户的密码
user = User.query.filter_by(name=session.get('user')).first()
print(session.get('name'))
# 判断用户的旧密码是否正确
if user.verify_password(form.old_pwd.data):
# ********数据库里面的是password
user.password = generate_password_hash(form.new_pwd.data)
db.session.add(user)
db.session.commit()
flash("密码更新成功")
else:
flash("旧密码错误, 请重新输入")
return redirect(url_for('home.pwd'))
return render_template('home/pwd.html', form=form)
@home.route('/comments/')
@home.route('/comments//')
def comments(page=1):
commentsPageObj = Comment.query.filter_by(user_id=session.get('user_id')
).paginate(page, per_page=app.config['PER_PAGE'])
return render_template('home/comments.html',
commentsPageObj=commentsPageObj)
# 记录用户登录日志
@home.route('/userlog/')
@home.route('/userlog//')
def userlog(page=1):
userlogsPageObj = Userlog.query.filter_by(user_id=session.get('user_id')
).paginate(page, per_page=app.config['PER_PAGE'])
return render_template('home/userlog.html',
userlogsPageObj=userlogsPageObj)
@home.route('/moviecollect/')
@home.route('/moviecollect//')
def moviecollect(page=1):
moviecollectsPageObj = MovieCollect.query.filter_by(user_id=session.get('user_id')
).paginate(page, per_page=app.config['PER_PAGE'])
return render_template('home/moviecollect.html',
moviecollectsPageObj=moviecollectsPageObj
)
@home.route('/play/')
def play(id):
return render_template('home/play.html')
在app/home/utils.py
中:
这一部分主要编写重复使用的函数和装饰器。
from functools import wraps
from flask import session, flash, redirect, url_for
def is_login(f):
"""用来判断用户是否登录成功"""
@wraps(f)
def wrapper(*args, **kwargs):
# 判断session对象中是否有seesion['user']
# 如果包含信息, 则登录成功, 可以访问主页
# 如果不包含信息, 则未登录成功, 跳转到登录界面
if session.get('user', None):
return f(*args, **kwargs)
else:
flash("用户必须登录才能访问%s" % (f.__name__))
return redirect(url_for('home.login'))
return wrapper
def change_filename(filename):
"""在原有文件的基础上添加时间标签"""
from datetime import datetime
return datetime.now().strftime('%Y%m%d_%H%M%S') + filename
根据views.py
中所需要的html文件在app/templates/home
中编写所相对应的html文件。
并在app/static
中导入相应的css、js、font文件。