LINUX.ORG.RU

30
Всего сообщений: 121

Flask не получается сделать redirect.

Всем привет.

@app.route('/test',methods=['POST'])
def test():
    flask.redirect(flask.url_for('redirurl'),code=307)


@app.route('/redirurl',methods=['GET'])
def redirurl():
    return "OK"

После post запроса (ajax) /test. В логе видно, что перенаправление срабатывает (но с 405 кодом), потому что шлет post запрос, "POST /redirurl HTTP/1.1" 405 -. А надо чтоб get отправил. Или это не возможно?

 ,

bikes ()

Кто как использует python для создания API? Какая-то фигня получается...

Добрый день.

Поймал себя на том, что при написании какого-либо веб-приложения принято:
1. Описать модель данных, в котором:
поле:тип
поле:тип
...
поле:тип
2. Эту модель замаршаллить специальным маршаллизатором по схеме, в которой
поле:тип
поле:тип
...
поле:тип
3. Эту модель для того, чтобы UI сделать, описать в любимом фреймворке, и там
поле:тип
поле:тип
...
поле:тип
4. Валидатор если писать, в нём тоже... Ну вы поняли.
Периодически натыкался на попытки интеграции всего этого, но слишком сложные. Что, так все и копипастят???

UPD. Всем спасибо, похоже, пора с фласка перелезать на DRF.

 , , , ,

Shadow ()

Не устанавливается кука *только для суб-домена* из топ-левел-домена

Всем привет!

В целях экономии трафика не хочу чтобы эта кука передавалась от-к tld (после первой установки). Хочу чтобы она была только для суб-домена. Но ставилась в tld.

@main_blueprint.route('/')
def home():
    flash('Home, temp home')
    r=make_response(render_template('blank.txt'))
    r.set_cookie('coo1',value='coo-val1', domain='sub.localhost.dev')
    r.headers['Access-Control-Allow-Origin']='sub.localhost.dev'
    return r
@main_blueprint.route('/', subdomain='sub')
def get_home_sub():
    cv=request.cookies.get('coo1')
    flash('HOME --- SUB, my cookie: {}'.format(cv))
    return render_template('blank.txt')

В браузерах (старый firefox и chromium) этой куки нет. Не пойму, так и должно быть?

curl пишет что кука передаётся:

...
< Set-Cookie: coo1=coo-val1; Domain=sub.localhost.dev; Path=/
< Access-Control-Allow-Origin: sub.localhost.dev
< Vary: Cookie
...

Пробовал ‘*’ для Access-Control-Allow-Origin, и вовсе без, не помогает. Сервер от рута (чтобы без номера порта) тоже пробовал.

Если в set_cookie() domain=‘.localhost.dev’, то всё супер, кука конечно встаёт и видится суб-доменом.

Я боюсь, я совсем не понимаю, что вообще можно делать (и как) и чего нельзя. Пните меня в правильном направлении, пожалуйста :)

flask set_cookie cookie for sub-domain only

 ,

the1 ()

В чем отличие сессий во Flask от сессий в PHP?

В php же в куках хранится id сессии, а во flask там у сессионной куки(session) зашифрованное value. По сути тот же механизм, но почему в php сессии серверные а во flask клиентские если данные сессии хранятся в обоих случаях на сервере? И еще вопрос:во flask по умолчанию куки сессии существуют до тех пор, пока не закроется браузер. Если пользователи не закроют браузер в течение длительного промежутка, то как это скажется на нагрузке сервера и потреблении его памяти?

 , , ,

VolanQ ()

как правильно ждать?

Нужно дождаться пока (речь про python-RQ) job.is_finished не станет True и затем отдавать ответ на страницу. Как это правильно написать?
Не делать же так (или делать?):

while job.is_finished is False: 
    time.sleep(10)
    if job.is_finished: return json.dumps({'data': job.result}) 

или взять модуль https://pypi.org/project/waiting/ .

 ,

bikes ()

Nginx webp image не отображается

Приветствую. Столкнулся с проблемой связанной с nginx. В моём проекте используется nginx (1.17.1) c pagespeed модулем. При обработке папки /static/ работает всё отлично, но принципивльно не отображаются изображения .webp Пример конфигурации

