Topic: Problema permessi/views in Flask [RISOLTO]  (Letto 777 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline mbellamina

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Problema permessi/views in Flask [RISOLTO]
« il: Gennaio 03, 2017, 21:43 »
Salve,  io e una mia amica stiamo scrivendo un programma, ma stiamo riscontrando un problema nel codice. Il sito è un blog dove l'utente per vedere i post, scriverli e commentarli deve registrarsi. Il problema è che quando l'utente si logga può scrivere post , ma è l'unico a vederli e quando commenta li salva nel database ma purtroppo non vengono visualizzati sullo schermo. Scrivo qua sotto il pezzo di codice interessato.
Grazie del tempo dedicatomi. :)

DA VIEWS:


[codice]@app.route('/user/<username>/post/<post_id>/', methods=['GET', 'POST'])
def post(username, post_id):
    user = User.query.filter_by(username=username).first()
    post = Post.query.filter_by(id=post_id).first()
    form = CommentForm()
    
    if user is None:
        flash('user: {} not found'.format(username))
        return redirect(url_for('home'))
        
    if post is None:
        flash('Post No.: {} not found'.format(post_id))
        return redirect(url_for('user', username=username))

    if request.method == 'GET':
        if not g.is_logged_in:
            comments = Comment.query.filter_by(post_id=post.id).order_by(Comment.created_on.desc()).all()
            flash('please login to leave a comment')
            return render_template('post.html', visitor=g.user, user=user, post=post, comments=comments, form=form)
        else:
            comments = Comment.query.filter_by(post_id=post.id).order_by(Comment.created_on.desc()).all()
            return render_template('post.html', visitor=g.user, user=user, post=post, comments=comments, form=form)
            
    if request.method == 'POST':
        if not form.validate():
            return redirect(url_for('post', username=username, post_id=post_id))
        else:
            new_comment = Comment(body=form.body.data, author=g.user)
            print 'dicks ' + form.post_id.data
            db.session.add(new_comment)
            db.session.commit()
            return redirect(url_for('post', username=username, post_id=post.id))
[/codice]

DA MODELS:

[codice]class User(db.Model):
    __tablename__ = "users_user"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(USER.MAX_USERNAME), unique=True)
    email = db.Column(db.String(USER.MAX_EMAIL), unique=True)
    pwdhash = db.Column(db.String(USER.MAX_PASSW))
    uuid = db.Column(db.String(66))
    created_on = db.Column(db.DateTime, default = db.func.now())
    verified = db.Column(db.Boolean(), default = False)
    
    status = db.Column(db.Integer, default=USER.ALIVE)
    role = db.Column(db.Integer, default=USER.USER)
    
    posts = db.relationship('Post', backref='author', lazy='dynamic')
    comments = db.relationship('Comment', backref='author', lazy='dynamic')
    followed = db.relationship(
        'User',
        secondary = followers,
        primaryjoin = (followers.c.follower_id == id),
        secondaryjoin = (followers.c.followed_id == id),
        backref = db.backref('followers', lazy='dynamic'),
        lazy='dynamic'
    )
    
    def __init__(self, username, email, password):
        self.username = username
        self.email = email
        self.set_pwdhash(password)
        self.uuid = str(uuid.uuid1())

    def __repr__(self):
        return '<User: {}>'.format(self.username)
    
    def set_pwdhash(self, password):
        self.pwdhash = generate_password_hash(password)
    
    def check_pwdhash(self,password):
        return check_password_hash(self.pwdhash, password)

    def follow(self, user):
        if not self.is_followed(user):
            self.followed.append(user)
            return self
    
    def unfollow(self, user):
        if self.is_followed(user):
            self.followed.remove(user)
            return self
    
    def is_followed(self, user):
        return self.followed.filter(followers.c.followed_id == user.id).count() > 0
    
    def following(self):
        return self.followed.filter(followers.c.follower_id == self.id).all()
        
    def followed_posts(self):
        return Post.query.join(followers, (followers.c.followed_id == Post.user_id)).filter(followers.c.follower_id == self.id).order_by(Post.created_on.desc())


