flask pymongo login
阿新 • • 發佈:2018-06-22
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