我一直在尝试金字塔,这个遍历的东西给我发疯。我基本上是在摆弄购物车的控制面板,这是我想到的基本结构。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