2012-08-22 9 views
53

मैं समझने की कोशिश कर रहा हूं कि Flask-Login कैसे काम करता है।फ्लास्क-लॉगिन: यह समझ में नहीं आता कि यह कैसे काम करता है

मैं उनके दस्तावेज़ में देखता हूं कि वे उपयोगकर्ताओं की एक पूर्व-जनसंख्या सूची का उपयोग करते हैं। मैं डेटाबेस-संग्रहीत उपयोगकर्ता सूची के साथ खेलना चाहता हूं।

हालांकि, मुझे इस Flask-Login मॉड्यूल में कुछ चीजें समझ में नहीं आ रही हैं।

@login_manager.user_loader 
def load_user(userid): 
    #print 'this is executed',userid 
    return user(userid, 'asdf') 

यह कोड हर अनुरोध पर कॉल किया जाएगा? इसका उपयोग मेरे उपयोगकर्ता ऑब्जेक्ट के सभी विवरण लोड करने के लिए किया जाता है?

अभी के लिए, मैं इस कोड है:

@app.route('/make-login') 
def make_login(): 
    username = 'asdf' 
    password = 'asdf' 
    user_data = authenticate(username, password) 
    user_obj = user(user_data[0], user_data[1]) 
    login_user(user_obj) 
    return render_template('make-login.html') 

जब मैं का उपयोग/मेकअप लॉगिन, मैं लॉग इन करना चाहते

मेरे उपयोगकर्ता वर्ग:।

class user(object): 
    def __init__(self, id, username, active=True): 
     self.username = username 
     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 5 

इसके अलावा, मैंने

def authenticate(username, password): 

    cursor = db.cursor() 
    password = md5.md5(password).hexdigest() 
    try: 
     query = "SELECT * FROM `users` WHERE `username` = %s AND `password` = %s" 
     cursor.execute(query, (username, password)) 
     results = cursor.fetchall() 
     #print results[0][0] 
     #print "here i am" 
     if not results: 
      return False 
     else: 
      user_data = [results[0][0], results[0][1]] 
      return user_data 
      #self.authenticated = True 
      #self.user_id = results[0][0] 
      #session['username'] = results['username'] 
      #print type(results) 
    except db.Error, e: 
     return 'There was a mysql error'  

def register(username, password, email, *args): 
    cursor = db.cursor() 
    password = md5.md5(password).hexdigest() 
    try: 
     #query = "INSERT INTO `users` (`username`, `password`, `email`) VALUES ('%s', '%s', '%s')" % (username, password, email) 
     query = "INSERT INTO `users` (`username`, `password`, `email`) VALUES (%s, %s, %s)" 
     cursor.execute(query, (username, password, email)) 
     db.commit() 
     return True 
    except db.Error, e: 
     print 'An error has been passed. %s' %e 
     db.rollback() 
     return False 
प्रमाणीकृत/पंजीकरण के लिए एक और दो कार्य लिखे

मुझे नहीं पता कि यह Flask-Login MySQL के साथ कैसे काम करें। साथ ही, मुझे नहीं पता कि उपयोगकर्ता लॉग-इन है या नहीं। मैं उपयोगकर्ता आईडी या उपयोगकर्ता नाम कैसे प्राप्त कर सकता हूं?

कोई भी मुझे कुछ पंक्तियों में समझा सकता है कि यह Flask-Login कैसे काम करता है?

उत्तर

49

बोतल: प्रवेश के वास्तव में एक उपयोगकर्ता बैकएंड नहीं है, यह सिर्फ आप के लिए लॉग इन और लॉगआउट उपयोगकर्ताओं की मदद करने सत्र मशीनरी संभालती है। आपको इसे (सजाने के तरीकों से) कहना है, जो उपयोगकर्ता का प्रतिनिधित्व करता है और यह भी पता लगाने के लिए है कि कोई उपयोगकर्ता "सक्रिय" है या नहीं (क्योंकि "सक्रिय" होने से विभिन्न अनुप्रयोगों में अलग-अलग चीजें हो सकती हैं)।

आपको documentation पढ़ना चाहिए और यह सुनिश्चित करना चाहिए कि यह क्या करता है और नहीं करता है। यहां मैं केवल डीबी बैकएंड के साथ तारों पर ध्यान केंद्रित करने जा रहा हूं।

प्रारंभ करने के लिए, उपयोगकर्ता ऑब्जेक्ट को परिभाषित करें; जो आपके उपयोगकर्ताओं के लिए गुणों का प्रतिनिधित्व करता है। यह ऑब्जेक्ट तब डेटाबेस, या एलडीएपी, या जो भी हो और यह हुक है जो आपके डेटाबेस बैकएंड के साथ लॉगिन तंत्र को जोड़ता है।

मैं इस उद्देश्य के लिए login example स्क्रिप्ट का उपयोग करूँगा।

class User(UserMixin): 
    def __init__(self, name, id, active=True): 
     self.name = name 
     self.id = id 
     self.active = active 

    def is_active(self): 
     # Here you should write whatever the code is 
     # that checks the database if your user is active 
     return self.active 

    def is_anonymous(self): 
     return False 

    def is_authenticated(self): 
     return True 

