hottabxp
@hottabxp
Сначала мы жили бедно, а потом нас обокрали..

Как упростить код с сокращенными записями?

Нашел самый простой код авторизации на Flask. Но там есть пару моментов, которые не очень понятны, а именно сокращенные записи, которые делают код плохо читаемым(по крайней мере для меня).
Вот этот кусок:
if 'user_id' in session:
        user = [x for x in users if x.id == session['user_id']][0]
        g.user = user

Как его переписать обычным, понятным способом. Я конечно понимаю, что тогда код будет на несколько строк больше, но зато будет все понятно. Никогда не любил такие конструкции, которые тяжело читать, особенно в чужом коде.
На всякий случай полный код:
Полный код

from flask import (
    Flask,
    g,
    redirect,
    render_template,
    request,
    session,
    url_for
)

class User:
    def __init__(self, id, username, password):
        self.id = id
        self.username = username
        self.password = password

    def __repr__(self):
        return f'<User: {self.username}>'

users = []
users.append(User(id=1, username='sergey', password='555'))
users.append(User(id=2, username='111', password='222'))
users.append(User(id=3, username='Carlos', password='somethingsimple'))


app = Flask(__name__)
app.secret_key = 'somesecretkeythatonlyishouldknow'

@app.before_request
def before_request():
    g.user = None

    if 'user_id' in session:
        user = [x for x in users if x.id == session['user_id']][0]
        g.user = user

        

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        session.pop('user_id', None)

        username = request.form['username']
        password = request.form['password']
        
        user = [x for x in users if x.username == username][0]
        if user and user.password == password:
            session['user_id'] = user.id
            return redirect(url_for('profile'))

        return redirect(url_for('login'))

    return render_template('login.html')



@app.route('/profile')
def profile():
    print(session['user_id'])
    if not g.user:
        return redirect(url_for('login'))

    return render_template('profile.html')

if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0')

  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Я бы примерно как-то так сократил:
if 'user_id' in session:
    for user in users:
        if user.id == session['user_id']:
            g.user = user
            break
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы