2012-11-20 15 views
5

मैं पिरामिड की कोशिश कर रहा हूं और यह ट्रैवर्सल चीज़ मुझे पागल भेज रही है। मैं मूल रूप से एक शॉपिंग कार्ट के लिए नियंत्रण कक्ष बनाने के लिए चारों ओर झुका रहा हूं और यह मूल संरचना है जो मुझे दिमाग में है।पायथन पिरामिड ट्रैवर्सल

प्रवेश पृष्ठ

localhost:6543/admin_login 

सफलतापूर्वक प्रवेश होने

localhost:6543/admin/home 

सभी मौजूदा उत्पादों

localhost:6543/admin/product 

उत्पाद एक्स

localhost:6543/admin/product/edit/1 
012 संपादित करने के लिए देखने के लिए

तो मेरी फ़ोल्डर संरचना कुछ इस तरह (कैपिटल में फ़ाइलों मॉडल हैं)

  • mycart
    • resources.py
    • Admin.py
    • Product.py
    • स्थिर
    • टेम्पलेट्स है
    • विचार
      • __init__.py
      • admin.py
      • root.py

मेरे resources.py

from pyramid.security import Authenticated 
    from pyramid.security import Allow 
    from pyramid.response import Response 

    class Root(object): 
     __name__ = '' 
     __parent__ = None 

     def __init__(self, request): 
      pass 

     def __getitem__(self, key): 

      if key == 'admin_login': 
       return Admin() 

      elif key == 'admin': 
       return Admin() 

      raise KeyError 

    class Admin(object): 

     __name__ = '' 
     __parent__ = Root 
     __acl__ = [(Allow, Authenticated, 'admin')] 

     def __init__(self): 
      pass 

views/__init.py में, यह बस एक खाली फ़ाइल है। root.py का सवाल है, यह बस एक httpexceptions.HTTPNOTFOUND, 404 कोड

लिए views/admin.py

from pyramid.view import view_config, render_view 
    import mycart.resources 

    from pyramid.httpexceptions import HTTPNotFound, HTTPFound 
    from mycart.views.root import strip_tags 
    from pyramid_mailer import get_mailer 
    from pyramid_mailer.message import Message 

    from pyramid.security import remember , forget , authenticated_userid 

    from pyramid.events import subscriber , BeforeRender 

    from mycart.Admin import Admin 
    from mycart.Product import Product 


    @view_config(context='mycart:resources.Admin', request_method='POST', renderer='admin/login.jinja2') 
    def login_post(context, request): 

     if 'btnLogin' in request.params: 
     token = request.session.get_csrf_token() 
     login = request.params['txtLogin'] 
     password = request.params['txtPassword'] 

     admin = Admin(login, request) 

     if admin.validate_user(password): 

      record = admin.find_user_by_login(login) 

      request.session['bs_admin_id'] = str(record['_id']) 
      request.session['bs_admin_name'] = record['usr']['fname'] + ' ' + record['usr']['lname']; 
      request.session['bs_admin_type'] = record['usr']['type'] 
      headers = remember(request, login) 
      return HTTPFound('/admin/home', headers=headers) 

     message = 'Failed login' 

     return {'message': message, 'url': '/admin_login', 'page_title': 'Failed Login'} 


     @view_config(context='mycart:resources.Admin', name="home", renderer='admin/home.jinja2', permission='admin') 
     def home(context, request): 
      logged_in = authenticated_userid(request) 
      url = request.path_info 

      admin = Admin(logged_in, request) 
      rec = admin.find_user_by_objectid(request.session['bs_admin_id']) ; 

      return { 'firstname': rec['usr']['fname'] } 


    @view_config(context='mycart:resources.Admin', name="product", renderer='admin/product_listing.jinja2', permission='admin') 
      def product_list(context, request): 
      print ('yes, showing product listing requested by ', request.session['bs_admin_id']) 

है में प्रवेश करने के बाद, मैं यूआरएल स्थानीय होस्ट को इंगित: 6543/व्यवस्थापक/उत्पाद, मुझे लगता है कि यह अभी भी घर प्रतिपादन नोटिस उत्पाद पृष्ठ की बजाय पृष्ठ।

मुझे पता है कि मुझे कुछ याद आया लेकिन मुझे पता नहीं लगा कि क्यों। http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/narr/traversal.html के माध्यम से देख रहे हैं, मुझे पता है कि मैं सही रास्ते पर हूं क्योंकि आर्बिटरी सेगमेंट हो सकते हैं।

मैं resources.py संशोधित निम्नलिखित

..... 

    class Admin(object): 

     __name__ = '' 
     __parent__ = Root 
     __acl__ = [(Allow, Authenticated, 'admin')] 

     def __init__(self): 
      pass 

     def __getitem__(self, key): 

      if key == 'product': 
      print ("WOOT! Listing products") 
      ## this is the part where I don't know what should I return or set or how should I hook it up with view_config 

      if key == 'home': 
      print ("yes, I'm home!") 
      ## this is the part where I don't know what should I return or set or how should I hook it up with view_config 

      raise KeyError 

