मुझे पता है कि यह प्रश्न पुराना है, लेकिन कुछ दिन पहले मैं एक ही चीज़ की तलाश में था इसलिए उम्मीद है कि यह भविष्य में किसी की मदद करेगा। । ।
the github repo for Flask-Principal पर शुरू करने के लिए एक अच्छी जगह है।
मुझे फ्लास्क-प्रिंसिपल (एफपी) के साथ भी कुछ परेशानी हुई है। यदि आप decorators, context-managers, और signals पर नए हैं तो आप शायद एफपी का उपयोग करने से पहले उन्हें थोड़ा सा शोध करना चाहेंगे।
फ्लास्क Blinker नामक पैकेज पर आधारित संकेतों को पंजीकृत करता है। यदि आपके पास ब्लिंकर नहीं है, तो फ्लास्क आपको सिग्नल घोषित करने की अनुमति देगा हालांकि वे कुछ भी नहीं करेंगे। मेरा मतलब यह देखने के लिए, फ्लास्क के signals.py के स्रोत में एक नज़र डालें।
तो यह एफपी के लिए क्यों मायने रखता है? खैर, यह पता चला है कि एफपी पहचान पंजीकृत करने और पहचानने के लिए सिग्नल का उपयोग करता है। विशेष रूप से:
identity_loaded
: जब इस संकेत कहा जाता है, हम उपयोगकर्ता के लिए एक पहचान वस्तु बनाने के लिए पता है। (यह बुलाया Principal._set_thread_identity()
के माध्यम से है)
identity_changed
: जब इस संकेत कहा जाता है, हम उपयोगकर्ता की पहचान अद्यतन करने के लिए पता है। (जब यह कहा जाता है कार्यान्वितPrincipal._on_identity_changed()
)
तो क्या मैं मतलब है बुलाया? सबसे पहले, हमें यह जानने की जरूरत है कि सिग्नल कैसे स्थापित किए जाते हैं। ब्लिंकर कार्यों को सिग्नल के लिए "सदस्यता लेने" की अनुमति देकर काम करता है। इसलिए, उदाहरण के लिए, Principal._on_identity_changed()
सिग्नल identity_changed
सिग्नल के लिए ग्राहक के रूप में स्थापित किया गया है। जब भी संकेत identity_changed
भेजा जाता है, _on_identity_changed() निष्पादित किया जाता है। कोड इस तरह दिखता है:
from blinker import signal
test = signal('test')
test.connect(func_we_want_to_execute_when_signal_is_called)
सिग्नल कहलाए जाने के सवाल पर वापस जाएं। ब्लिंकर में सिग्नल हैंडलर निष्पादित होते हैं जब हम सिग्नल ऑब्जेक्ट पर send()
पर कॉल करते हैं।इसलिए हमारे test
संकेत के लिए, वाक्य रचना बस है:
test.send()
जब test.send()
कहा जाता है func_we_want_to_execute_when_signal_is_called
निष्पादित करेंगे। उम्मीद है कि एफपी दस्तावेज में इस उदाहरण अब थोड़ा अधिक समझ में आता है:
def login_view(req):
username = req.form.get('username')
# Your authentication here.
# Notice our signal (identity_changed) is being called (identity_changed.send())
# What function is being called? Principal._on_identity_changed()
identity_changed.send(app, identity=Identity(username))
लेकिन हम संकेतों की स्थापना सरल बना सकते हैं अगर हम एक डेकोरेटर का उपयोग हमारे लिए यह करने के लिए। दोबारा दिखाओ कि मैंने अपना टेस्ट सिग्नल सेट अप किया है लेकिन इसे कनेक्ट नहीं किया है। हम कर सकते हैं:
@test.connect
def func_we_want_to_execute_when_signal_is_called():
return stuff
उपर्युक्त कोड अनिवार्य रूप से उस कार्य को सेट करता है जिसे हम निष्पादित करना चाहते हैं जब हम परीक्षण परीक्षण भेजते हैं। उम्मीद है कि अब एफपी प्रलेखन से निम्नलिखित कोड बनाता है भावना:
# We're setting up our signal (identity_loaded)
# to execute the function below (on_identity_loaded)
# when we call our signal (identity_loaded.send())
# which is called in Principal._set_thread_identity()
@identity_loaded.connect
def on_identity_loaded(sender, identity):
# Get the user information from the db
user = db.get(identity.name)
# Update the roles that a user can provide
for role in user.roles:
identity.provides.add(RoleNeed(role.name))
# Save the user somewhere so we only look it up once
identity.user = user
तो आप देख सकते संकेत वास्तव में पहचान प्रक्रिया ड्राइव कि। भूमिकाएं और अनुमतियां वास्तव में एक (आसान) विचारधारा हैं यदि आप किसी भी प्रकार के प्राधिकरण के लिए एक तरीका तलाश रहे हैं।
मेरे लिए, सिग्नल के चारों ओर अपने सिर को लपेटना सबसे कठिन हिस्सा था; मुझे आशा है कि यह किसी और के लिए भी सहायक होगा। लेकिन मैं वास्तव में आपको फ्लास्क-प्रिंसिपल के लिए ऊपर से जुड़े स्रोत कोड के माध्यम से पढ़ने के लिए प्रोत्साहित करता हूं; यह समझने का सबसे अच्छा तरीका होगा कि क्या हो रहा है।
क्या आप/के साथ जा रहा यहां सीखने को समाप्त पर कोई टिप्पणी अद्यतन @InnocentPixel? धन्यवाद! – Jeff
@ जेफ ऐसा लगता है कि किसी ने उत्तर के रूप में एक अच्छा छोटा ट्यूटोरियल पोस्ट किया है! – agf
यह भी है [यह] (https://github.com/saltycrane/flask-principal-example), अब भी कुछ साल पुराना है .... – bahmait