2

ユーザーとロールを含むmysqlテーブルがあり、ログインページがあります。できます。しかし、データベースからユーザーを検索する方法がわかりません。

1)これが私のユーザークラスとログインフォームです

class User(UserMixin):
    def __init__(self, email, password, org_role, user_role, id, active=True):
        self.email = email
        self.password = password
        self.org_role = org_role
        self.user_role = user_role
        self.id = id
        self.active = active
    def is_authenticated(self):
        return True
    def is_active(self):
        return True
    def is_anonymous(self):
        return False
    def get_id(self):
        return unicode(self.id)
    def __repr__(self):
        return '<User %r>' % (self.email)


@login_manager.user_loader
def load_user(id):
    return USERS.get(int(id))


@app.route("/login", methods=["GET", "POST"])
def login():
    form = LoginForm()
    if request.method == "POST" and form.validate():
        if form.email.data + form.password.data in USER_NAMES:
            remember = request.form.get("remember", "no") == "yes"
            if login_user(USER_NAMES[form.email.data + form.password.data], remember=remember):
                flash("Logged in!")
                return redirect(request.args.get("next") or url_for("index"))
            else:
                flash(u"Sorry, but you could not log in.")
        else:
            flash(u"Invalid email/password.")
    return render_template("login.html", title = 'Sign In', form = form)

2)これが私にはわからないことです。

私はこのコードを持っています:

USERS={}
for i,nn in enumerate(userlist):
    USERS[i+1]=User(nn['email'],nn['password'],nn['org_role'],nn['user_role'],int(nn['user_id']))
USER_NAMES = dict((u.email + u.password, u) for u in USERS.itervalues())

アプリケーションを起動すると、許可されているすべてのを入力するmysqlクエリがありますUSERS

私はflask-loginのドキュメントをたどろうとしましたが、データベースからユーザーを検索する例が示されていません。事前入力されたユーザーのリストからのみ。テーブル内のユーザーを更新すると、サーバーを再起動しない限り、そのユーザーは取得されません。

これは本当に意味がありません。mysqlデータベースからユーザーを検索し、それをUserクラスに追加する方法に関するガイダンスはすばらしいでしょう。

以下は、すべてのユーザーを取得するための私のコードです。

def getUsers():
    conn = MySQLdb.connect(host=db_host,user=db_username,passwd=db_password,db=db_database)
    cursor = conn.cursor()
    #query = """SELECT * from rtb_users WHERE email='%s' and password='%s'""" % (email,user_password)
    query = """SELECT * from rtb_users"""
    cursor.execute(query)

    userlist = []
    rows = cursor.fetchall()
    for row in rows:
        user_id = row[0]
        email = row[1]
        password = row[2]
        first_name = row[3]
        last_name = row[4]
        org_role = row[5]
        user_role = row[6]

        temp = {'user_id':user_id,'email':email,'password':password,'first_name':first_name,'last_name':last_name,'org_role':org_role,'user_role':user_role}
        userlist.append(temp)
    cursor.close()
    conn.close()
    return userlist
userlist = getUsers()
4

1 に答える 1

2

ユーザーをロードする必要があるたびに、データベースにアクセスするだけです。

@login_manager.user_loader
def load_user(id):
    return get_user(id)

def get_user(user_id):

    # TODO: Return None on ValueError
    user_id = int(user_id)

    conn = MySQLdb.connect(...etc...)
    cursor = conn.cursor()
    user = cursor.fetchone("SELECT * FROM rtb_users WHERE ID = %s", (user_id, ))

    conn.close()

    try:
        # A simpler way to map row names to row values in a dictionary
        user = dict(zip(cursor.description, user))
        user = User(user['email'],
                        user['password'],
                        user['org_role'],
                        user['user_role'],
                        int(user['user_id']))
    except MySQLdb.Error:
        user = None

    return user

最終的には、get_user(サーバーへの接続ごとにデータベース呼び出しを追加することを避けるために) 関数のキャッシュが必要になる可能性が高くなりますが、テストではこれでうまくいくはずです。

于 2012-08-07T02:20:51.777 に答える