2017-05-26 3 views
0

Je pense que mon problème est lié à la façon dont j'ai structuré mon projet de pyramide. Ce que je veux accomplir est de faire fonctionner mon code sur toutes les vues, je ne veux pas coller les mêmes codes sur toutes les vues. C'est comme si j'incluais le code dans toutes les vues simplement en l'appelant. C'est mon code.Comment mettre des sessions sur toutes les pages sans mettre le code de session sur toutes les vues dans la pyramide?

mon module Assistant

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) 

mon module de facture

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) 

Comme vous pouvez le voir, je dois coller ce code deux fois (ce code vérifie si la session existe, sinon, redirigent utilisateur page de connexion)

session = self.request.session 
if session: 
    return {'fullname':session['name'],'userrole':session['userrole']} 
else: 
    url = self.request.route_url('login') 
    return HTTPFound(location=url) 

J'ai essayé de chercher et je pense que ce dont j'ai besoin est une sorte d'auto lo ader? Comment puis-je l'appliquer sur une pyramide? Ou devrais-je m'en tenir à ce processus?

Répondre

1

Si vous souhaitez renvoyer exactement la même chose à partir des (nombreuses) vues, le meilleur moyen est d'utiliser l'héritage.

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) 

Utilisation generic_response dans WizardView et 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() 

Si vous voulez simplement vérifier (et rediriger) lorsque la session ne vous pouvez procéder existe pas et sinon normalement utiliser des exceptions personnalisées et des vues correspondant.

d'abord définir exception personnalisée

class SessionNotPresent(Exception): 
    pass 

Et vue pour cette exception

@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) 

Ensuite, il suffit de vérifier si la session existe dans le constructeur parent

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 

En vue simplement étendre SessionView et non les sessions existantes seront traitées par 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']} 

Vous pouvez facilement ajouter des paramètres supplémentaires à exception (redirect_url, ...)

Pour la gestion des exceptions voir http://docs.pylonsproject.org/projects/pyramid-cookbook/en/latest/pylons/exceptions.html