Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Python

AttributeError: 'AnonymousUserMixin' object has no attribute 'username' Social Media Flask Error

I am not sure why I am getting this error: AttributeError: 'AnonymousUserMixin' object has no attribute 'username'. I will post my code below if you need anything else just let me know. Also, if you see any other errors please let me know, I am still in the debugging phase. Lastly, any help is appreciated thank you.

App.py

from flask import (Flask, g, render_template, flash, redirect, url_for, abort) from flask.ext.bcrypt import check_password_hash from flask.ext.login import LoginManager, login_user, logout_user, login_required, current_user

import forms import models

DEBUG = True PORT = 8000 HOST = '10.0.0.17'

app = Flask(name) app.secret_key = 'ASD*ER*EFU&E*FHE*T(T&#$&A%$DFDSFUSHDFJSBERBV'

login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = 'login'

@login_manager.user_loader def load_user(userid): try: return models.User.get(models.User.id == userid) except models.DoesNotExist: return None @app.before_request def before_request(): """Connect to the database before each request""" g.db = models.DATABASE g.db.connect() g.user = current_user

@app.after_request def after_request(response): """Close the database connection after each request""" g.db.close() return response

def object_list(template_name, qr, var_name='object_list', **kwargs): kwargs.update( page=int(request.args.get('page', 1)), pages=qr.count() / 20 + 1 ) kwargs[var_name] = qr.paginate(kwargs['page']) return render_template(template_name, **kwargs)

@app.route('/register', methods=('GET', 'POST')) def register(): form = forms.RegisterForm() if form.validate_on_submit(): flash("Yes, you registered!", "Sucess") models.User.create_user( username=form.username.data, email=form.email.data, password=form.password.data ) return redirect(url_for('index')) return render_template('register.html', form=form)

@app.route('/login', methods=('GET', 'POST')) def login(): form = forms.LoginForm() if form.validate_on_submit(): try: user = models.User.get(models.User.email == form.email.data) except models.DoesNotExist: flash("Your email or password doesn't match") else: if check_password_hash(user.password, form.password.data): login_user(user) flash("You've been logged in!", "Sucess") return redirect(url_for('index')) else: flash("Your email or password doesn't match") return render_template('login.html', form=form)

@app.route('/logout') @login_required def logout(): login_user flash("You have been logged out! Come back soon.", "Sucess") return redirect(url_for('index'))

@app.route('/new_post', methods=('GET', 'POST')) @login_required def post(): form = forms.PostForm() if form.validate_on_submit(): models.Post.create(user=g.user._get_current_object(), content=form.content.data.strip()) flash("Message Posted! Thanks!", "Sucess") return redirect(url_for('index')) return render_template('post.html', form=form)

@app.route('/private') @login_required def private_timeline(): user = get_current_user() messages = Message.select().where(Message.user << user.following()) return object_list('private_messages.html', messages, 'message_list')

@app.route('/') def index(): stream = models.Post.select().limit(100) return render_template('stream.html', stream=stream)

@app.route('/stream') @app.route('/stream/<username>')

def stream(username=None): template = 'stream.html' if username and username != current_user.username: try: user = models.User.select().where(models.User.username**username).get() stream = user.posts.limit(100) except models.DoesNotExist: abort(404) else: stream = current_user.get_stream().limit(100) user = current_user if username: template = 'user_stream.html' return render_template(template, stream=stream, user=user)

@app.route('/post/<int:post_id>')

def view_post(post_id): posts = models.Post.select().where(models.Post.id == post_id) if posts.count() == 0: abort(404) return render_template('stream.html', stream=posts)

@app.route('/follow/<username>') @login_required

def follow(username): try: to_user = models.User.get(models.User.username**username) except models.DoesNotExist: abort(404) else: try: models.Relationship.create( from_user=g.user._get_current_object(), to_user=to_user ) except models.IntegrityError: pass else: flash("You're now following {}!".format(to_user.username), "Sucess") return redirect(url_for('stream', username=to_user.username))

@app.route('/unfollow/<username>') @login_required

def unfollow(username): try: to_user = models.User.get(models.User.username**username) except models.DoesNotExist: abort(404) else: try: models.Relationship.get( from_user=g.user._get_current_object(), to_user=to_user ).delete_instance() except models.IntegrityError: pass else: flash("You've unfollowed {}!".format(to_user.username), "Sucess") return redirect(url_for('stream', username=to_user.username))

