• Что лучше flask или Django?

    @deliro
    Есть ровно ноль причин использовать Flask в 2021 году для новых проектов.

    В отличии от джанги у flask нет кучи полезных фич, которыми можно накостылять и быстро стартануть
    В отличии от fastapi, у flask нет типизации, DI и честной асинхронщины (она такая же, как у джанги — per view)
    У фласки есть фундаментальная дичь вроде global scope request
    Ответ написан
    1 комментарий
  • Как достать из строки слово на следующий строке?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    А может лучше не заниматься извращением, а использовать библиотеки для парсинга html, например, bs4.
    Ответ написан
    2 комментария
  • Как перебрать одно слово в каждой строке?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    data = '''<p><vim-math id="m7859635math1">AB+CD=|</vim-math><math-input id="m7859635MI1" keyboard-skin="junior" keyboard-type="base" strict-check="false">
      <math-input-answer>x+y</math-input-answer>
      <math-input-answer>y+x</math-input-answer>
    </math-input><vim-math id="m7859635math2">|+|</vim-math><math-input id="m7859635MI2" keyboard-skin="junior" keyboard-type="base" strict-check="false">
      <math-input-answer>t+z</math-input-answer>
      <math-input-answer>z+t</math-input-answer>'''
      
    string = '<math-input-answer>'
    results =[]
     
    def get_text(line):
        line = line.split('>')[1]
        line = line.split('<')[0]
        return line
         
    for line in data.splitlines():
        if string in line:
            result = get_text(line)
            results.append(result)
    print(results)

    Тут я сочинил совершенно безобразную функцию парсинга, потому что лень прикручивать к примеру, натыканному на телефоне, bs4 или ещё что-нибудь такое, или сочинять regex…
    вместо неё можно подставить более другую на своё усмотрение.
    Ответ написан
    2 комментария
  • Как передать id через html в flask?

    Hrafnir
    @Hrafnir
    Тебе нужно добавить в форму страницу, для которой ты напишешь эндпоинт, например:
    <form method="POST" action="{{ url_for('main.post_id') }}" >

    Не забыв при этом отправить в html шаблон объект своей формы, аля form=Form()
    В самой вьюхе тебе надо получить это значение:
    @main.post_id('/id')
       def post_id():
            form = Form()
            ....
            return render_template('template.html', form=form)


    и уже вертеть ее атрибутами
    Вообщем стоит почитать документацию в WTForms
    Ответ написан
    1 комментарий
  • Почему не парсит?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Зачем псевдокласс? Удаляйте
    Ответ написан
    1 комментарий
  • Как из списка выбрать случайный элемент, но чтобы он не повторялся?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Выбираете случайный элемент. Смотрите, не повторяется ли он.

    import random
    str_list = ["123", "eisdesn", "sjs38", "sjsklek"]
    
    used = []
    
    while len(used) != len(str_list):
        el = random.choice(str_list)
        if el not in used:
            print(el)
            used.append(el)


    Либо
    import random
    str_list = ["123", "eisdesn", "sjs38", "sjsklek"]
    for _ in range(len(str_list)):
        print(str_list.pop(random.randint(0, len(str_list)-1)))
    Ответ написан
    Комментировать
  • Как прибавить +1 к значению в sqlite?

    Vindicar
    @Vindicar
    RTFM!
    > Сама ошибка - star = cursor.fetchone()[0]
    > TypeError: 'NoneType' object is not subscriptable

    not subscriptable означает что ты пытаешься взять индекс у объекта, который это не поддерживает. В твоем случае объект типа NoneType - т.е. None.
    Иными словами, cursor.fetchone() вернул None, и конечно у None нельзя взять индекс.
    Почему fetchone() вернул None? Потому что запрос SELECT не нашёл ни одной строки с подходящим значением photo!

    Как это решить?
    Вставить в таблицу строку с photo, а если не получится (так как такое photo уже есть), то обновить. Есть два способа.
    1. Кодом. Проверить, что вернул fetchone(). Если None, то делаем INSERT. Если не None, то UPDATE.
    2. Средствами БД, что обычно называется UPDATE/INSERT, или коротко UPSERT. Для sqlite это потребует примерно такого запроса:
    INSERT INTO stars (photo, star) VALUES (ид фото, 1) ON CONFLICT (photo) DO UPDATE SET star = star + 1

    Требование: столбец photo должен быть первичным ключом или хотя бы иметь уникальный индекс, иначе запрос просто будет добавлять дубликат строки.

    ВАЖНО
    f'SELECT star FROM stars WHERE photo = "{photo}"' - никогда так не делайте! Особенно если входные данные получены от пользователя. Это хороший способ заполучить SQL-инъекцию.
    Используйте placeholders, по порядку:
    cursor.execute('SELECT star FROM stars WHERE photo = ?', (photo, ) )
    или по именам
    cursor.execute('SELECT star FROM stars WHERE photo = :photo', {'photo' : photo} )
    И удобнее и безопаснее.
    Ответ написан
    7 комментариев
  • Как сохранить сообщение в sqlite после нажатия на inline кнопку?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Ссылка просто текстом отправлена?

    В вашей функции query_handler вы можете получить текст оригинального сообщения (в данном случае это ссылка) через call.mesaage.text, дальше уже сохраняйте в БД
    Ответ написан
    4 комментария
  • Как спарсить файл .doc python?

    @PavelMos
    Можно регулярными выражениями. Выражение ищет фразу от diff до цифрвой комбинации до первого "doc"
    https://regex101.com/r/XLJ1t4/1
    import re
    import urllib
    regexp1='(\/diff\/\d{1,2}-\d{1,2}.?doc)'
    f=urllib.request.urlopen('http://1311.ru/info/info.php') #открывает, возвращает объект http (не текст)
    b=f.read() #читает из него в bytes
    text=b.decode() #из bytes в utf-8 (кодировка по умолчанию, поэтому в аргументах декод можно не писать) переводит в текст
    out=re.findall(regexp1, text)
    #далее, зная адрес сайта
    for i in out:
       print ("http://1311.ru"+i)
    http://1311.ru/diff/16-09.doc
    http://1311.ru/diff/17-09.doc

    Но тут, вероятно, надо брать самое новое расписание, тогда их надо сортировать по датам, разделяя дату и месяц, или проверять каким-то образом дату файла на сервере
    Ответ написан
    2 комментария