عرض واحد (FrontPage) للعديد من وحدات التحكم (وجهات النظر الفرعية)

StackOverflow https://stackoverflow.com/questions/574140

سؤال

ملاحظات: لا يمكن استخدام جافا سكريبت أو iframes. في الواقع، لا يمكنني الوثوق بالمتصفح العميل بالقيام بأي شيء ولكن الأساسيات الترا.

أنا أعيد بناء تطبيق Legacy PHP4 كتطبيق MVC، مع وجود معظم أبحاثي حاليا مع إطار الصرز.

تتميز إحدى المشكلات الغريبة الأولى التي قمت بتشغيلها وواحد قمت بحلها في الماضي باستخدام IFRAMES أو الأفضل بعد أن تقوم JavaScript بإظهار مجموعة ديناميكية من "الحاجيات" التي تشبه آراء هضم لعرض فهرس وحدة تحكم نموذجي.

أفضل طريقة لتصور مشكلتي ستكون في البحث عن الصفحة الرئيسية الشخصية لجوجل. يحلون المشكلة مع JavaScript، ولكن بالنسبة لسيناريو JavaScript وأي شيء أكبر بكثير فوق XHTML الأساسية غير ممكن.

كانت إحدى الأفكار التي بدأت فيها العمل في استدعاء وحدة قاعدة بيانات أو خدمة أخرى للحاجيات المنشط حاليا، ثم أخذ قائمة من TUPLES / DICTS، فسرعة ديناميكيا كل وحدة تحكم وبناء قائمة / تمويها من وجهات النظر الفرعية ذلك إلى عرض FrontPage ودعه معرفة الأشياء.

لذلك مع رمز بيودو:

Get request goes to WSGI
WSGI calls pylons
Pylons routes to Frontpage.index()
Frontpage.index() 
   myViews = list()
   for WidgetController in ActiveWidegets():
        myViews.append(subRender(WidgetController, widgetView))

c.subviews = myViews
render(frontpage.mako)

بت غريبة عن الفرعية

  • واردات تحكم ديناميكيا عبر __import__ (حاليا صلب لاسم مساحة المشروع :()
  • لديه القدرة على أن تكون باهظة الثمن جدا (يمكن تخزين معظم مكالمات القطعة المخزنة، ولكن واحد هو لوحة مستخدم)

أشعر أنني يجب أن يكون هناك طريقة أفضل أو ربما يتم تنفيذ آلية تم تنفيذها بالفعل في WSGI أو أفضل من الألبيات للقيام بذلك، ولكن حتى الآن الأقرب الذي وجدته هو طريقة الأداة المساعدة هذه: http://www.pylonshq.com/docs/en/0.9.7/modules/controllers_util/# pylons.controllers.util.portward. ولكن يبدو مجنون قليلا للبناء N مثيلات الأبراج على رأس الأبراج فقط للحصول على إطلالات على جمع.

هل كانت مفيدة؟

المحلول

بينما في معظم الحالات، أوصي بما ذكرته في الأصل، باستخدام JavaScript لتحميل كل عنصر واجهة مستخدم، نظرا لأن هذا ليس خيارا وأعتقد أنك ستحتاج إلى القيام بشيء مختلف قليلا.

بالإضافة إلى استخدام نهج محاولة وجود وحدة تحكم أمامية واحدة تمر عبر جميع الحاجيات اللازمة وبناءها، بديل قد ترغب في مراعاته هو استخدام أكثر قوة من القوالب في ماكو.

يمكنك في الواقع تحديد كتل صغيرة مثل Mako Def's، والتي لديها بالطبع قوة بيثون كاملة. لتجنب تلوث قوالب Mako مع منطق المجال، تأكد من إبقاء كل ما في النماذج الخاصة بك، وإجراء مكالمات فقط إلى مثيلات النموذج في Mako Def حسب الحاجة لهذا المكون من الصفحة لبناء نفسها.

ميزة هائلة لهذا النهج هي أنه منذ ذاكرة التخزين المؤقت لدعم دعم Mako Def، يمكنك في الواقع مكونات الصفحة تقرر كيفية ذاكرة التخزين المؤقت نفسها. ربما يجب تخزين الشريط الجانبي مؤقتا لمدة 5 دقائق، لكن شريط أعلى يتغير كل ضربة على سبيل المثال. أيضا، نظرا لأن المكون يتم تشغيل DB Hit، فستحفظ يضرب DB عند تخزين المكونات نفسها.

لا تملك Toscawidgets الأداء لجعله خيارا ممكنا للغاية على نطاق أوسع، لذلك سأبقى بعيدا عن محاولة ذلك.

بالنسبة لبعض القرص إلى فكرتك الحالية، تأكد من عدم استخدام وحدات تحكم الأبراج بالفعل من أجل "الحاجيات"، لأنها تفعل الكثير حسب الحاجة لدعم WSGI الذي لا تحتاج إليه لبناء صفحة لأعلى من الحاجيات.

كنت أفكر في الحصول على جميع فئات القطعة تعمل مثل ذلك:

class Widget(object):
    def process(self):
        # Determine if this widget should process a POST aimed at it
        # ie, one of the POST args is a widget id indicating the widget
        # to handle the POST

    def prepare(self):
        # Load data from the database if needed in prep for the render

    def render(self):
        # return the rendered content

    def __call__(self):
        self.process()
        self.prepare()
        return self.render()

ثم فقط لديك تكرر قالب ماكو الرئيسي من خلال مثيلات القطعة، واتصل بها لتقديمها.

نصائح أخرى

يمكنك استخدام toscawidgets. لتثبيت الحاجيات الخاصة بك، جنبا إلى جنب مع قائمة مخزنة من الحاجيات التي تم تمكينها لكل مستخدم (في قاعدة البيانات أو خدمة أخرى، كما تقترح). قم بتمرير قائمة من Toscawidgets الممكنة إلى الرأي وستجعل الأدوات الحاجيات نفسها (بما في ذلك إضافة مراجع CSS / JavaScript ديناميكيا إلى الصفحة إذا كانت القطعة تتطلب هذه الموارد).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top