2017-11-02 1 views
0

enter image description hereMit Kolben-Login mit Kolben-admin

ich bei einem Open-Source-App freu https://github.com/AlvinCJin/deepfit-app/tree/master/app

Dies wird mit Kolben-admin für die Admin-Zwecke/auf der Seite https://github.com/AlvinCJin/deepfit-app/blob/master/app/main/views.py:

# admin management setup 
admin.add_view(ModelView(User, db.session)) 
admin.add_view(ModelView(Post, db.session)) 
path = op.join(os.path.abspath(__file__ + "/../../"), 'static') # need to get parent path of this code 
admin.add_view(FileAdmin(path, '/static/', name='Static Files')) 

Dies funktioniert gut, soweit es ein hilfreiches Dashboard erzeugt, aber ungesichert ist. Ich habe Kolben-Login installiert und ich lesen Sie den Abschnitt http://flask-admin.readthedocs.io/en/latest/introduction/#rolling-your-own, aber es ist mir unklar, wie die Klasse zu verknüpfen diskutiert:

class MicroBlogModelView(sqla.ModelView): 

def is_accessible(self): 
    return login.current_user.is_authenticated 

def inaccessible_callback(self, name, **kwargs): 
    # redirect to login page if user doesn't have access 
    return redirect(url_for('login', next=request.url)) 

mit dem Admin-Route.

ist die Benutzertabelle in models.py wie folgt definiert:

class User(UserMixin, db.Model): 
    __tablename__ = 'users' 
    id = db.Column(db.Integer, primary_key=True) 
    nickname = db.Column(db.String(64), unique=True) 
    firstname = db.Column(db.String(100)) 
    lastname = db.Column(db.String(100)) 
    email = db.Column(db.String(120), index=True, unique=True) 
    pwdhash = db.Column(db.String(54)) 
    phone = db.Column(db.Integer) 
    address = db.Column(db.String(64)) 
    confirmed = db.Column(db.Boolean, default=False) 

    role = db.Column(db.SmallInteger, default=ROLE_APPLICANT) 
    comments = db.relationship('Comment', backref='author', lazy='dynamic') 
    posts = db.relationship('Post', order_by="Post.timestamp", backref='author', 
          lazy='dynamic', cascade="all, delete, delete-orphan") 
    about_me = db.Column(db.Text()) 
    last_seen = db.Column(db.DateTime, default=datetime.utcnow) 
    member_since = db.Column(db.DateTime(), default=datetime.utcnow) 
    portrait = db.Column(db.String(140)) 
    pref = db.relationship('Preference', uselist=False, backref='author') 
    fav = db.relationship('Favourite', backref='user', lazy='dynamic') 

    active = db.Column(db.Boolean, default=False) 

    @staticmethod 
    def make_unique_nickname(nickname): 
     if User.query.filter_by(nickname=nickname).first() is None: 
      return nickname 
     version = 2 
     while True: 
      new_nickname = nickname + str(version) 
      if User.query.filter_by(nickname=new_nickname).first() is None: 
       break 
      version += 1 
     return new_nickname 

    def __init__(self, nickname, firstname, lastname, email, password, role): 
     self.nickname = nickname.title() 
     self.firstname = firstname.title() 
     self.lastname = lastname.title() 
     self.email = email.lower() 
     self.set_password(password) 
     self.role = role 

    def ping(self): 
     self.last_seen = datetime.utcnow() 
     db.session.add(self) 

    def set_password(self, password): 
     self.pwdhash = generate_password_hash(password) 

    def check_password(self, password): 
     return check_password_hash(self.pwdhash, password) 

    def is_authenticated(self): 
     return True 

    def generate_confirmation_token(self, expiration=3600): 
     s = Serializer(current_app.config['SECRET_KEY'], expiration) 
     return s.dumps({'confirm': self.id}) 

    def confirm(self, token): 
     s = Serializer(current_app.config['SECRET_KEY']) 
     try: 
      data = s.loads(token) 
     except: 
      return False 
     if data.get('confirm') != self.id: 
      return False 
     self.confirmed = True 
     db.confirmed = True 
     db.session.add(self) 
     return True 

    def to_json(self): 
     json_user = { 
      'url': url_for('api.get_post', id=self.id, _external=True), 
      'nickname': self.nickname, 
      'member_since': self.member_since, 
      'last_seen': self.last_seen, 
      'posts': url_for('api.get_user_posts', id=self.id, _external=True), 
      'post_count': self.posts.count(), 
     } 
     return json_user 

    def generate_reset_token(self, expiration=3600): 
     s = Serializer(current_app.config['SECRET_KEY'], expiration) 
     return s.dumps({'reset': self.id}) 

    def generate_auth_token(self, expiration): 
     s = Serializer(current_app.config['SECRET_KEY'], expiration) 
     return s.dumps({'id': self.id}) 

    @staticmethod 
    def verify_auth_token(token): 
     s = Serializer(current_app.config['SECRET_KEY']) 
     try: 
      data = s.loads(token) 
     except: 
      return None 
     return User.query.get(data['id']) 

    def is_active(self): 
     if self.active is True: 
      return True 
     else: 
      return False 

    def is_anonymous(self): 
     return False 

    def get_id(self): 
     return unicode(self.id) 

    def __repr__(self): 
     return '<User %r>' % self.nickname 