def gravatar_url(self, size=80):

# return 'http://www.gravatar.com/avatar/%s?d=identicon&s=%d' % \ # (md5(self.email.strip().lower().encode('utf-8')).hexdigest(), size)

@app.errorhandler(404)

def not_found(error): return render_template('404.html'), 404

if name== 'main': models.intialize() try: models.User.create_user( username='Alex', email='aajohnson2002@gmail.com', password='password', admin=True ) except ValueError: pass app.run(debug=DEBUG, host=HOST, port=PORT)

forms.py

from flask_wtf import Form from wtforms import StringField, PasswordField, TextAreaField from wtforms.validators import (DataRequired, Regexp, ValidationError, Email, Length, EqualTo ) from models import User

def name_exists(form, field): if User.select().where(User.username == field.data).exists(): raise ValidationError('User with that name already exists.') def email_exists(form, field): if User.select().where(User.email == field.data).exists(): raise ValidationError('User with that email already exists.') class RegisterForm(Form): username = StringField( 'Username', validators=[ DataRequired(), Regexp( r'^[a-zA-Z0-9_]+$', message=("Username should be one word, letters, numbers, and underscores only")

            ),
            name_exists
            ])
email = StringField(
    'Email',
    validators=[
        DataRequired(),
        Email(),
        email_exists
        ])
password = PasswordField(
    'Password',
    validators=[
        DataRequired(),
        Length(min=2),
        EqualTo('password2', message='Passwords must match.')
        ])
password2 = PasswordField(
    'Confirm Password',
    validators=[
        DataRequired()
        ])

class LoginForm(Form): email = StringField('Email', validators=[DataRequired(), Email()]) password = PasswordField('Password', validators=[DataRequired()])

class PostForm(Form): content = TextAreaField("What's Up?", validators=[DataRequired()])

models.py

import datetime

from flask.ext.bcrypt import generate_password_hash from flask.ext.login import UserMixin from peewee import *

DATABASE = SqliteDatabase('social.db')

class User(UserMixin, Model): username = CharField(unique=True) email = CharField(unique=True) password = CharField(max_length=100) joined_at = DateTimeField(default=datetime.datetime.now) is_admin = BooleanField(default=False)

class Meta:
    database = DATABASE
    order_by = ('-joined_at',)
def get_posts(self):
    return Post.select().where(Post.user == self)

def get_stream(self):
    return Post.select().where(
        (Post.user << self.following())
        (Post.user == self)
    )

def following(self):
    """The users that we are following"""
    return (
        User.select().join(
            Relationship, on=Relationship.to_user
        ).where(
            Relationship.from_user == self
        )
    )

def followers(self):
    """Get users following the current user"""
    return (
        User.select().join(
            Relationship, on=Relationship.from_user
        ).where(
            Relationship.to_user == self
        )
    )

@classmethod
def create_user(cls, username, email, password, admin=False):
    try:
        with DATABASE.transaction():
            cls.create(
                username=username,
                email=email,
                password=generate_password_hash(password),
                is_admin=admin)
    except IntegrityError:
        raise ValueError("User already exists")

class Post(Model): timestamp = DateTimeField(default=datetime.datetime.now) user = ForeignKeyField( rel_model = User, related_name = 'posts' ) content = TextField()

class Meta:
    database = DATABASE
    order_by = ('-timestamp',)

class Relationship(Model): from_user = ForeignKeyField(User, related_name='relationships') to_user = ForeignKeyField(User, related_name='related_to')

class Meta:
    database = DATABASE
    indexes = (
        (('from_user', 'to_user'), True),
    )

def intialize(): DATABASE.connect() DATABASE.create_tables([User, Post, Relationship], safe=True) DATABASE.close()

2 Answers

You can fix this issue by adding the @login_required decorator to your view like so:

@app.route('/stream')
@app.route('/stream/<username>')
@login_required
def stream(username=None):
    template = 'stream.html'
    if username and username != current_user.username:
        user = models.User.select().where(models.User.username**username).get()
        stream = user.post.limit(100)
    else:
        stream = current_user.get_stream().limit(100)
        user = current_user
    if username:
        template = 'user_stream.html'
    return render_template(template, stream=stream, user=user)

Also, ensure that you are logged in.

For more information check out: Issue link 1 and Issue link 2

thank you anthonyanaedu .. this is really solution