कुप्पी के व्यवस्थापक

दिन का अच्छा समय।

मैं एक परियोजना शुरू करना चाहता हूं, जो मैं हाल ही में काम कर रहा हूं: फ्लास्क-एडमिन । संक्षेप में, यह फ्लास्क ढांचे के लिए एक विस्तार है, जो आपको Django की शैली में एक प्रशासनिक इंटरफ़ेस बनाने की अनुमति देता है।

आर्किटेक्चर


मैं यह वर्णन करने की कोशिश करूंगा कि यह कैसे काम करता है और Django व्यवस्थापक पैनल से क्या अंतर है।

फ्लास्क-एडमिन का आधार ईंट एक ऐसा वर्ग है जिसमें दृश्य विधियाँ हैं। एक मूल कोड है जो ईंटों से एक व्यवस्थापक बनाता है और एक मेनू बनाता है। वह सब है।

यह दृष्टिकोण कैसे प्रभावी रूप से एक प्रशासनिक इंटरफ़ेस का निर्माण करता है?

उदाहरण के लिए, एक विशिष्ट कार्य - मॉडल के लिए CRUD लें।

आप इसे "माथे" कर सकते हैं - एक कोड लिखें जो इनपुट पर मॉडल की एक सूची लेगा, प्रत्येक को प्रदर्शित करने के लिए फॉर्म और प्लेटें बनाएं आदि। यह कोड अखंड होगा, एक विशिष्ट प्रकार के ओआरएम के साथ काम करेगा और सामान्य तौर पर इसका विस्तार करना मुश्किल होगा।

और आप एक वर्ग बना सकते हैं जो एक मॉडल के साथ काम कर सकता है। इस तरह के एक वर्ग का एक उदाहरण बनाकर और इसे व्यवस्थापक पैनल से जोड़ने के बाद, हमें इस मॉडल के लिए नियंत्रण इंटरफ़ेस मिलता है। बाकी मॉडलों के लिए दोहराएं और व्यवस्थापक पैनल लगभग तैयार है।

इसके अलावा, इस दृष्टिकोण के साथ, आप आसानी से कार्यक्षमता का विस्तार कर सकते हैं। बंदर के पेटिंग के बजाय, यह आवश्यक तरीकों को फिर से परिभाषित करने के लिए पर्याप्त है और, परिणामस्वरूप, हमें एक नया व्यवहार मिलता है।

यह Django से मुख्य अंतर है - विशिष्ट कार्यों के लिए व्यवस्थापक कार्यक्षमता को जल्दी और दर्द रहित रूप से विस्तारित करने या बदलने की क्षमता।

कुप्पी के व्यवस्थापक


फ्लास्क-एडमिन बॉक्स से बाहर क्या कर सकता है:
1. मेन्यू जनरेशन (दो लेवल तक) कनेक्टेड ब्रिक्स से अकाउंट एक्सेस रूल्स में
2. उपयोग किए गए प्राधिकरण प्रणाली के बारे में किसी भी धारणा के बिना पहुंच को नियंत्रित करने की क्षमता
3. अपनी खुद की "ईंटें" बनाने के लिए आधार कक्षाओं का एक सेट
3. SQLAlchemy मॉडल के लिए CRUD, जिसमें पेजिंग, सॉर्टिंग, फ़िल्टर, खोज और पसंद शामिल हैं।
4. फ़ाइल प्रबंधक
5. स्थानीयकरण। यह फ्लास्क-बैबेल के एक संशोधित संस्करण का उपयोग करके काम करता है, पैच को आर्मिन भेजा गया था, लेकिन अभी तक स्वीकार नहीं किया गया है। आप अस्थायी रूप से मेरी रिपॉजिटरी से संस्करण को स्थापित कर सकते हैं, यह PyPI से वर्तमान स्थिर के साथ संगत है।

क्लाइंट बूट ट्विटर बूटस्ट्रैप के शीर्ष पर चलता है। कारण बहुत सरल है - पर्याप्त उपस्थिति और जल्दी से यूआई बनाने के लिए यूआई का एक गुच्छा। एक तरह से या किसी अन्य, व्यवस्थापक पैनल आमतौर पर आम उपयोगकर्ताओं के लिए दुर्गम है, और बूटस्ट्रैप के साथ एक यूआई लिखना अभी भी इसके बिना अधिक सुविधाजनक है।

यहाँ इस उदाहरण के लिए मॉडल की एक सूची दी गई है:


और यहाँ अंतर्निहित फ़ाइल प्रबंधक है:


कोड के करीब


और इसलिए, आवेदन के लिए व्यवस्थापक पैनल को जोड़ने के लिए, आपको आवश्यकता है:
1. व्यवस्थापक वर्ग का एक उदाहरण बनाएँ
2. बेस व्यू वर्ग के उदाहरण जोड़ें (सभी "ईंटें" इससे विरासत में मिली हैं)

उदाहरण के लिए, दो मॉडल हैं: उपयोगकर्ता और पोस्ट, आपको एक व्यवस्थापक पैनल बनाने की आवश्यकता है। आरंभीकरण कोड इस तरह दिखेगा:
from flask.ext.admin import Admin from flask.ext.admin.contrib.sqlamodel import ModelView admin = Admin(app) admin.add_view(ModelView(User, db.session)) admin.add_view(ModelView(Post, db.session)) 

db.session एक कीमिया सत्र है

ModelView Django की छवि और समानता में फैलता है - वर्ग / उदाहरण के स्तर पर गुणों का एक सेट है जिसे बदला जा सकता है।