इस भाग के लिए होने की कोशिश की है, मैं कुछ प्रगति जहां यह निश्चित रूप से कंसोल में संबंधित संदेश मुद्रण नहीं हो जाता। हालांकि, मुझे कोई स्याही नहीं है कि मुझे इसे view_configs के साथ कैसे जोड़ना चाहिए और यदि किसी भी बदलाव की आवश्यकता है तो view_configs के लिए पैरामीटर क्या होना चाहिए।

मुझे नहीं पता कि संस्करण कुछ भी प्रभावित करता है लेकिन फिर भी, मैं अजगर 3 का उपयोग कर रहा हूं।3

किसी भी मदद की सराहना की जाएगी। धन्यवाद!

यह जावा के वर्षों के बाद पाइथन में पहली बार कोडिंग है। तो कुछ नियम/अवधारणाएं हो सकती हैं जिन्हें मैं पिरामिड/पायथन के संबंध में परिचित नहीं हूं।


ठीक है, मुझे लगता है कि मुझे इस दिमागी चीज के चारों ओर लपेटने के लिए मेरा दिमाग मिला है। http://docs.pylonsproject.org/projects/pyramid/en/1.4-branch/narr/traversal.html के माध्यम से पढ़ना, 2 चीजें मेरा ध्यान पकड़ा।

उदाहरण के लिए, यदि पथ की जानकारी अनुक्रम है [ 'एक', 'बी', 'सी']:

- Traversal starts by acquiring the root resource of the application by calling the root factory. The root factory can be configured to return whatever object is appropriate as the traversal root of your application. 

- Next, the first element ('a') is popped from the path segment sequence and is used as a key to lookup the corresponding resource in the root. This invokes the root resource’s __getitem__ method using that value ('a') as an argument. 

- If the root resource “contains” a resource with key 'a', its __getitem__ method will return it. The context temporarily becomes the “A” resource. 

तो स्थानीय होस्ट के आधार पर: 6543/व्यवस्थापक/उत्पादों, view_config के लिए सेटिंग्स है निम्नलिखित की तरह:

@view_config (संदर्भ = व्यवस्थापक, नाम = 'उत्पाद', ....)

तो resources.py में परिवर्तन करने के बाद

## class Root(object): 
     .... 


    class ProductName(object): 
     def __init__(self, _key): 
      pass 

    class Products(object): 
     __name__ = '' 
     __parent__ = Root 


     def __init__(self): 
      pass 

     def __getitem__(self, key): 
      print ('products: ', key) 
      if key == 'add': 
       return ProductName(key) 

      print ('Approaching KeyError') 
      raise KeyError 


    class Admin(object): 

     __name__ = '' 
     __parent__ = Root 
     __acl__ = [(Allow, Authenticated, 'admin')] 

     def __init__(self): 
      pass 


     def __getitem__(self, key): 

      if key == 'products': 
       print ('admin: ', key) 
       return Products() 

      raise KeyError 

और में देखा गया/admin.py

@view_config(context=Admin, name='products', renderer='admin/products.jinja2', permission = 'admin') 
    def product_add(context, request): 
     print 'hey products_add' 
     return { 'msg': ''} 

किसी तरह या बल्कि, यह उत्पाद टेम्पलेट प्रस्तुत नहीं हो रही, लेकिन डिफ़ॉल्ट 404.

+0

alrighty, क्या उपपथ के लिए view_config के लिए उत्पादन के बारे में? यह मुख्य मुद्दा है जो मैं कर रहा हूं। – Gino

उत्तर

4

आप doc about traversal पर एक नज़र डालें क्योंकि आपने इसे बिल्कुल सही नहीं मिला है। This tutorial ट्रैवर्सल को समझने में भी काफी उपयोगी है। मैं आपके संदर्भ में त्वरित स्पष्टीकरण करने की कोशिश करूंगा:

सबसे पहले, अनुरोध का मार्ग विभाजित परिचय खंड है। उदाहरण के लिए /admin/product['admin', 'product'] में विभाजित है।

फिर, पिरामिड इस अनुरोध के संदर्भ को निर्धारित करने का प्रयास करता है। इसके लिए, यह रूट से प्रत्येक सेगमेंट के लिए __getitem__ (जो कि object[segment] करता है) कहने के लिए यह एक और तरीका है (यह ट्रैवर्स)। उदाहरण में, यह root['admin'] करता है, जो एक व्यवस्थापक ऑब्जेक्ट देता है, फिर admin['product'] करता है। जब यह एक KeyError से मुकाबला करता है तो यह बंद हो जाता है।

