нетипичная форма flask current_user

#python #flask #nonetype

#python #flask #нетипичный

Вопрос:

Приведенный ниже код находится в моем проекте:

 flaskblog/ 
    /users 
        /forms.py 
            class UpdateAccountForm(FlaskForm):
  

 ## ERROR ##

'NoneType' object has no attribute 'username'
  

но у него должен быть current_user:

 User('test1', 'test1@test.com', 'fdd6f1e03J3fc6a4.jpg')
  

содержимое ошибки:

 Traceback (most recent call last):
  File "run.py", line 1, in <module>
    from flaskblog import app
  File "/home/ali/flask/flask_project2/Flask_Blog/flaskblog/__init__.py", line 20, in <module>
    from flaskblog import routes  # here because preventional of circular import.
  File "/home/ali/flask/flask_project2/Flask_Blog/flaskblog/routes.py", line 3, in <module>
    from flaskblog.forms import RegistrationForm, LoginForm, UpdateAccountForm
  File "/home/ali/flask/flask_project2/Flask_Blog/flaskblog/forms.py", line 40, in <module>
    class UpdateAccountForm(FlaskForm):
  File "/home/ali/flask/flask_project2/Flask_Blog/flaskblog/forms.py", line 43, in UpdateAccountForm
    render_kw={"value":current_user.username.data})
  File "/home/ali/flask/flask_project2/venv/lib/python3.8/site-packages/werkzeug/local.py", line 347, in __getattr__
    return getattr(self._get_current_object(), name)
AttributeError: 'NoneType' object has no attribute 'username'


  

USERS/forms.py

 from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError, Optional
from flaskblog.models import User
from flask_login import current_user


class UpdateAccountForm(FlaskForm):
    username = StringField('Username',
                            validators=[DataRequired(), Length(min=2, max=20)],
                            render_kw={"value":current_user.username.data})
    submit = SubmitField('Update')
    def validate_username(self, username):
        if username.data != current_user.username:
            user = User.query.filter_by(username=username.data).first()
            if user:
                raise ValidationError('That username is taken. Please choose a different one.')

    def validate_email(self, email):
        if email.data != current_user.email:
            user = User.query.filter_by(email=email.data).first()
            if user:
                raise ValidationError('That email is taken. Please choose a different one.')
  

FLASKBLOG/models.py

  # models.py
class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    image_file = db.Column(db.String(20), nullable=False, default='default.png')
    password = db.Column(db.String(60), nullable=False)  # we will hash passwords
    posts = db.relationship('Post', backref='author', lazy=True)  # upper case because it hints to a "class"

    def get_reset_token(self, expires_sec=1800):
        s = Serializer(current_app.secret_key, expires_sec)
        # s = Serializer(app.config['SECRET_KEY'])
        return s.dumps({'user_id' : self.id}).decode('utf-8')  # generats token
  

извините, если у меня были ошибки в английском 🙂

Комментарии:

1. Ну, похоже, что current_user == Нет. Так, может быть, покажете нам, что происходит в flask_login?

2. Во-первых, как гласит ошибка explcity: объект ‘NoneType’ не имеет атрибута, означает, что в ‘current_user’ нет никакого ‘user’, потому что на самом деле его нет. Итак, я думаю, что настоящая ошибка не в вашем файле с именем ‘forms.py ‘ но скорее где-то в другом месте (если ‘current_user.username.data’ не является правильным) Вам нужно добавить больше кода, чтобы понять, почему «текущий пользователь» — это none. .

3. если я укажу на "value":current_user , это сработает, он напечатает этот пользовательский объект, но если я укажу «value»:str(current_user), он перезапустит NoneType

4. извините, Бастьен Харкинс, я не могу понять, какую часть моего кода вы хотите

5. Я добавил свою ссылку на github