उदाहरण के लिए, यदि आपको पासवर्ड फ़ील्ड को उपयोगकर्ता मॉडल की सूची से बाहर करने की आवश्यकता है, तो यह करें:
 class MyUserAdmin(ModelView): excluded_list_columns = ('password',) admin = Admin(app) admin.add_view(MyUserAdmin(User, db.session)) 


पूर्वज को बुलाने से पहले कंस्ट्रक्टर में कुछ भी बदलने से रोकता है:
 class MyUserAdmin(ModelView): def __init__(self, session, name, excluded=None): if excluded: self.excluded_list_columns = excluded super(MyUserAdmin, self).__init__(User, session, name=name) admin = Admin(app) admin.add_view(MyUserAdmin(db.session, 'View1', ('password',)) admin.add_view(MyUserAdmin(db.session, 'View2', ('email','password')) 


यदि आप चाहते हैं, तो आप टेम्पलेट में एक और "दृश्य" और एक बटन जोड़ सकते हैं, जब क्लिक किया जाएगा तो यह प्रदर्शित होगा:
 from flask.ext.admin import expose class MyUserAdmin(ModelView): #     list_template = 'myproject/admin/userlist.html' @expose('/report/<int:id>/') def report(self, id): #   return self.render('myproject/admin/userreport.html', id=id) def __init__(self, session): super(MyUserAdmin, self).__init__(User, session) admin = Admin(app) admin.add_view(MyUserAdmin(db.session)) 


"सामान्य" लुक और फील पाने के लिए, आपको टेम्प्लेट में 'admin / master.html' से इनहेरिट करने की आवश्यकता है:
 {% extends 'admin/master.html' %} {% block body %} Hello World from MyView! {% endblock %} 

टेम्पलेट्स और दृश्य विधियों का व्यवहार पूरी तरह से फ्लास्क से मानक लोगों के अनुरूप है।

कार्यक्षमता विस्तार


कार्यक्षमता के विस्तार को दो भागों में विभाजित किया जा सकता है:
1. अंतर्निहित "बैटरी" के व्यवहार को बदलना
2. कुछ नया लिखना

बैटरी

वास्तुशिल्प रूप से, मचान मॉडल में दो परतें होती हैं:
1. डेटा तक पहुंच का स्तर। यहां एक विशिष्ट ओआरएम कार्यान्वयन के साथ बातचीत का तर्क निहित है - मॉडल आत्मनिरीक्षण से डेटा एक्सेस विधियों तक
2. यूआई का स्तर और बाकी तर्क

दोनों स्तरों (विरासत के माध्यम से) को मिलाकर, हमें एक विशिष्ट ओआरएम के लिए तैयार "बैटरी" मिलती है। हमें मोंगो-कीमिया का समर्थन करने, कहने की आवश्यकता है - हम तर्क लिखते हैं, आधार वर्ग से विरासत में, हमें मोगो के लिए सीआरयूडी मिलता है।

मॉडलव्यू स्वयं को वर्ग के गुणों (या उदाहरण के लिए, यदि निर्माता में निर्धारित किया गया है) के माध्यम से कॉन्फ़िगर कर सकता है। हालाँकि, यदि पर्याप्त रूप से तैयार कॉन्फ़िगरेशन विकल्प नहीं हैं, तो आप हमेशा इनहेरिट कर सकते हैं, आवश्यक तरीकों को फिर से परिभाषित कर सकते हैं और पूरी तरह से अलग व्यवहार प्राप्त कर सकते हैं।

फ़ाइल प्रबंधक इसी तरह काम करता है। उदाहरण के लिए, यदि आप उपयोगकर्ता माइक के लिए रिपोर्ट निर्देशिका तक पहुंच से इनकार करना चाहते हैं, तो आप कुछ इस तरह कर सकते हैं:
 class MyFileAdmin(FileAdmin): def is_accessible_path(self, path): if path.startswith('reports'): return user.login != 'mike' return True 


नई कार्यक्षमता

अब पूरी तरह से नई कार्यक्षमता जोड़ने के बारे में। इस तरह नया "ईंट" जोड़ा जाता है:
 from flask.ext.admin import Admin, BaseView, expose class MyView(BaseView): @expose('/') def index(self): return self.render('myproject/admin/index.html') admin = Admin(app) admin.add_view(MyView(name='Hello')) 


मेनू में एक आइटम दिखाई देता है और जब आप 'हैलो' आइटम खोलते हैं, तो इंडेक्स व्यू को ऊपर कहा जाता है। यह इस तरह दिखता है:


विचारों के बीच लिंक उत्पन्न करने के लिए, आप नाम के आरंभ में डॉट के साथ सामान्य url_for का उपयोग कर सकते हैं:

 from flask import url_for class MyView(BaseView): @expose('/') def index(self): url = url_for('.help') return self.render('myproject/admin/index.html', url=url) @expose('/help/') def help(self): return self.render('myproject/admin/help.html', id=id) 


आगे विकास फ्लास्क के तहत नियमित कोड लिखने से अलग नहीं है।

कुल मिलाकर


वर्तमान में, लाइब्रेरी API में कम या ज्यादा स्थिर है और कई परियोजनाओं में इसका सफलतापूर्वक उपयोग किया जाता है।

उदाहरण यहाँ हैं: github.com/mrjoes/flask-admin/tree/master/examples
यहां प्रलेखन: फ्लास्क-admin.readthedocs.org/en/latest

और, हमेशा की तरह, पैच का हमेशा स्वागत है।

Source: https://habr.com/ru/post/In148765/


All Articles