1. 程式人生 > >flask登陸功能與權限

flask登陸功能與權限

action down 邏輯 self 技術分享 contact request eth ews

技術分享圖片

from datetime import datetime
from app import db


# 會員
class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True)  # 編號
    name = db.Column(db.String(100), unique=True)  # 昵稱
    pwd = db.Column(db.String(100))  # 密碼
    email = db.Column(db.String(100), unique=True)  # 郵箱
    phone = db.Column(db.String(11), unique=True)  # 手機號碼
    info = db.Column(db.Text)  # 個性簡介
    face = db.Column(db.String(255), unique=True)  # 頭像
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 註冊時間
    uuid = db.Column(db.String(255), unique=True)  # 唯一標誌符
    userlogs = db.relationship(‘Userlog‘, backref=‘user‘)  # 會員日誌外鍵關系關聯
    comments = db.relationship(‘Comment‘, backref=‘user‘)  # 評論外鍵關系關聯
    moviecols = db.relationship(‘Moviecol‘, backref=‘user‘)  # 收藏外鍵關系關聯

    def __repr__(self):
        return "<User %r>" % self.name

    # 檢查密碼匹配
    def check_pwd(self, pwd):
        from werkzeug.security import check_password_hash
        return check_password_hash(self.pwd, pwd)


# 會員登錄日誌
class Userlog(db.Model):
    __tablename__ = "userlog"
    id = db.Column(db.Integer, primary_key=True)  # 編號
    user_id = db.Column(db.Integer, db.ForeignKey(‘user.id‘))  # 所屬會員
    ip = db.Column(db.String(100))  # 登錄IP
    addtime = db.Column(db.DateTime, index=True, default=datetime.now)  # 登錄時間

    def __repr__(self):
        return "<Userlog %r>" % self.id

第一步: forms模板制作

class LoginForm(FlaskForm):
    name = StringField(
        label="昵稱(賬號)",
        description="昵稱(賬號)",
        validators=[
            DataRequired("請輸入昵稱(賬號)"),
        ],
        render_kw={
            "class": "form-control input-lg",
            "placeholder": "昵稱(賬號)",
        }
    )
    pwd = PasswordField(
        label="密碼",
        description="密碼",
        validators=[
            DataRequired("請輸入密碼"),
        ],
        render_kw={
            "class": "form-control input-lg",
            "placeholder": "密碼",
        }
    )

    submit = SubmitField(
        label="登錄",
        render_kw={
            "class": "btn btn-lg btn-success btn-block",
        }
    )
    # 最好在forms中驗證賬號
    def validate_name(self, field):
        name = field.data
        if User.query.filter_by(name=name).count() == 0:
            raise ValidationError("賬號不存在")

第二步:html模板的修改, 傳入form

     {% for msg in  get_flashed_messages(category_filter=["fail"]) %}
                    <div><span style="color: red">{{ msg }}</span></div>
                {% endfor %}
                <div class="panel-body">
                    <form role="form" method="post" action="{{ url_for(‘home.login‘) }}">
                        <fieldset>
                            <div class="form-group">
                                <label for="input_contact"><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" id="error_contact">{{ err }}</div>
                            {% endfor %}
                            <div class="form-group">
                                <label for="input_password"><span class="glyphicon glyphicon-lock"></span>&nbsp;{{ form.pwd.label }}</label>
                                {{ form.pwd }}
                            </div>
                             {% for err in form.pwd.errors %}
                            <div class="col-md-12" id="error_contact">{{ err }}</div>
                            {% endfor %}
                            {{ form.submit }}
                            {{ form.csrf_token }}
                        </fieldset>
                    </form>

第三步: views中邏輯編寫

from . import home
from flask import render_template, redirect, url_for, flash, session, request
from .forms import RegistForm, LoginForm
from werkzeug.security import generate_password_hash
from app.models import User, Userlog
from app import db
import uuid
from functools import wraps

# 權限裝飾器
def user_login_req(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if "user" not in session:
            return redirect(url_for(‘home.login‘, next=request.url))
        return f(*args, **kwargs)

    return decorated_function


@home.route("/login/", methods=["GET", "POST"])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        data = form.data
        user = User.query.filter_by(name=data.get("name")).first()
        if not user.check_pwd(data.get("pwd")):
            flash("密碼錯誤", "fail")
            return redirect(url_for(‘home.login‘))
        session[‘user‘] = user.name
        session[‘user_id‘] = user.id
        user_log = Userlog(
            user_id=user.id,
            ip=request.remote_addr,
        )
        db.session.add(user_log)
        db.session.commit()
        return redirect(url_for(‘home.user‘))
    return render_template("home/login.html", form=form)


@home.route("/logout/")
def logout():
    session.pop("user", None)
    session.pop("user_id", None)
    return redirect(url_for(‘home.login‘))

flask登陸功能與權限