我会尝试使用pyramid,并且这个遍历问题让我感到很疯狂。基本上,我正在为购物车制作控制面板而摆弄,并且以下是我考虑的基本结构。
登录页面
所以我的文件夹结构大致如下(大写的文件是模型):
在
对于此部分,我取得了一些进展,它绝对会在控制台打印相应的消息。然而,我不知道如何将其与view_configs连接起来,如果需要进行任何更改,view_configs应该是什么参数。
我不知道版本是否会影响任何内容,但无论如何,我正在使用Python 3.3。
任何帮助都将不胜感激。谢谢!
这是我第一次在Java多年后编写Python代码。因此,就金字塔/ Python而言,可能有一些术语/概念我不熟悉。
基于 localhost:6543/admin/products,view_config 的设置如下:
@view_config(context=Admin, name='products', .... )
在对 resources.py 进行更改后。
不知何故,它没有呈现产品模板,而是默认的404页面。
登录页面
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
- static
- templates
- views
- __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/admin/product,但注意到它仍然呈现的是主页,而不是产品页面。
我知道我错过了某些东西,但似乎找不出原因。通过查看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。
任何帮助都将不胜感激。谢谢!
这是我第一次在Java多年后编写Python代码。因此,就金字塔/ Python而言,可能有一些术语/概念我不熟悉。
好的,我想我已经有点理解遍历这个概念了。阅读http://docs.pylonsproject.org/projects/pyramid/en/1.4-branch/narr/traversal.html时,有两件事引起了我的注意。
例如,如果路径信息序列为['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/admin/products,view_config 的设置如下:
@view_config(context=Admin, name='products', .... )
在对 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
在 views/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页面。