location /static/ {
            #webo
            # if ($http_accept ~* "webp")    { set $webp_accept "true"; }
            # if (-f $request_filename.webp) { set $webp_local  "true"; }

            # # если WebP есть, то передать Vary
            # if ($webp_local = "true") {
            #     add_header Vary Accept;
            # }

            # # если клиент поддерживает WebP, то передать файл
            # if ($webp_accept = "true") {
            #     rewrite (.*) $1.webp break;
            # }
            if ($http_accept ~* "webp") { set $webp T; }



            # optimization
            etag on;
            #gzip on;
            charset utf-8;
            expires max;
            # sendfile on;
            sendfile off;
            # autoindex on;
            add_header Access-Control-Allow-Origin *;
            # root /home/project/src/;
            alias /home/project/src/static/;
        }

При попытке обратится к этому изображению(https:site//static/image/usa.wepb) получаю ошибку 404. Подскажите, что я делаю не так?

 , ,

q13 ()

flask как сделать запрет?

К примеру роут:

@app.route('/example')
def ex():
    t = {'data':'test'}
    return jsonify(t)

Скажем этот роут обрабатывается ajax запросом ("GET /example/?_=1577318397252 HTTP/1.1" 200 -). Интересует как делать запрет на прямой GET запрос ("GET /example/ HTTP/1.1" 200 -)?

 ,

bikes ()

Екатеринбург. Ищем рарабочиков на Python (backend, frontend, django, flask) | Закрыто.

UPD: Всем спасибо, разработчика нашли (для статистики: не на ЛОРе)

Всем привет!

Компания CarbonSoft ищет трёх разработчиков, в команды биллинга для операторов связи и облачных VPS.

Что делать?

  • Frontend разработка веб-интерфейсов.
  • Backend разработка веб-служб на Python.

Для чего делать

  • Биллинговая система для интернет-провайдеров. Технологии: Python, Django, Firebird, CentOS, FreeRadius.

  • Облачные VPS для бизнеса. Технологии: Python, Flask, REST, MySQL.

Сколько платят?

от 50 000 до 180 000 руб. на руки

Почему такая вилка?

Уровень определяется по собеседованию:

  • Ты крутой сеньер фулстак потянешь коммерческий проект в паре с товарищем? Тогда ближе к верхней планке
  • Ты можешь делать задачи самостоятельно, но еще есть чему поучиться? Тогда где-то посередине.
  • Ты умеешь кодить но частенько нужна помощь? Тогда ближе к нижней планке

От меня что требуется?

Обязательно

  • Опыт программирования на Python, PHP или других языках
  • Знание JavaScript, CSS и HTML
  • Опыт работы: 1–3 года

Желательно

  • Знание git или другой системы контроля версий;
  • Опыт составления, отладки и оптимизации SQL запросов;
  • Опыт программирования на Bash;
  • Опыт работы с Django, Flask или подобными фреймворками;
  • Опыт интеграции сторонних сервисов через API;
  • Будет очень круто, если вы уже работали в интернет-провайдере.

А кроме зарплаты что?

График

  • Полная занятость, полный день
  • 8 часовой рабочий день с 10-00 до 18-00, включая перерыв на обед 30 мин
  • Можно договориться насчет индивидуального графика работы

Прочие условия и плюшки

  • Официальное трудоустройство
  • Просторное и тихое рабочее пространство, возможность оборудовать его под себя, мы не сидим в опенспейсах
  • Обучение и покупка литературы за счет компании. Возможность бесплатно посещать IT-конференции по вашей профессии
  • Оплачиваемые компанией корпоративы
  • Компенсация обедов
  • После испытательного срока в подарок Pocketbook 740
  • Кофе, чай, плюшки в офисе
  • Во время отдыха можно поиграть в Playstation, настольный теннис или настольный хоккей
  • Весёлый коллектив профессионалов, готовых поспособствовать в профессиональном росте. Наши сотрудники любят не только программировать и внедрять наши решения клиентам, но и проводить вместе свободное после работы время

Контакты

  • Мы находимся в Екатеринбурге, ул. Комсомольская, д. 37, бизнес-центр «Комсомольская горка»
  • По вакансии можно написать в Телеграм @runout или на почту s.shadurskiy@carbonsoft.ru

 , ,

runout ()

PostgreSQL ThreadedConnectionPool and Flask blueprints

Вопрос.

Самый лучший способ расшарить пул соединений к СУБД между модулями Flask-приложения (blueprint-ами) - это использование глобальной переменной flask.g?

Использовать какой-то внешний процесс (брокер) я не хочу. Т.к. в этом случае придётся гонять данные между процессами (это снижение надёжности).

Я нашёл такое решение с flask.g здесь: https://stackoverflow.com/questions/16311974/connect-to-a-database-in-flask-which-approach-is-better

Инициализацию пула соединений flask.g.pool, при этом, можно выполнять на этапе @app.before_request или через декоратор @retry (случай обрыва соединения).

Какие ещё есть варианты расшарить пул соединений между нитями?

 ,

BruteForceSSL ()

Flask blueprints and MVC

Есть два вопроса по Flask blueprints.

(1)
Правильно ли я понимаю, что blueprints - это контроллеры (controllers) в терминологии MVC, templates/ - это представления (views), а models.py с классами SQL ORM - это модели?

(2)
В каталог tests/ - обычно кладутся тесты, extensions/ - это какие-то расширения (смотрю каталоги fbone, https://github.com/imwilsonxu/fbone), в каталоге core/ обычно хранятся какие-то общие, часто используемые, функции приложения?

Какой способ именования каталогов для Functional structure, http://exploreflask.com/en/latest/blueprints.html - наиболее классический?

 , ,

BruteForceSSL ()

Flask+Swagger vs BaseHTTPRequestHandler

В общем хочу понять как лучше.

Ситуация такая Flask + swagger против BaseHTTPRequestHandler который из стандартной библиотеки.

Есть локальное устройство (фискальный принтер, весы и прочее)

  1. Flask + Swagger Плюсы:
  • имеем задокументированный интерфейс.
  • имеем мидлвари которые будут слать эксепшены на наш сервер (хотя это не нужно)
  • имеем веб интерфейс для того чтоб работать с сервером помимо JS

Минусы:

  • Сложность
  • Объем на диске.
  1. BaseHTTPRequestHandler Плюсы:
  • Ничего ставить не надо. Минусы:
  • Вообще не ясно как тестить и отладка ад.
  • Нет ничего с логами и прочим

 ,

dem ()

flask CSRF missing

Пример приложения.

app.py: https://pastebin.com/0Xhyer50

index.html: https://pastebin.com/nsRL5XrR

Почему не передается CSRF токен? При отправке post запроса (Нажать json). Что нужно сделать, чтоб заработало? Или этот токен надо передавать, как то в ajax запросе? Спасибо.

 , ,

bikes ()

Смысл от make_shell_context в flask?

https://pastebin.com/vrwWqys3

Как я понимаю это можно использовать если требуется вызвать модель без импорта, но зачем это вообще нужно в web приложении? Ведь я все равно в контроллерах или миграциях буду импортить нужные мне модели

 ,

foozzi ()

Flask обновить объект в форме

Привет.

Есть форма запроса, в ней есть поля, которые она забирает из ldap. Например, список общих почтовых ящиков (mail_boxes), к которым пользователь должен получить доступ. Но если я в ldap добавляю новый ящик, который должен отображаться в форме, то он появляется только если перезапустить приложение.

Те есть класс UserForm и его переменные не обновляются при запросе. Как бы их насильно обновлять?

models.py

class UserForm(FlaskForm):

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


    mail_boxes = Select2MultipleField(u"Zugriff auf Mailkonto", [],
            choices=get_mail_boxes(),
            description=u"X2",
            render_kw={"multiple": "multiple"})



#views.py




@request_new_user.route('/', methods= ["GET", "POST"])
@roles_accepted('control_admin', 'control_create_user')
@login_required
def request_form():
    
    form = UserForm()

    if form.validate_on_submit(): 
        form_data = {}
        for key in request.form.keys():
            values = request.form.getlist(key)
            if len(values) == 1:
                form_data[key] = values[0]
            else:
                form_data[key] = values

        form_data = format_form_data(form_data)
        return render_template('result.html', form_data=form_data)
    return render_template('form.html', form=form , title='Anforderung zum Anlegen eines neuen Benutzers' )

#form.html






                                {{ form.mail_boxes.label }}
                                {{ form.mail_boxes(class_="form-control") }}      
...

                          

                            <script type="text/javascript">document.addEventListener("DOMContentLoaded", function () {
                                $("#mail_boxes").select2();
                            });

#models.py

def get_mail_boxes():

    search_base = 'cn=users,dc=xxx,dc=com'
    search_filter = '(&(uid=mail_*))'
    attr = ['mailPrimaryAddress', 'uid']
    conn = get_bound_connection()
    conn.search(search_base, search_filter, attributes=attr)
    if len(conn.entries) < 1:
        return False

    result = []
    for item in conn.entries:
        mail = getattr(item, 'mailPrimaryAddress', False)[0]
        uid = getattr(item, 'uid', False)[0]
        result.append(tuple((uid, mail)))
    return result


 ,

constin ()

Flask приложение как увеличить время выполнения скрипта?

Скрипт выполняется около 5 сек и веб страница выдает memory error(Jinja2)

 

KRex ()

Вопрос о flask, воркерах и асинхронности

Доброго времени суток. Есть приложение на flask у которого есть задачи (6 парсингов). Каждый пользователь может самостоятельно загрузить нужные ему данные которые обрабатываются при помощи rq (база redis). Всё отлично работает, но меня беспокоит, что когда будет одновременно 30 запросов (учитывая что на один парсинг уходит от 10 секунд до 60) пользователи могут не дождаться ответов и просто уйти. Подскажите как поступать в таком случае, возможно очереди не удачный выбор или нужно добавить больше воркеров?

 , , , ,

q13 ()

Размышления по поводу ldap юзеров в python

Какую бы документацию или мануал по интегрированию ldap юзеров в flask я не открыл, она всегда сводится к тому, чтобы один раз при авторизации забрать слепок юзера с ldap и запухнуть его куда-нибудь в другую базу данных , будь то sql или словарь или еще что-то.

Если почитать мой прошлый пост, то у меня были проблемы с uswgi воркерами. Каждый из них требовал отдельной авторизации одного и того же юзера. И решением было сохранять юзера в sql.

Сама концепция этого довольно костыльная. У меня есть open-ldap, а я кеширую юзеров в другое место. Но так же это приведет к лагам между изменением в open-ldap и реакции приложения на эти изменения:

Допустим у меня есть роут

@app.route('/test')
@role_required('admin')
def test():
  return "ldap admin access"

роль 'admin' это принадлежность юзера к группе в ldap, но я ее кеширую вместе с юзером в sql. И выходит, что когда я исключу юзера из этой группы в ldap, его кешированная копия в приложении все равно будет иметь доступ к этому маршруту.

А ведь мне нужен максимально быстрый отклик на такие изменения. И вот уже я переписываю врапер @role_required, чтобы он опрашивал ldap в реальном времени.

Но почему я не могу просто и сразу прямо использовать ldap в качестве базы юзеров? без sql или каких-то костылей?

Или как мне очищать sql от юзеров по таймауту?

 ,

constin ()

flask через uwsgi теряет сессию залогиненого юзера если много uwsgi процессов.

Привет.

Запускаю flask через uwsgi, авторизация пользователя через ldap, с UserMixin.

Если в конфиге uwsgi количество процессов больше одного ( у меня 5), то похоже, что каждый процесс требует, чтобы пользователь залогинился именно в нем.

Те я логинюсь и меня переносит на страницу с @flask_login.login_required. Затем я для теста обновляю страницу и с какой-то вероятностью меня вышибает назад, так как юзер не залогинен. Но если провести эту итерацию 5-8 раз, то все начинает работать хорошо.

Если же уменьшить количество процессов uwsgi до одного, то все сразу работает как часы.

 , ,

constin ()

supervisord + gunicorn, HUP and KILL signals

Как вы прибиваете ненужные воркеры после удаления части процессов из `/etc/supervisor/conf.d/` ? Т.е., чтобы трогать остальные процессы? Я нашёл способ через `ps aux | cut -f2 ... | xargs`, но этот способ мне не нравится.

 , ,

pacify ()

Не могу подружить Flask и gunicorn

Всем привет,

решил я кое-что написать на python3, не будучи программистом. Точнее — написать на Flask, используя эпичную методичку с хабра.

Долго ли коротко ли, но какое-то веб-приложение у меня получилось и прекрасно работает на локалхосте на встроенной пускалке (flask run). Пускалка при старте заявляет, что она девелоперская, и в проде использовать её нельзя. Поэтому «в проде» решил использовать gunicorn.

Приложение, кстати, вот такое (server.py):

from flask import Flask

app = Flask(__name__)
from app import views

@app.route("/")
def hello():
    return "Hello World!"
if __name__ == "__main__":
    app.run()

Так вот, оно вроде бы запускается и работает, hello world отдаёт, но не более того. Все остальные адреса (типа search) возвращают 404, всех остальных @app.route как будто нет. Но если @app.route добавить сюда же в servers.py, то добавленный путь нормально работает.

Надо полагать, строчка from app import views не работает так, как мне бы этого хотелось. Нашёл похожий вопрос на СО, но строчка импорта у ТС там другая, и ответ мне не подошёл.

Запускаю так:

gunicorn -w 4 server:app

Честно говоря, после некоторого опыта с пыхом зависимость поведения программы от реализации сервера кажется дичью. Мне понятна схема, когда на сервере запускается приложение, ну а тут мне даже предлагали сервер запихнуть в само приложение, когда ковырнул было waitress. Чад и угар девопса делает мне неуютно, помогите~

 , ,

muon ()