我认为我的问题与我构建金字塔项目的方式有关。 我想要完成的是让我的代码在所有视图上运行,我不想在所有视图上粘贴相同的代码。就像我只需要调用它就可以在所有视图中包含代码。这是我的代码。
我的向导模块
from pyramid.view import view_config, view_defaults
from .models import *
from datetime import datetime
from pyramid.response import Response
from bson import ObjectId
from pyramid.httpexceptions import HTTPFound
import json
class WizardView:
def __init__(self, request):
self.request = request
@view_config(route_name='wizard', renderer='templates/wizard.jinja2')
def wizard(self):
session = self.request.session
if session:
return {'fullname':session['name'],'userrole':session['userrole']}
else:
url = self.request.route_url('login')
return HTTPFound(location=url)
我的账单模块
from pyramid.view import view_config, view_defaults
from .models import *
from datetime import datetime
from pyramid.response import Response
from bson import ObjectId
from pyramid.httpexceptions import HTTPFound
class BillView:
def __init__(self, request):
self.request = request
@view_config(route_name='bills', renderer='templates/bills.jinja2')
def bills(self):
session = self.request.session
if session:
return {'fullname':session['name'],'userrole':session['userrole']}
else:
url = self.request.route_url('login')
return HTTPFound(location=url)
正如您所看到的,我必须粘贴此代码两次(此代码检查会话是否存在,如果不存在,则将用户重定向到登录页面)
session = self.request.session
if session:
return {'fullname':session['name'],'userrole':session['userrole']}
else:
url = self.request.route_url('login')
return HTTPFound(location=url)
我试图搜索,我认为我需要的是某种自动装载机?如何在金字塔上应用此功能?或者我应该坚持这个过程吗?
答案 0 :(得分:1)
如果您希望从两个(多个)视图中返回完全相同的内容,那么最好的方法是使用继承。
class GenericView:
def __init__(self, request):
self.request = request
def generic_response(self):
session = self.request.session
if session:
return {'fullname':session['name'],'userrole':session['userrole']}
else:
url = self.request.route_url('login')
return HTTPFound(location=url)
在generic_response
和WizardView
BillView
class WizardView(GenericView):
def __init__(self, request):
super().__init__(request)
# Do wizard specific initialization
@view_config(route_name='wizard', renderer='templates/wizard.jinja2')
def wizard(self):
return self.generic_response()
class BillView(GenericView):
def __init__(self, request):
super().__init__(request)
# Do bill specific initialization
@view_config(route_name='bills', renderer='templates/bills.jinja2')
def bills(self):
return self.generic_response()
如果您只想在会话不存在时检查(和重定向),否则可以正常进行,您可以使用自定义例外和相应的视图。
首先定义自定义异常
class SessionNotPresent(Exception):
pass
查看此异常
@view_config(context=SessionNotPresent)
def handle_no_session(context, request):
# context is our custom exception, request is normal request
request.route_url('login')
return HTTPFound(location=url)
然后只检查父构造函数中是否存在会话
class SessionView:
def __init__(self, request):
self.request = request
if not self.request.session:
raise SessionNotPresent() # Pyramid will delegate request handilng to handle_no_request
在视图中,只需展开SessionView
,并且handle_no_session
将对现有会话进行处理。
class WizardView(SessionView):
def __init__(self, request):
super().__init__(request)
# Do wizard specific initialization
@view_config(route_name='wizard', renderer='templates/wizard.jinja2')
def wizard(self):
session = self.request.session
return {'fullname':session['name'],'userrole':session['userrole']}
class BillView(SessionView):
def __init__(self, request):
super().__init__(request)
# Do bill specific initialization
@view_config(route_name='bills', renderer='templates/bills.jinja2')
def bills(self):
session = self.request.session
return {'fullname':session['name'],'userrole':session['userrole']}
您可以轻松地将其他参数添加到例外(redirect_url
,...)
有关异常处理,请参阅http://docs.pylonsproject.org/projects/pyramid-cookbook/en/latest/pylons/exceptions.html
答案 1 :(得分:0)
您可以使用以下活动:http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/events.html
示例:
from pyramid.events import subscriber, NewRequest
@subscriber(NewRequest)
def check_session(event):
if not event.request.session:
raise HTTPFound(location=event.request.route_path('login'))