2017-11-15 118 views
10

Flask-Security tarafından sağlanan örnek kodu kullanarak, login_user.html formuna normal olarak /login yolundan erişebilir ve bu da gayet iyi çalışıyor. Ancak, giriş formunu sitemin tüm sayfalarına sol üst köşeye gömmek istiyorum. Formu base.html'a yerleştirmek için bir Jinja {% include "security/login_user.html" %} deyimini kullanabileceğimi düşündüm, ancak bu işe yaramıyor.Sayfamda Flask-Güvenlik giriş formunu nasıl yerleştirebilirim?

jinja2.exceptions.UndefinedError: 'login_user_form' is undefined 

dahil etmek için bir yolu var mı ya da başka şablonu içinde giriş formunu gömmek ve hala ilgili form nesnesine erişebilirsiniz: aşağıdaki hatayı alıyorum?

cevap

1

Kişisel yığın izleme okur: jinja2.exceptions.UndefinedError: 'login_user_form' is undefined

Bu hata mesajı login_user_form tanımsız olduğunu söylüyor Jinja, geliyor. Bu senin base.html olsaydı

... 
{% block content %} 
<form action="" method="post" name="post"> 
    {{form.hidden_tag()}} 
... 

size işlemek şablona bir bağlam değişken olarak login_user_form geçmek ettik, bu çözmek için. Yani, /login rotada, böyle bir şey dönmelidir:

return render_template("base.html", 
     title = 'Home', 
     form = login_user_form) 
+2

Bu açık bir yanıttır, ancak bu durumda çok yardımcı olmuyor. Her görünüm için bu formu manuel olarak oluşturup iletmelerini istiyorsunuz. Formu nereden alacağınızı göstermiyorsunuz (Flask-Güvenlik'ten). Ve bu şablonun gerektirdiği formun yanında başka bir bağlam var. Bunu “context_processor” ile enjekte etseniz bile, asıl sorunu hala özlüyor olsanız da bu, 'login_user.html' tam sayfa şablonudır, her sayfada küçük bir form enjekte etmek için uygun değildir. – davidism

10

security/login_user.html giriş formu için tam sayfa şablondur. Bu, her sayfaya gömmek istediğiniz şey değil, çünkü yanıp sönen mesajlar, hatalar ve düzen gibi diğer şeylerle uğraşır.

Yalnızca formu oluşturmak için kendi şablonunuzu yazın ve numarasını ekleyin veya temel şablonunuza ekleyin.

<form action="{{ url_for_security('login') }}" method="POST"> 
    {{ login_user_form.hidden_tag() }} 
    {{ login_user_form.email(placeholder='Email') }} 
    {{ login_user_form.password(placeholder='Password') }} 
    {{ login_user_form.remember.label }} {{ login_user_form.remember }} 
    {{ login_user_form.submit }} 
</form> 

(Bu, bu uygulamanın sayfaya sığacak şekilde stili isteyeceksiniz. Sadece bir örnektir) öylesine login_form ve url_for_security değiller, doğrudan giriş formu ile ilgileneceğiz görünümlerinizin

Yok Çoğu şablonu görüntülerken kullanılabilir (bu, izlediğiniz orijinal soruna neden oluyordu). Her istek için app.context_processor kullanarak enjekte edin.

from flask_security import LoginForm, url_for_security 

@app.context_processor 
def login_context(): 
    return { 
     'url_for_security': url_for_security, 
     'login_user_form': LoginForm(), 
    } 
+0

Teşekkürler @davidism. Context_processor kullanımı, bu değişkenleri _all_ şablonlarında kullanılabilir yapar mı? –

+0

Varsayılan olarak, oluşturulmuş, genişletilmiş ve dahil edilmiş şablonlar kullanılabilir. – davidism