如何在没有将会话代码放在金字塔中的所有视图的情况下将会话放在所有页面上?

时间:2017-05-26 07:57:27

标签: python pyramid pylons

我认为我的问题与我构建金字塔项目的方式有关。 我想要完成的是让我的代码在所有视图上运行,我不想在所有视图上粘贴相同的代码。就像我只需要调用它就可以在所有视图中包含代码。这是我的代码。

我的向导模块

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)

我试图搜索,我认为我需要的是某种自动装载机?如何在金字塔上应用此功能?或者我应该坚持这个过程吗?

2 个答案:

答案 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_responseWizardView

中使用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'))