Задать вопрос
  • Реализация авторизации в flask?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    from flask import session
    
    
    @app.route('/')
    def index():
        if not session.get('logged_in'):
            return redirect('/submit')
        else:
            return render_template('index.html')
    
    
    @app.route('/submit', methods = ['POST'])
    def post():
        if request.form.get('login') == 'admin':
            session['logged_in'] = True
            return jsonify({'type':'success','msg':'success'})
        return jsonify({'type':'error','msg':'error'})
    Ответ написан
    1 комментарий
  • Почему не отображается css в Flask?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Папку static создайте и в неё кидайте ваши css.
    Вот так это должно выглядеть:
    /server.py
    /static/style.css
    /templates/index.html
    -------------/images

    Подключение, соответственно:
    <link rel="stylesheet" href='/static/style.css' />
    Ответ написан
    1 комментарий
  • Как обработать POST запрос во Flask?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Легко. Можешь не благодарить.
    Ответ написан
    Комментировать
  • Как сделать две базы данный в Flask?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Минимально рабочий вариант:
    from datetime import datetime
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
    app.config['SQLALCHEMY_BINDS'] = {
        'messages': 'sqlite:///message.db'
    }
    
    db = SQLAlchemy(app)
    
    
    class Article(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(100), nullable=False)
        intro = db.Column(db.String(300), nullable=False)
        text = db.Column(db.Text, nullable=False)
        date = db.Column(db.DateTime, default=datetime.utcnow)
    
    
        def __repr__(self):
            return '<Article %r>' % self.id
    
    
    class Message(db.Model):
    
        __bind_key__ = 'messages'
    
        id = db.Column(db.Integer, primary_key=True)
        Name = db.Column(db.Text, nullable=False)
        Surname = db.Column(db.Text, nullable=False)
        text = db.Column(db.Text, nullable=False)
        date = db.Column(db.DateTime, default=datetime.utcnow)
    
    
        def __repr__(self):
            return '<Message %r>' % self.Name
    
    
    @app.route('/add_message')
    def add_message():
        message = Message(Name='name', Surname='surname', text='foo')
        db.session.add(message)
        db.session.commit()
        return 'True'
    
    
    db.create_all()
    db.create_all(bind='messages')
    
    
    if __name__ == '__main__':
        app.run(debug=1)
    Ответ написан
    Комментировать
  • Как во flask сделать приватный get/post запрос?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Токены нужно передавать с клиента в заголовках, а на сервере использовать валидацию для роутов, например с flask-jwt-extended

    Минимально рабочий вариант:
    from flask import Flask, request, jsonify
    from flask_jwt_extended import (
        JWTManager,
        create_access_token,
        jwt_required,
        get_jwt_identity
    )
    
    app = Flask(__name__)
    
    app.config['SECRET_KEY'] = 'super-secret'
    app.config['JWT_SECRET_KEY'] = app.config['SECRET_KEY']
    app.config['JWT_ACCESS_TOKEN_EXPIRES'] = False
    
    jwt = JWTManager(app)
    
    users = ['kshnkvn']
    
    
    @app.route('/login', methods=['POST'])
    def login():
        user = request.json.get('user')
    
        if user not in users:
            return jsonify(
                {'status': False, 'result': 'User not exists'})
        else:
            return jsonify(
                {'status': True, 'result': create_access_token(identity=user)})
    
    
    @app.route('/user', methods=['GET'])
    @jwt_required
    def user():
        user = get_jwt_identity()
        return jsonify({'status': True, 'result': user})
    
    
    if __name__ == '__main__':
        app.run(debug=True, port=6061)


    В итоге если шлем запрос на /user без заголовка с авторизацией, то получаем в ответ:
    {
        "msg": "Missing Authorization Header"
    }

    Для получения токена отправляем POST запрос на /login где в теле запроса отправляем JSON с именем пользователя, а в ответ получаем токен:
    {
        "status": true,
        "result": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2MDYzOTk0NjcsIm5iZiI6MTYwNjM5OTQ2NywianRpIjoiMTgxZmY2ZGQtN2FmNS00ZTUxLTlhMzAtODA3MTNhYzNlZGJlIiwiaWRlbnRpdHkiOiJrc2hua3ZuIiwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.DwzxBd-6Hz1Gg6O-7JIoFrBm_XzCoiOD6xIRhFUjG0Q"
    }

    После этого в каждый запрос добавляем заголовок
    "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2MDYzOTk0NjcsIm5iZiI6MTYwNjM5OTQ2NywianRpIjoiMTgxZmY2ZGQtN2FmNS00ZTUxLTlhMzAtODA3MTNhYzNlZGJlIiwiaWRlbnRpdHkiOiJrc2hua3ZuIiwiZnJlc2giOmZhbHNlLCJ0eXBlIjoiYWNjZXNzIn0.DwzxBd-6Hz1Gg6O-7JIoFrBm_XzCoiOD6xIRhFUjG0Q"
    и заходим на нужную ссылку, например для /user будет следующий ответ:
    {
        "status": true,
        "result": "kshnkvn"
    }
    Ответ написан
    2 комментария
  • На чем лучше реализовать API Flask или flask_restful?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    FastAPI. Flask годится разве что для ознакомления.
    Ответ написан
    2 комментария
  • Ошибка 404 при обработке get запроса flask?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    В правилах роута ты можешь задавать только параметры адреса, то есть если ты пишешь
    @app.route(rule='/<foo>/<bar>', methods=['GET'])
    def index(foo, bar):
        ....

    То это будет означать, что foo и bar - это параметры адреса, то есть example.com/asda/dasda. Если тебе нужно получить аргументы адреса, например example.com/?foo=asda, то нужно использовать request.args, то есть:
    from flask import request
    
    @app.route(rule='/', methods=['GET'])
    def index():
        if request.args.get('foo'):
            return f'{request.args["foo"]}'
        ....
    Ответ написан
    Комментировать
  • Как сделать поиск без учета регистра в Flask Sqlite?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Я так понимаю у тебя sqlalchemy, попробуй ilike, но не знаю работает ли он корректно с sqlite:

    ru_riddles = riddles.query.filter(riddles.ruText.ilike(q)).all()
    Ответ написан
    4 комментария
  • Методы или функции для работы с БД через SQLAlchemy?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Общие запросы, которые могут повторяться множество раз в коде пишешь в классе модели, что бы потом не дублировать код, всё остальное по месту, то есть в самих роутах. Выносить в какой то там отдельный файл по 1-2 строчки кода, которые используются 1 раз в 1 месте - такая себе идея.
    Ответ написан
    5 комментариев
  • Как обработать данные присланные на сервер Flask?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Все данные хранятся в request.

    from flask import request
    
    @app.route('/api/index.php', methods=['POST'])
    def listen():
        # json данные
        print(request.json)
    
        # данные формы
        print(request.form.to_dict())
    
        # заголовки
        print(dict(request.headers))
    
        # аргументы
        print(request.args)
    
        return "ok"
    Ответ написан
    1 комментарий
  • Как исправить ошибку в flask request.form?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Потому что у тебя текстовое поле не привязано к форме, добавь к форме id а к текстовому поля указатель на форму:
    <label>
        <textarea name="recipe" rows="15" cols="55" form="some-form"></textarea>
    </label>
    <form id="some-form" action="/save" method="POST">
        <input type="submit" value="Сохранить">
    </form>
    Ответ написан
    Комментировать
  • TypeError: The view function did not return a valid response.The function either returned None or ended without a return statement как решить в Flask?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    Роут всегда должен что то возвращать, а у тебя в случае ошибки он ничего не возвращает. Более того, из-за того, что ты решил просто "замолчать" ошибку, ты не знаешь почему у тебя случается эта ошибка, а мог бы сделать вот так:
    import logging
    
    @app.route('/create-poem/', methods=['POST', 'GET'])
    def create():
        if request.method == 'POST':
            ...
            try:
                ...
            except Exception:
                logging.exception('')
                return ''
        else:
            ...


    Тогда бы ты увидел ошибку, в которой говорится
    sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: ivan

    Тогда бы ты мог открыть свою БД и увидеть, что в ней действительно нет нужной тебе таблицы, а нет её потому, что ты её не создал. А вот что бы создать таблицу, нужно :
    db.create_all()
    app.run(debug=True)
    Ответ написан
    1 комментарий