2016-04-01 1 views
2

Je fais une authentification simple en python pyramid voici le security.py où je fais la partie authentification.UndefinedError: 'pyramid.util.Request object' n'a pas d'attribut 'user'

security.py

from pyramid.authentication import AuthTktAuthenticationPolicy 
from pyramid.authorization import ACLAuthorizationPolicy 

from .models.user import User 


class MyAuthenticationPolicy(AuthTktAuthenticationPolicy): 
    def authenticated_userid(self, request): 
     user = request.user 
     if user is not None: 
      return user.id 

def get_user(request): 
    user_id = request.unauthenticated_userid 
    if user_id is not None: 
     user = request.dbsession.query(User).get(user_id) 
     return user 

def includeme(config): 
    settings = config.get_settings() 
    authn_policy = MyAuthenticationPolicy(
     settings['auth.secret'], 
     hashalg='sha512', 
    ) 
    config.set_authentication_policy(authn_policy) 
    config.set_authorization_policy(ACLAuthorizationPolicy()) 
    config.add_request_method(get_user, 'user', reify=True) 

le réglage sont ajoutés au fichier init qui fonctionne pour la première fois et la méthode de requête est également ajouté à demander.

Voici mon fichier de vue pour la connexion où, fondamentalement, après avoir vérifié le nom d'utilisateur et mot de passe et en écrivant le code de mémorisation et de stocker des informations d'utilisateur, mais peut-être cette partie ne fonctionne pas.

default.py

@view_config(route_name='auth', match_param='action=in', renderer='string', 
       request_method='POST') 
@view_config(route_name='auth', match_param='action=out', renderer='string') 
def sign_in_out(request): 
    username=request.POST.get('username') 
    if username: 
    user=UserService.by_name(username) 
    if user and user.verify_password(request.POST.get('password')): 
     headers=remember(request,user.name) 
     return HTTPFound(location=request.route_url('admin'),headers=headers) 
     else: 
     headers=forget(request) 
    return HTTPFound(location=request.route_url('home'),headers=headers) 

ici après avoir vérifié le nom d'utilisateur et mot de passe. J'ai vérifié cette partie travaille FAIS cette copie de dessus têtes = souvenir (demande, user.name) retour HTTPFound (location = request.route_url ('admin'), les en-têtes = en-têtes)

la itinéraire d'administration rend le admin.jinja2 donc dans le fichier admin.jinja2

welcome {{request.user.name}} 

faire cela me renvoie une erreur jinja2.exceptions.UndefinedError

UndefinedError: 'pyramid.util.Request object' has no attribute 'user'

+1

Et comment incluez-vous le 'security'? –

+0

config.include ('. Security') dans __init__.py dans le dossier racine –

+0

2 choses viennent à l'esprit: a) 'get_user' throws AttributeError, ou b)' includeme' n'est pas réellement exécuté (peut-être vous devriez déboguer print là) –

Répondre

0

j'avais même question au cours des travaux cookiecutter Pyramid car dans le fichier layout.jinja2 {{request.user.name}} n'a pas été entre {% block content %} et {% endblock %}. Après avoir remplacé l'un comme suit ci-dessous cette exception a été abandonnée.

 {% block content %} 

     {% if request.user is none %} 
     <p class="pull-right"> 
      <a href="{{ request.route_url('login') }}">Login</a> 
     </p> 
     {% else %} 
     <p class="pull-right"> 
      {{request.user.name}} <a href="{{request.route_url('logout')}}">Logout</a> 
     </p> 
     {% endif %} 

     {% endblock %}