Vím, že tato otázka je trochu starý, ale před pár dny jsem hledal stejnou věc, takže doufejme, že to pomůže někdo v budoucnu. , ,
Dobré místo pro start je na na GitHub repo pro láhev-Principal .
Měl jsem nějaké problémy s baňky-Principal (FP) taky. Pokud jste novým dekoratéry , kontextových manažerů a signály, budete pravděpodobně chtít, aby jim výzkum krátce před použitím FP.
Baňka registruje signály založené na balíčku s názvem Blinker . Pokud nemáte Blikač se Flask ještě umožní deklarovat signály, které však nebude dělat nic . Chcete-li zjistit, co mám na mysli, podívejte se na zdroje pro láhev je signals.py .
Tak proč tuto záležitost pro FP? No, to ukáže, že FP využívá signály registrovat a aktualizovat identitu. konkrétně:
identity_loaded
: Je-li tento signál nazývá víme vytvořit objekt identity uživatele. (Je to nazývají via Principal._set_thread_identity()
)
identity_changed
: Je-li tento signál nazývá víme aktualizovat identitu uživatele. (Když se to jmenuje ho spustí Principal._on_identity_changed()
)
Tak co mám na mysli volal ? Za prvé, musíme vědět, jak jsou signály nastavit. Blikač funguje tím, že funguje tak, že „přihlásit“ na signály. Tak, například, Principal._on_identity_changed()
je nastaven jako účastníka pro signál identity_changed
. Kdykoli je signál identity_changed
je poslán, _on_identity_changed () je vykonán. Tento kód vypadá takto:
from blinker import signal
test = signal('test')
test.connect(func_we_want_to_execute_when_signal_is_called)
Zpět k otázce, jak jsou signály nazývá. V blikač, signály manipulátory jsou prováděny, když říkáme send()
o objektu signálu. Takže pro nás test
signálem, syntaxe je právě:
test.send()
Když test.send()
se nazývá func_we_want_to_execute_when_signal_is_called
spustí. Doufejme, že tento příklad v dokumentaci FP dělá trochu větší smysl teď:
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))
Nicméně můžeme zjednodušit zakládání signály, pokud budeme používat malíř, aby to pro nás. Znovu předstírat, že jsem nastavit můj testovací signál, ale ještě není připojen ji. Můžeme udělat:
@test.connect
def func_we_want_to_execute_when_signal_is_called():
return stuff
Co se výše uvedený kód dělá, je v podstatě nastaví funkci, kterou chceme spustit, když je poslal náš testovací signál. Doufejme, že nyní následující kód z dokumentace FP dává smysl:
# 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
Takže můžete vidět, že signál skutečně řídit proces identity. Rolí a oprávnění jsou opravdu (jednodušší) nápad, pokud hledáte způsob, jak dělat povolení jakéhokoli druhu vás.
Pro mě, balení hlavu kolem signálů byla ta nejtěžší část; Doufám, že to bylo užitečné pro někoho jiného, také. Ale já bych opravdu doporučujeme pročíst zdrojového kódu jsem odkazovaných výše Baňka-Principal; je to asi bude nejlepší způsob, jak pochopit, co se děje.