हमारे पास एक संदर्भ होने के बाद, पिरामिड इस संदर्भ के साथ एक दृश्य के लिए खोज करता है, और जिसका दृश्य नाम वह हिस्सा है जो पार नहीं किया गया था। उदाहरण के लिए, यदि admin['product'] एक KeyError बढ़ाएं, तो पिरामिड एक दृश्य को देखता है जो @view_config(context=Admin, name="product") के साथ कॉन्फ़िगर किया गया है।


तो, आप उस से कोई एप्लिकेशन कर सकता हूँ? सबसे पहले, आप निर्धारित करते हैं कि आपका संसाधन पेड़ क्या है।आपके मामले में, यह हो सकता है इस तरह दिखता है:

  • रूट
    • व्यवस्थापक
      • ProductContainer
        • उत्पाद

व्यवस्थापक संदर्भ (/admin/home), ProductContainer (/admin/product) के लिए कोई नाम के साथ एक दृश्य के लिए home नाम के एक दृश्य और उत्पाद (/admin/product/1/edit) के लिए edit नाम के एक दृश्य है।

+0

मैं http://docs.pylonsproject.org/projects/pyramid/en/1.4-branch/narr/traversal.html के माध्यम से चला गया है, दुर्भाग्यवश, मरिकेल का ट्यूटोरियल मुझे समझ में नहीं आता है। हालांकि, किसी भी तरह पिरामिड उत्पाद टेम्पलेट को प्रस्तुत नहीं कर रहा है। मैंने अपने प्रश्न को संशोधनों के साथ संपादित किया है ... शायद मेरे संसाधन.py गलत तरीके से संरचित हैं? – Gino

+0

आपको यह सुनिश्चित करना होगा कि, प्रत्येक ऑब्जेक्ट के लिए, '__getitem__' अगली वस्तु को ट्रैवर्सल में वापस कर देगा। आपने रूट के लिए कोड शामिल नहीं किया है, इसलिए शायद समस्या है। – madjar

2

जबकि मुझे नहीं पता कि नीचे दिया गया कोड सुरुचिपूर्ण या कोई कमी है, तो यह निश्चित रूप से मेरे लिए काम कर रहा है। यदि कोई मुझे मेरे जैसी ही समस्या का सामना कर रहा है, तो मैं इसे अंदर डाल दूंगा।

resources.py

class ProductName(object): 
     __name__ = '' 
     __parent__ = Root 
     __acl__ = [(Allow, Authenticated, 'admin')] 

     def __init__(self, _key): 
      pass 

    class Products(object): 

     __name__ = '' 
     __parent__ = Root 
     __acl__ = [(Allow, Authenticated, 'admin')] 

     def __init__(self): 
      pass 

     def __getitem__(self, key): 
      print ('products: ' + key) 
      if key == 'add': 
       return ProductName(key) 

      print ('Approaching KeyError') 
      raise KeyError 

विचारों/admin.py

@view_config(context="**mycart:resources.ProductName**", name="",  renderer='admin/product_add.jinja2', permission = 'admin') 
     def product_add(context, request): 
     print 'hey product add' 
     return { 'msg': ''} 

    @view_config(context="**mycart:resources.Products**", name='' , renderer='admin/product.jinja2', permission = 'admin') 
    def product(context, request): 
     print 'hey products listing' 
     return { 'msg': ''} 
+0

बढ़िया! आप संभवतः व्यू कॉन्फ़िगरेशन से 'name =' ''हटा सकते हैं, क्योंकि ये डिफ़ॉल्ट मान हैं। आपका '__name__' और' __parent__' हालांकि गलत हैं। नाम यूआरएल सेक्शन के बराबर होना चाहिए जो उस ऑब्जेक्ट की ओर जाता है (यदि आपको url/admin पर कोई व्यवस्थापक ऑब्जेक्ट मिलता है, तो नाम व्यवस्थापक होना चाहिए), और माता-पिता प्रत्यक्ष माता-पिता होना चाहिए (ProductName का मूल उत्पाद है)। इन्हें 'resource_url' का उपयोग करके यूआरएल पीढ़ी के लिए उपयोग किया जाता है, अगर वे गलत हैं तो उत्पन्न यूआरएल गलत होगा। – madjar

+0

हाहाहा, हाँ, मैं अन्य उपपथों के साथ भी झुका रहा हूं, और गलती महसूस की और आखिरकार अधिक सहायता के लिए स्पैम करने का प्रयास करने से पहले इसे ठीक कर दिया। लेकिन गलती को इंगित करने में सिर के लिए धन्यवाद = डी – Gino

+0

@madjar एक तरफ ध्यान दें, मैं रूट_फैक्टरी के बारे में सोच रहा था और सोच रहा था कि यह प्रोजेक्ट स्केलिंग शुरू होने पर विभिन्न हिस्सों के लिए कई कारखानों के लिए अधिक प्रबंधनीय/सुरुचिपूर्ण होगा। प्रदर्शन के अनुसार, जो एक बेहतर अभ्यास हो सकता है। रखरखाव के अनुसार, जो एक बेहतर अभ्यास हो सकता है? – Gino

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