美文网首页
Flask构建微电影视频网站(六):后台管理模块

Flask构建微电影视频网站(六):后台管理模块

作者: kevin_lln | 来源:发表于2018-09-27 14:19 被阅读0次

    1.管理员登录

    步骤:

    • app/__ init __.py中创建db对象
    • app/models.py中导入db对象
    • app/admin/forms.py中定义表单验证
    • app/templates/admin/login.html中使用表单字段、信息验证、消息闪现
    • app/admin/views.py中出来登录请求、保存会话
    • app/admin/views.py定义登录装饰器、访问控制

    实际操作:

    1.app/admin/forms.py中定义登录表单验证

    # 安装Flask-WTF模块
    # app/admin/forms.py
    from flask_wtf import FlaskForm  
    from wtforms import StringField, PasswordField, SubmitField
    from wtforms.validators import DataRequired
    
    
    
    class LoginForm(FlaskForm):
        """管理员登录表单"""
        account = StringField(
            label="账号",  # 字段名称
            # 账号不能为空
            validators=[
                DataRequired("请输入账号!")
            ],
            # 描述
            description="账号",
            # 附加选项,前端页面上除了name和type,其它属性都要加上
            render_kw={
                "class": "form-control",
                "placeholder": "请输入账号",
                # "required": "required",
            }
        )
        
        pwd = PasswordField(
            label="密码",
            validators=[
                DataRequired("请输入密码!")
            ],
            description="密码",
            render_kw={
                "class": "form-control",
                "placeholder": "请输入密码",
                # "required": "required",
            }
        )
        
        submit = SubmitField(
            '登录',
            render_kw = {
                "class": "btn btn-primary btn-block btn-flat",
            }
        )
    

    2.替换html页面上的表单

    # app/admin/views.py
    @admin.route('/login')
    def login():
        login_form = LoginForm()
        return render_template('admin/login.html', form=login_form)
    
    # app/templates/admin/login.html
    {{ form.account }} 替换 <input name="user" type="text" class="form-control" placeholder="请输入账号!">
        {{ from.pwd }} 替换<input name="pwd" type="password" class="form-control" placeholder="请输入密码!">
     {{ form.submit }} 替换<a id="btn-sub" type="submit" class="btn btn-primary btn-block btn-flat">登录</a>
     在{{ form.submit }}下面加个{{ form.csrf_token }}
    
    # app/__init__.py
    <!--令牌 -->
    <!-->>> import uuid-->
    <!-->>> uuid.uuid4().hex-->
    <!--'ec0eba98fb9d472b95ce240b7ee8f4e2'-->
    app.config['SECRET_KEY'] = 'ec0eba98fb9d472b95ce240b7ee8f4e2'
    

    3.页面错误信息显示

    # app/admin/views.py
    @admin.route('/login', methods=["GET", "POST"])
    def login():
        login_form = LoginForm()
        # 提交时验证
        if login_form .validate_on_submit():
            # 获取表单数据
            data = login_form .data
            
        return render_template('admin/login.html', form=login_form)
    
    <!-- 页面显示错误信息 -->
    <!--app/templates/admin/login.html-->
    {% for err in form.account.errors %}
    <div class="col-md-12" id="input_user">
        <font style="color:red">{{ err }}</font>
    </div>
    {% endfor %}
    
    
    {% for err in form.pwd.errors %}
    <div class="col-md-12" id="input_user">
        <font style="color:red">{{ err }}</font>
    </div>
    {% endfor %}
    
    <!-- form表单不需要action -->
    

    4.校验账号和密码

    # app/admin/forms.py
    from app.models import Admin
    from wtforms.validators import ValidationError
    # validate_字段名称
    def validate_account(self, field):
        account = field.data
        # 统计admin条数
        admin = Admin.query.filter_by(name=account).count()
        # 判断是否有条数
        if admin == 0:
            raise ValidationError("账号不存在")
    
    # app/admin/models.py
    # 检测密码
    def check_password(self, pwd):
        from werkzeug.security import check_password_hash
        return check_password_hash(self.pwd, pwd)
    

    5.前端页面上显示登录错误信息,flash闪出

    <!--app/admin/views.py-->
    from app.models import Admin
    from flask import flash, session, request
    @admin.route('/login', methods=["GET", "POST"])
    def login():
        login_form = LoginForm()
        # 提交时验证
        if login_form.validate_on_submit():
            # 获取表单数据
            data = form.data
            admin = Admin.query.filter_by(name=data["account"]).first()
            # 密码不正确
            if not admin.check_pwd(data["pwd"]):
                flash("密码错误!")
                return redirect(url_for("admin.login"))
            # 密码正确
            session["admin"] = data["account"]
            return redirect(request.args.get("next") or url_for("admin.index"))
        return render_template('admin/login.html', form=login_form)
    
    <!--app/templates/admin/login.html-->
    {% for msg in get_flashed_messages() %}
    <p class="login-box-msg" style="color:red;">{{ msg }}</p>
    {% endfor %}
    

    6.退出系统

    <!--app/admin/views.py-->
     @admin.route("/logout")
     def logout():
        session.pop("account", None)
        return redirect(url_for("admin.login")
    

    7.装饰器限制访问

    <!--app/admin/views.py-->
    from functools import wraps
    
    def admin_login_req(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
              if not session['admin'] is None:
                    return redirect(url_for("admin.login", next=request.url))
              return f(*args, **kwargs)
        return decorated_function
    # 装饰器写完之后,在后台的每个函数都要加上这个装饰器
    

    8.依然能登录,解决bug

    <!--app/admin/views.py-->
    from funtools import wraps
    
    def admin_login_req(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
              if "admin" not in session:
                    return redirect(url_for("admin.login", next=request.url))
              return f(*args, **kwargs)
        return decorated_function
    

    这样管理员的登录就完成了

    相关文章

      网友评论

          本文标题:Flask构建微电影视频网站(六):后台管理模块

          本文链接:https://www.haomeiwen.com/subject/izhtnftx.html