1. 程式人生 > >flask pymongo login

flask pymongo login

ner bject ade class ast 真的 ssi style nag

突然覺得之前寫的好智障,還錯漏百出。好像有一個月了吧,我昨晚還在想一定要弄好它呢,結果就真的好了。

login最相關的就是flask_login裏的user_login(),裏面最主要的參數是User對象,我也不知道我的理解有沒有出錯,從pymongo裏的MongoClient獲取到的是一個字典,如果我們直接用這個字典就會報錯,說你的字典裏沒有is_active的attribute,這個問題的來源是我存放數據庫的方法?.new_user(),而這裏面並沒有包含is_active,但如果我們直接新建一個User(xxx)的,獲取到的就用這個屬性。為什麽我之前沒有發現這個提問呢?我也不知道,可能是我懶吧。最後我用的還是很笨的方法print(),但解決了總是好的。

def login_user(user, remember=False, duration=None, force=False, fresh=True):
   
    if not force and not user.is_active:
        return False

    user_id = getattr(user, current_app.login_manager.id_attribute)()
    session[‘user_id‘] = user_id
    session[‘_fresh‘] = fresh
    session[‘_id‘] = current_app.login_manager._session_identifier_generator()

    if remember:
        session[‘remember‘] = ‘set‘
        if duration is not None:
            try:
                # equal to timedelta.total_seconds() but works with Python 2.6
                session[‘remember_seconds‘] = (duration.microseconds +
                                               (duration.seconds +
                                                duration.days * 24 * 3600) *
                                               10**6) / 10.0**6
            except AttributeError:
                raise Exception(‘duration must be a datetime.timedelta, ‘
                                ‘instead got: {0}‘.format(duration))

    _request_ctx_stack.top.user = user
    user_logged_in.send(current_app._get_current_object(), user=_get_user())
    return True

  

#view.py
user = User(name=user.get(‘name‘),password=user.get(‘password‘),gender=user.get(‘gender‘),dotaId=user.get(‘dotaId‘))
login_user(user)  

  

@login_manager.user_loader
def load_user(user_id):
    print(‘user_id‘ + user_id)
    user = MongoClient().Doo.User.find_one({‘_id‘: ObjectId(user_id)})
    print(‘user...‘)
    print(user)
    # return Temp(name=user.get(‘name‘),password=user.get(‘password‘),gender=user.get(‘gender‘),steamId=user.get(‘steamId‘),
    #             last_since=user.get(‘last_since‘), member_since=user.get(‘member_since‘))  理論上來說用一個Temp來處理也是可以的
    if not user:
        return None  #如果沒有這個判斷,好像就會連首頁都進不了
    return User(name=user.get(‘name‘),password=user.get(‘password‘),gender=user.get(‘gender‘),dotaId=user.get(‘dotaId‘))

  

flask pymongo login