class Post(db.Model):

    __tablename__ = "users_post"
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users_user.id'))
    
    title = db.Column(db.String(140), default=None)
    body = db.Column(db.String(POST.MAX_BODY), default=None)
    created_on = db.Column(db.DateTime, default=db.func.now())
    
    comments = db.relationship('Comment', backref='parent', lazy='dynamic')
    
    def __init__(self, title, body, author):
        self.title = title
        self.body = body
        self.author = author
        
    def __repr__(self):
        return '<Post: {}>'.format(self.title[:25])


class Comment(db.Model):
    
    __tablename__ = "posts_comment"
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users_user.id'))
    post_id = db.Column(db.Integer, db.ForeignKey('users_post.id'))
    
    body = db.Column(db.String(POST.MAX_BODY), default=None)
    created_on = db.Column(db.DateTime, default=db.func.now())
    
    def __init__(self, body, author):
        self.body = body
        self.author = author
    
    def __repr__(self):
        return '<Comment: {}>'.format(self.body[:25])
DA FORMS:
class PostForm(Form):
    title = StringField(
        "New Post Title",
        [
            DataRequired("Please title your post"),
            Length(
                max=140,
                message="This title exceeds the 140 character limit"
            )
        ]
    )
    body = TextAreaField(
        "New Post",
        [
            DataRequired("Please enter a new post"),
            Length(
                max=POST.MAX_BODY,
                message="This post exceeds the 10,000 character limit"
            )
        ]
    )
    submit = SubmitField("Post")

    def __init__(self, *args, **kwargs):
        Form.__init__(self, *args, **kwargs)

    def validate(self):
        if not Form.validate(self):
            return False


class CommentForm(Form):
    body = TextAreaField(
        "New Comment",
        [
            DataRequired("Please enter a new comment"),
            Length(
                max=1000,
                message="this comment exceeds the 1000 character limit")
        ]
    )
    post_id = StringField(widget=HiddenInput())
    submit = SubmitField("Comment")

    def __init__(self, *args, **kwargs):
        Form.__init__(self, *args, **kwargs)

    def validate(self):
        if not Form.validate(self):
            return False
[/codice]
« Ultima modifica: Gennaio 14, 2017, 16:35 da mbellamina »

Offline Markon

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 4.104
  • Punti reputazione: 5
    • Mostra profilo
    • Neolithic
Re: PROBLEMA CON PYTHON [ AREA SBAGLIATA]
« Risposta #1 il: Gennaio 11, 2017, 13:58 »
Nel metodo post, cos'e' la variabile g?

[codice]        if not g.is_logged_in:  [/codice]

Per quanto riguarda i commenti che non vengono visualizzati, ti suggerirei di dare un'occhiata a pdb++. Installalo e setta un breakpoint nel codice dove vuoi, cosi' che puoi debuggare il codice.

Ad esempio, nel metodo post:

[codice]def post(...):
  import pdb
  pdb.set_trace()
  ...
[/codice]
A questo punto avvii il server e nel terminale puoi accedere alle variabili, ai metodi, ecc. Cosi' puoi vedere cosa sta accadendo e perche' (probabilmente) non ottieni nessun commento.
« Ultima modifica: Gennaio 11, 2017, 14:03 da Markon »

Offline DragLag

  • python habilis
  • **
  • Post: 69
  • Punti reputazione: 0
    • Mostra profilo
    • mirkosecke
Re: PROBLEMA CON PYTHON [ AREA SBAGLIATA]
« Risposta #2 il: Gennaio 11, 2017, 15:03 »
Nel metodo post, cos'e' la variabile g?

[codice]        if not g.is_logged_in:  [/codice]


penso si riferisca a questa g:

Citazione
Extensions are free to store additional information on the topmost level, assuming they pick a sufficiently unique name and should put there information there, instead on the flask.g object which is reserved for user code.

da qui: http://flask.pocoo.org/docs/0.10/appcontext/