Und eine is_authenticated Methode hat, aber wie verwende ich diese Anmeldung als bestimmten Benutzer zu verlangen?

Ich habe versucht:

class MyView(BaseView): 
    @expose('/') 
    def index(self): 
     return self.render('admin/index.html') 

    def is_accessible(self): 
     return login.current_user.is_authenticated() 

# admin management setup 
admin.add_view(ModelView(User, db.session)) 
admin.add_view(ModelView(Post, db.session)) 
path = op.join(os.path.abspath(__file__ + "/../../"), 'static') # need to get parent path of this code 
admin.add_view(FileAdmin(path, '/static/', name='Static Files')) 

Basierend auf:

https://flask-admin.readthedocs.io/en/v1.0.7/quickstart/

EDIT:

Also nur für mein Verständnis Sie die ModelViews sind Subklassen und um die Möglichkeit Routen haben ?

Ich habe es geändert:

class MyView(ModelView): 
    @expose('/') 
    def index(self): 
     return self.render('admin/index.html') 

    def is_accessible(self): 
     return login.current_user.is_authenticated() 

# admin management setup 
admin.add_view(MyView(User, db.session)) 
admin.add_view(MyView(Post, db.session)) 
path = op.join(os.path.abspath(__file__ + "/../../"), 'static') # need to get parent path of this code 
admin.add_view(FileAdmin(path, '/static/', name='Static Files')) 

Das ist immer näher, aber ich brauche diese mit Kolben Login zu integrieren - ich bin immer:

NameError: global name 'login' is not defined 

EDIT2:

Ich habe es geändert in:

class MyView(ModelView): 
    @expose('/') 
    @login_required 
    def index(self): 
     return self.render('admin/index.html') 

Entfernen der is_accessible-Funktion, so dass sie nicht überschrieben wird. Die Benutzerklasse hat bereits eine eingebaute is_accessible-Funktion.

Dies zumindest teilweise funktioniert, aber ich möchte nur den Zugang zu Administratoren ermöglichen, die eine Rolle bei der Benutzer als 0

+0

'Klasse MyView (BaseView):' sollte 'Klasse MyModelView (ModelView):' und dann 'admin.add_view (MyModelView (User, db.session))' und 'admin.add_view (MyModelView (Post, db.session))'. Versuchen Sie, dass es funktionieren sollte –

+0

siehe meine Bearbeitung. – user61629

+0

In Bezug auf die letzte Fehlermeldung haben wir nicht wirklich genug Informationen, um zu wissen, was vor sich geht. Die App, die du verlinkt, initialisiert den LoginManager von Flask-Login als 'lm' in app/__ init__.py, aber es ist nicht klar, ob du es neben deinen Ansichten importierst oder ob du es falsch angegeben hast. – abathur

Antwort

1

Sie definiert haben sie es wie

unten tun müssen
from flask_login.utils import current_user 

class MyView(ModelView): 
    @expose('/') 
    def index(self): 
     return self.render('admin/index.html') 

    def is_accessible(self): 
     return current_user.is_authenticated() 

# admin management setup 
admin.add_view(MyView(User, db.session)) 
admin.add_view(MyView(Post, db.session)) 
path = op.join(os.path.abspath(__file__ + "/../../"), 'static') # need to get parent path of this code 
admin.add_view(FileAdmin(path, '/static/', name='Static Files')) 

Sie benötigen zu verwenden MyView Klasse beim Registrieren der Ansichten. Wenn Sie weitere Anpassungen benötigen, müssen Sie sie in Ihrem Benutzerobjekt implementieren, das von der Flask-Anmeldung verwendet wird. Dort können Sie Prüfgruppe und alles, was Sie sonst noch brauchen