2017-11-15 18 views
10

फ्लास्क-सिक्योरिटी द्वारा प्रदान किए गए उदाहरण कोड का उपयोग करके, मैं सामान्य रूप से /login रूट से login_user.html फ़ॉर्म तक पहुंच सकता हूं और यह ठीक काम करता है। हालांकि, मैं ऊपरी बाईं ओर अपनी सभी साइट के पृष्ठों पर लॉगिन फॉर्म एम्बेड करना चाहता हूं। मैंने सोचा कि मैं base.html में फॉर्म रखने के लिए जिन्जा {% include "security/login_user.html" %} कथन का उपयोग कर सकता हूं, लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है। यामैं अपने पृष्ठ पर एक फ्लास्क-सुरक्षा लॉगिन फॉर्म कैसे एम्बेड करूं?

jinja2.exceptions.UndefinedError: 'login_user_form' is undefined 

वहाँ एक रास्ता शामिल करने के लिए है एक और टेम्पलेट के अंदर लॉगिन फ़ॉर्म एम्बेड और अभी भी संबंधित प्रपत्र वस्तु तक पहुँच प्राप्त: मैं निम्नलिखित त्रुटि मिलती है?

उत्तर

1

आपका स्टैक ट्रेस पढ़ता है: jinja2.exceptions.UndefinedError: 'login_user_form' is undefined

यह त्रुटि संदेश जिंजा है, जो कह रही है कि login_user_form अपरिभाषित है से आ रही है।

इस का समाधान करने के लिए, अगर यह आपके base.html था,

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

आप login_user_form अपने प्रस्तुत करना टेम्पलेट के लिए एक संदर्भ चर के रूप में पारित करने के लिए है। तो, अपने /login मार्ग में, आप कुछ इस तरह वापसी करना चाहिए:

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

यह स्पष्ट उत्तर है, लेकिन यह इस मामले में बहुत उपयोगी नहीं है। आप उन्हें प्रत्येक दृश्य के लिए मैन्युअल रूप से उस फॉर्म को बनाने और पास करने के लिए कह रहे हैं। आप यह नहीं दिखाते कि फॉर्म कहां प्राप्त करें (यह फ्लास्क-सुरक्षा से है)। और उस फ़ॉर्म के अलावा अन्य संदर्भ भी है कि उस टेम्पलेट की आवश्यकता है। भले ही आपने 'context_processor' के साथ इंजेक्शन दिया हो, फिर भी वह वास्तविक समस्या को याद करता है, जो कि' login_user.html' एक पूर्ण पृष्ठ टेम्पलेट है, प्रत्येक पृष्ठ पर एक छोटे से फॉर्म को इंजेक्ट करने के लिए उचित नहीं है। – davidism

10

security/login_user.html लॉगिन फार्म के लिए पूरे पृष्ठ का टेम्पलेट है। ऐसा नहीं है कि आप प्रत्येक पृष्ठ पर एम्बेड करना चाहते हैं क्योंकि यह फ्लैश किए गए संदेशों, त्रुटियों और लेआउट जैसी अन्य चीज़ों से संबंधित है।

केवल फॉर्म प्रस्तुत करने के लिए अपना खुद का टेम्प्लेट लिखें और , या इसे अपने बेस टेम्पलेट में जोड़ें।

<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> 

(यह, आप इसे अपने पेज फिट करने के लिए शैली करना चाहते हैं। सिर्फ एक उदाहरण है) अपने विचारों का

कोई भी सीधे लॉगिन प्रपत्र के साथ सौदा होगा, इसलिए login_form और url_for_security नहीं कर रहे अधिकांश टेम्पलेट्स को प्रस्तुत करते समय उपलब्ध नहीं है (यह आपके द्वारा देखी गई मूल समस्या का कारण बन रहा था)। app.context_processor का उपयोग करके प्रत्येक अनुरोध के लिए उन्हें इंजेक्ट करें।

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

धन्यवाद @ डेविडिज्म। क्या 'context_processor' का उपयोग _all_ टेम्पलेट्स में उपलब्ध चर को बनाएगा? –

+0

यह डिफ़ॉल्ट रूप से प्रस्तुत, विस्तारित और टेम्पलेट्स को शामिल करने के लिए उपलब्ध होगा। – davidism

संबंधित मुद्दे