为了账号安全,请及时绑定邮箱和手机立即绑定

13 -Flask构建弹幕微电影网站-后台逻辑(五)

2018.07.21 23:46 251浏览


项目源码地址:https://github.com/mtianyan/movie_project

收藏管理

  1. 模型: Moviecol

  2. 表单: 无

  3. 请求方法: GET

  4. 访问控制: @admin_login_req

插入我们的模拟数据

/*收藏*/insert into moviecol(movie_id,user_id,addtime) values(7,1,now());insert into moviecol(movie_id,user_id,addtime) values(7,2,now());insert into moviecol(movie_id,user_id,addtime) values(7,3,now());insert into moviecol(movie_id,user_id,addtime) values(7,4,now());insert into moviecol(movie_id,user_id,addtime) values(8,5,now());insert into moviecol(movie_id,user_id,addtime) values(8,6,now());insert into moviecol(movie_id,user_id,addtime) values(8,7,now());insert into moviecol(movie_id,user_id,addtime) values(8,8,now());

ALTER TABLE moviecol auto_increment=1;

利用关联查询完成电影收藏功能

views中编写收藏的功能实现

@admin_login_req@admin.route("/moviecol/list/<int:page>/", methods=["GET"])def moviecol_list(page=None):
    """
    电影收藏
    """
    if page is None:
        page = 1
    page_data = Moviecol.query.join(
        Movie
    ).join(
        User
    ).filter(
        Movie.id == Moviecol.movie_id,
        User.id == Moviecol.user_id
    ).order_by(
        Moviecol.addtime.desc()
    ).paginate(page=page, per_page=1)    return render_template("admin/moviecol_list.html", page_data=page_data)

为grid中跳转到movielist的url添加page参数

mark

mark

mark

mark

通过pagedata进行数据的填充,以及pg的引入和调用page方法实现分页

mark

mark

mark

mark

删除收藏

@admin.route("/moviecol/del/<int:id>/", methods=["GET"])@admin_login_reqdef moviecol_del(id=None):
    """
    收藏删除
    """
    # 因为删除当前页。假如是最后一页,这一页已经不见了。回不到。
    from_page = int(request.args.get('fp')) - 1
    # 此处考虑全删完了,没法前挪的情况,0被视为false
    if not from_page:
        from_page = 1
    moviecol = Moviecol.query.get_or_404(int(id))
    db.session.delete(moviecol)
    db.session.commit()
    flash("删除收藏成功!", "ok")    return redirect(url_for('admin.moviecol_list',page=from_page))

前往list中添加指向删除的url

mark

mark

添加删除的flash提示。

mark

mark

修改密码功能

  1. 模型:Admin

  2. 表单: PWdForm

  3. 请求方法: GET POST

  4. 访问控制: @admin_login_req

首先定义一个表单。

admin/forms.py:

class PwdForm(FlaskForm):
    old_pwd = PasswordField(
        label="旧密码",
        validators=[
            DataRequired("旧密码不能为空!")
        ],
        description="旧密码",
        render_kw={            "class": "form-control",            "placeholder": "请输入旧密码!",
        }
    )
    new_pwd = PasswordField(
        label="新密码",
        validators=[
            DataRequired("新密码不能为空!")
        ],
        description="新密码",
        render_kw={            "class": "form-control",            "placeholder": "请输入新密码!",
        }
    )
    submit = SubmitField(        '编辑',
        render_kw={            "class": "btn btn-primary",
        }
    )

在views中实例化该form并传递到模板中进行填充

@admin.route("/pwd/", methods=["GET", "POST"])@admin_login_reqdef pwd():
    """
    后台密码修改
    """
    form = PwdForm()    # 有下面这两句才有错误信息提示
    if form.validate_on_submit():
    data = form.data    return render_template("admin/pwd.html",form=form)

mark

mark

mark

mark

进行表单的验证

添加错误信息的展示。

mark

mark

此时错误信息不展示是因为我们的form没有设置post方式提交。图中new字段自己改为new字段的错误提示

mark

mark

实现验证旧密码

在forms中添加自定义的验证旧密码的验证方法

    def validate_old_pwd(self, field):
        from flask import session
        pwd = field.data
        name = session["admin"]
        admin = Admin.query.filter_by(
            name=name
        ).first()        if not admin.check_pwd(pwd):            raise ValidationError("旧密码错误!")

查询出与当前session中管理员账号相同的admin对象。调用该对象的check_pwd方法进行密码校验。

进行数据库中密码修改操作

    if form.validate_on_submit():
        data = form.data
        admin = Admin.query.filter_by(name=session["admin"]).first()        from werkzeug.security import generate_password_hash
        admin.pwd = generate_password_hash(data["new_pwd"])
        db.session.add(admin)
        db.session.commit()
        flash("修改密码成功,请重新登录!", "ok")        return redirect(url_for('admin.logout'))

为login中的密码错误添加err分类

mark

mark

login.html进行修改:

mark

mark

ok的消息颜色设为绿色

注意事项:

上面代码中的return是提前终止函数继续向下运行的语句。否则会造成跳不到logout的bug

修改右上个人中心信息

admin.html中修改所有的用户名地方为。

mark

mark

mark

mark

博主个人: 用户头像这里可以牵扯出一个知识点: g

登录以及首页视图添加全局变量对象g的属性logo

# admin = Admin.query.filter_by(name=session["admin"]).first()g.logo = "mtianyan.jpg"

注销时置空

g.logo = ""

因为目前我们的admin没有设置头像字段。所以如果以后添加可以使用上面方法。

  • 插播: 模板中可以通过set 方法设置一个值等于一个函数的返回值等

因为flask不能在花括号里面再进行花括号取值。所以放在session中的情况因为这个原因取不出来。所以如下图语句无法实现。

mark

mark

因此采用g不需要花括号取值,省一层括号。

mark

mark




点击查看更多内容
0人点赞

若觉得本文不错,就分享一下吧!

评论

相关文章推荐

正在加载中
意见反馈 去赚学费 帮助中心 APP下载
官方微信

举报

0/150
提交
取消