एक बार जब आप उपयोगकर्ता वस्तु बनाया है, तो आप एक विधि है कि उपयोगकर्ता (मूल रूप से, ऊपर से User वर्ग का एक उदाहरण बनाता है) लोड हो जाता है लिखने के लिए की जरूरत है। इस विधि को उपयोगकर्ता आईडी के साथ बुलाया जाता है।

@login_manager.user_loader 
def load_user(id): 
    # 1. Fetch against the database a user by `id` 
    # 2. Create a new object of `User` class and return it. 
    u = DBUsers.query.get(id) 
    return User(u.name,u.id,u.active) 

एक बार जब आप इन चरणों का है, अपनी प्रवेश विधि से करता है:

  1. जांच करें कि क्या उपयोगकर्ता नाम और पासवर्ड मैच (अपने डेटाबेस के खिलाफ) को देखने के लिए - आप इस कोड को अपने आप को लिखने के लिए की जरूरत है।

  2. तो प्रमाणीकरण सफल रहा था, उपयोगकर्ता का आईडी हो और यह login_user()

+12

+1 यह बहुत उपयोगी था --- मैं आधिकारिक फ्लास्क-लॉगिन दस्तावेज को काफी समझ नहीं पाया था। – Raj

+0

जो गलती आप लिंक करते हैं वह विशेष रूप से उपयोगी होती है यदि आप यह आवश्यक रूप से डेटाबेस बैकएंड सेट अप नहीं करना चाहते हैं तो https://gist.github.com/bkdinoop/6698956 – dino

+0

@ बुरहान खालिद, उदाहरण समारोह में, डीफ़ लॉगिन(): ... login_user (उपयोगकर्ता)। उपयोगकर्ता कहां से आता है? – chfw

0

यहां लॉगिन का उपयोग करने का एक फ्लास्क उदाहरण है: https://bitbucket.org/leafstorm/flask-login/src/3160dbfc7cfc/example/login-example.py आपको लॉगिन की आवश्यकता वाले प्रत्येक विधि के लिए @login_required का उपयोग करने की आवश्यकता है। उदाहरण के लिए,

@app.route('/make-login') 
@login_required 
def make_login(): 
    ... 
+0

मुझे पता है login_required क्या है, मुझे पता होना चाहिए कि user_loader के साथ क्या है। हालांकि, मुझे यह उदाहरण पता है, लेकिन वे डेटाबेस से उपयोगकर्ताओं का प्रबंधन नहीं करते हैं ... –

+3

और कम से कम मेरे लिए लिंक अस्वीकार कर दिया गया है। – volvox

10

बोतल -प्रवेश करने के लिए पारित कोशिश करते हैं और हर अनुरोध करने से पहले एक उपयोगकर्ता लोड होगा। तो हाँ, नीचे दिए गए आपके उदाहरण कोड को प्रत्येक अनुरोध से पहले बुलाया जाएगा। यह जांचने के लिए प्रयोग किया जाता है कि वर्तमान सत्र में उपयोगकर्ता आईडी क्या है और उस आईडी के लिए उपयोगकर्ता ऑब्जेक्ट लोड करेगा।

app.before_request(self._load_user) 

इसलिए हर अनुरोध से पहले, _load_user समारोह कहा जाता है:

@login_manager.user_loader 
def load_user(userid): 
    #print 'this is executed',userid 
    return user(userid, 'asdf')   

आप GitHub पर बोतल: प्रवेश के स्रोत कोड को देखो, तो वहाँ समारोह init_app के तहत एक लाइन जो चला जाता है। _load_user फ़ंक्शन वास्तव में स्थितियों के आधार पर एक और फ़ंक्शन "reload_user()" कहते हैं। और अंत में, reload_user() फ़ंक्शन आपके कॉलबैक फ़ंक्शन को कॉल करता है जिसे आपने लिखा था (load_user() आपके उदाहरण में)।

इसके अलावा, फ्लास्क-लॉगिन केवल उपयोगकर्ता को लॉग इन/लॉगआउट करने के लिए तंत्र प्रदान करता है। यदि आप mysql डेटाबेस का उपयोग कर रहे हैं तो यह परवाह नहीं है।

3

Flask-Login के दस्तावेज़ के अनुसार एक उपयोगकर्ता वस्तु वापस लौटा दी जानी चाहिए और यदि उपयोगकर्ता आईडी नहीं मिली है तो इसे अपवाद के बजाय कोई भी वापस नहीं करना चाहिए।

@login_manager.user_loader 
def load_user(userid): 
    try: 
     #: Flask Peewee used here to return the user object 
     return User.get(User.id==userid) 
    except User.DoesNotExist: 
     return None 
4

आप Flask-Security, जो डेटाबेस का उपयोग के लिए SQLAlchemy के साथ जोड़ती है कुप्पी के लॉगिन और उपयोगकर्ता रिकॉर्ड के पीछे के अंत से निपटने के ज्यादा स्वचालित उपयोग करने के लिए चाहते हो सकता है।

Quick Start ट्यूटोरियल आपको शुरू कर देगा। App.config ['SQLALCHEMY_DATABASE_URI'] को अपने MySQL डेटाबेस कनेक्शन स्ट्रिंग पर सेट करें।