我一直在嘗試金字塔,這個遍歷的東西給我發瘋。我基本上是在擺弄購物車的控制面板,這是我想到的基本結構。Python金字塔遍歷
登錄頁面
localhost:6543/admin_login
成功登錄後
localhost:6543/admin/home
要查看所有現有產品
localhost:6543/admin/product
編輯產品X
localhost:6543/admin/product/edit/1
所以我的文件夾結構是這樣的(大寫文件型號)
- 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'])
登錄後,我點的URL爲localhost: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應該是什麼參數。
我不知道版本是否影響任何東西,但無論如何,我正在使用python 3。3
任何幫助將不勝感激。謝謝!
這是我第一次在python中編寫多年的java代碼。所以可能有一些術語/概念我不熟悉金字塔/ python。
好吧,我覺得我有點想到繞過這個遍歷的東西。通過http://docs.pylonsproject.org/projects/pyramid/en/1.4-branch/narr/traversal.html閱讀,2件事引起了我的注意。
例如,如果路徑信息序列爲[ 'A', 'B', 'C']:
- 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.
因此,基於在localhost: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
alrighty,怎麼樣輸出爲view_config的子路徑?這是我的主要問題。 – Gino