• Как прибавить значение к полю mognodb?

    Tark
    @Tark
    Pyramid'альный мир
    Комментировать
  • Почему программа не выводит ничего в командную строку?

    Tark
    @Tark
    Pyramid'альный мир
    Потому что в переменной titles пустой список.
    Ответ написан
    Комментировать
  • Есть ли смысл защищать от CSRF кнопку "Выход"?

    Tark
    @Tark
    Pyramid'альный мир
    Эксплуатировать эту уязвимость очень просто: нужно на этом же сайте разместить "картинку" с адресом /logout. Или дать ссылку на страницу своего блога, где будет такая картинка. Каждый, кто её "посмотрит", будет принудительно выброшен из системы. Ничего такого, просто неприятность.

    Пока в vk не сделали csrf повсюду, таким образом люди без своего ведома вступали в группы или голосовали в нужном голосовании за нужный результат.
    Ответ написан
    1 комментарий
  • И все-таки PHP 7 быстрее Python 3?

    Tark
    @Tark
    Pyramid'альный мир
    Но какая разница? У вас ведь скрипты ещё и с базами данных общаются?
    Предположим, написали вы сервис на чистом РНР без фреймворков, а для теста написали аналогичный сервис на Python/Django. Предположим, что на чистом РНР можно получить 10к запросов/сек, а на Django - жалкие 4к. Печаль.

    Но ваш сервис, например, будет использовать 5 запросов к БД, каждый из которых будет отрабатываться за 1мс. 5мс - чисто на запросы к БД.

    Итого: на РНР запрос будет выполняться за 5.0001мс, на Python/Django - за 5.00025мс... Неужели есть какая-то разница?
    Ответ написан
    6 комментариев
  • Как вернуть результат рекурсивной функции в переменную?

    Tark
    @Tark
    Pyramid'альный мир
    А если очень хочется разобраться с рекурсией, то вот:

    import os
    
    
    def SearchDir(path, z=[]):
        if os.path.exists(path):
            if os.listdir(path):
                for d in os.listdir(path):
                    if os.path.isdir(os.path.join(path, d)):
                        z += [(os.path.join(path, d))]
                        SearchDir(os.path.join(path, d), z)
            else:
                return print('The directory is empty')
        else:
            return print('The directory does not exist')
    
        return z
    
    path = r'f:\Python-pyramid\farm'
    print(SearchDir(path))

    Но вы видите, что код очень непричёсанный, да? Слишком много лишнего написано, да и return print удивляет.
    Ответ написан
    1 комментарий
  • Почему продолжается подставление слеша в url?

    Tark
    @Tark
    Pyramid'альный мир
    Flask’s URL rules are based on Werkzeug’s routing module. The idea behind that module is to ensure beautiful and unique URLs based on precedents laid down by Apache and earlier HTTP servers.

    Take these two rules:
    
    @app.route('/projects/')
    def projects():
        return 'The project page'
    
    @app.route('/about')
    def about():
        return 'The about page'

    Though they look rather similar, they differ in their use of the trailing slash in the URL definition. In the first case, the canonical URL for the projects endpoint has a trailing slash. In that sense, it is similar to a folder on a filesystem. Accessing it without a trailing slash will cause Flask to redirect to the canonical URL with the trailing slash.

    In the second case, however, the URL is defined without a trailing slash, rather like the pathname of a file on UNIX-like systems. Accessing the URL with a trailing slash will produce a 404 “Not Found” error.
    _____________
    И раньше, когда я еще не проводил через такой роут /<int:info>/, к примеру, 3 То подстановки не было, а после есть. (с) - что это значит?

    Если у вас сейчас путь без слеша перенаправляется на путь со слешем, то это, к сожалению, кеш браузера. Меня очень раздражало в Flask, что приходилось постоянно использовать декоратор "nocache", описанный в самой документации, чтобы страница генерировалась заново при каждом обращении.

    Кроме того, чем вам не нравится перенаправление? Неужели было бы лучше, если бы пользователь сам путь поправил и получил 404? Я сейчас как раз переписываю свой пакет под такое же поведение с перенаправлением.
    Ответ написан
    Комментировать
  • Как правильно составить регулярное выражение на Python?

    Tark
    @Tark
    Pyramid'альный мир
    "Правильное" регулярное выражение для вашего случая

    m = re.search('<br/>(.*)<br/>', text)
    if m:
        print(m.group(1))


    Но тут есть одна проблема. br - непарный тег, у него нет ничего "внутри". Это первое. Второе: парсить страницы лучше специализированными фреймворками типа BeatifulSoup, Grab, lxml - там же есть и функции для очистки результата... наверное. Если нет - можно воспользоваться Bleach. Успехов.
    Ответ написан
    Комментировать
  • Как вывести значение из json?

    Tark
    @Tark
    Pyramid'альный мир
    > python, html, c#

    Внезапно PHP нет, а с ним было бы проще, ха-ха.

    Грубо говоря, json.dumps конвертирует словарь в строку. json.loads конвертирует строку в словарь. Словарь - "ассоциативный массив". Но в вашем словаре ключ users возвращает список (настоящий, неассоциативный массив). Если там есть данные, то после выполнения

    media = json.loads(api.json)

    к нему можно обратиться с помощью конструкции

    media['users'][0]['num']

    Где 0 - элемент списка, данные с которого нужно получить. Массивы, ну вы знаете. Не забудьте проверить, есть ли в json ключ users и не нулевой ли длины этот список. Успехов!
    Ответ написан
    4 комментария
  • Задача на Python, просьба помочь понять формулу, как она реализована?

    Tark
    @Tark
    Pyramid'альный мир
    ... если остаток n больше или равен 2 и меньше или равен 4, но при этом остаток от деления введённого числа на 100 меньше 10 или больше 20.

    Это для того, чтобы сказать "112 программистов", но "102 или 122 программиста".
    Ответ написан
    2 комментария
  • Как получить заголовки 403 ошибки?

    Tark
    @Tark
    Pyramid'альный мир
    https://docs.python.org/3/howto/urllib2.html#error...

    Чуть ниже пишут, что всё равно можно прочитать тело и заголовки, и приводят пару примеров.
    Ответ написан
    Комментировать
  • Как организовать общение между Python и Javascript?

    Tark
    @Tark
    Pyramid'альный мир
    Почему-то создаётся впечатление, что у вас проблема не с технологиями, а с самыми-самыми основами - с алгоритмами. Впрочем, не только у вас. Питон - это не волшебная палочка, которая решит все проблемы. "Как сделать лайки?". "У меня есть список комментариев, как вывести их количество?".

    У вас есть данные, которые получает скрипт, отвечающий за общение. Ваше дело, куда эти данные вывести - хоть в поле, любое. У вас УЖЕ ЕСТЬ ДАННЫЕ, какие с ними сложности?
    Ответ написан
  • Как передать данные из Flask view в HTML?

    Tark
    @Tark
    Pyramid'альный мир
    Эта конструкция - {{ city.city }} - выдаёт значение как оно есть, без кавычек. Попробуйте написать так:

    console.log("{{ city.city }}");
    Ответ написан
    1 комментарий
  • Слышал что Mongodb открыта для всего мира при установке. Что это значит?

    Tark
    @Tark
    Pyramid'альный мир
    В конфиге /etc/mongod.conf есть строки

    # Listen to local interface only. Comment out to listen on all interfaces. 
    bind_ip = 127.0.0.1

    По умолчанию (раньше, по крайней мере) bind_ip было закомментировано. Как видно из комментария, сервер действительно слушал все интерфейсы и принимал соединения со всех адресов. Опасненько было. Если строка не закомментирована, то всё тип-топ, соединение возможно только локальное. У меня на VDS операционная система Debian, там такого ни разу не видел.
    Ответ написан
    Комментировать
  • Как установить MongoDB с движком wiredTiger?

    Tark
    @Tark
    Pyramid'альный мир
    В /etc/mongodb.conf (или /etc/mongod.conf, забыл уже) надо добавить (или исправить) строку
    storage.engine = wiredTiger

    В новом движке может быть принят другой формат конфигурации (YAML), тогда надо вписать (или исправить)

    storage:
        engine: wiredTiger

    Учтите, на странице docs.mongodb.org/master/reference/configuration-options , которую вы, конечно же, не читали, стоит предупреждение, что табы использовать нельзя, только пробелы. Учтите также, что... баз данных быть не должно. Вообще. То есть директория data или где оно там хранит данные, должна быть девственно пуста.
    Ответ написан
    6 комментариев
  • Как правильно во Flask разделить роуты?

    Tark
    @Tark
    Pyramid'альный мир
    > А можете показать как решает ту же задачу Flask-Classy ?

    from flask import Flask, render_template as render
    from index import IndexView
    from user import UserView
    from admin import AdminView
    
    app = Flask(__name__)
    
    IndexView.register(app)
    UserView.register(app)
    AdminView.register(app)
    
    if __name__ == '__main__':
        app.run(debug=True)


    index.py
    class IndexView(FlaskView):
        route_base = '/'  # кажется, для IndexView по умолчанию / ... но не уверен.
    
        @route('/')
        def index(self):
            return render(...)
    
        @route('/login')
        def login(self):
            return render(...)
    
        @route('/logout')
        def logout(self):
            return render(...)


    user.py
    class UserView(FlaskView):
        # route_base = '/user'  # необязательно
        @route('/')
        def index(self):
            return render(...)
    
        @route('/<int:id>')
        def get_user(self, id):
            return render(...)


    А для админки можно попробовать Flask-Admin.
    Ответ написан
    9 комментариев
  • Почему код не проходит тест?

    Tark
    @Tark
    Pyramid'альный мир
    Вам нужно найти наименьшее произведение четырёх последовательных чисел в строке. Отсортировать - это хитрый ход, но с сортировкой последний тест вернёт 1, а должен вернуть 4.

    Что до самого кода, то вместо перебора с range можно написать так:

    list = []
    result = 1
    for i in input:
        list.append(i)

    или по-взрослому
    result = 1
    list = [i for i in input]


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

    Задачу, наверное, лучше всего решить в лоб: перебирать строку от нулевого элемента до длины строки минус четыре (или пять?), брать по четыре цифры за раз, результат загонять в список, на выходе вернуть наименьшее значение списка.
    Ответ написан
    2 комментария
  • MongoDB выбрать из вложенного массива?

    Tark
    @Tark
    Pyramid'альный мир
    db.qtest.find({'tags.0.Python': 14})

    выдаст содержимое документа, где в нулевом элементе списка tags у ключа Python значение 14. А зачем вот так?
    Ответ написан
  • Что можно сделать на Tornado?

    Tark
    @Tark Автор вопроса
    Pyramid'альный мир
    Посмотрел на aiohttp, осталось странное такое впечатление.

    Начнём с того, что асинхронный aiohttp в 2-5 раз медленнее синхронных топов на самой простой задаче - вернуть JSON. Окей, в реальной жизни засчёт однопоточности и ненужности кеш-серверов скорость сгладится.

    Второе. Андрей Светлов говорил: "смотрите, у нас есть джынжа со с макой! Можно уже писать приложения!". Да.
    aiohttp_jinja2 не проверяет в декораторе значение, которое ей передаётся. Вернули не словарь? Нате пятихатку!
    Почему бы не проверять? Почему в шаблон не передаётся request по умолчанию, почему мне нужно будет вписывать его самостоятельно? Если бы мне хотелось многословия, я бы Django использовал.

    Третье, про aiohttp.web. В pyramid, к примеру, есть чёткое разделение между роутом и вью-функцией, где роут - это URL с именем, а во вьюшке можно определить обработчик роута в зависимости от HTTP-метода и прочего. В результате можно строить URL в шаблоне, указывая имя роута и необходимые параметры; очень удобно. В отличие от pyramid, в aiohttp есть понятие роута, где сразу же указывается HTTP-метод, URL и обработчик. Что самое злое, метод тут - ТОЛЬКО СТРОКА. Не список/множество возможных методов типа method=('GET', 'POST'), а только строка. В результате необходимо придумывать разные name для роута для одного и того же URL, что добавляет неудобства для их построения. И чёртово отсутствие request в шаблоне, чёрт бы его подрал. Ну не хочу я вертать взад dict(request=request, user='Tark'), я хочу без реквеста, но чтобы оно в шаблон передавалось самим aiohttp. Аргх!

    Что понравилось - aioauth-client. Ужасное название пакета, но какая прелесть внтурях. Осталось чуток дописать, чтобы не приходилось делать if 'twitter' elif 'github' elif 'google', добавить роутов и можно получить нормально работающий python-social-auth-light.

    Но пока что всё это слишком не доработанное. Разработка идёт гигантскими шагами, но результат пока ещё использовать тяжело.
    Ответ написан
    Комментировать
  • Как несколько раз отправить в Request один и тот же адрес несколько раз в Scrapy?

    Tark
    @Tark
    Pyramid'альный мир
    И снова Roman Kitaev прав :D

    return Request(link, formdata={'year': str(data)}, callback=self.parse_year

    Эта строка моментально вернёт результат. Сразу же. А вот если её заменить на

    def parse(self):
        result = []
        for data in years[1:8]:
            result.append(Request(link, formdata={'year': str(data)}, callback=self.parse_year))
        return result

    то она вернёт список из результатов запроса. Это то, что нужно?
    Ответ написан
  • TypeError: 'int' object has no attribute '__getitem__'?

    Tark
    @Tark
    Pyramid'альный мир
    if int(record[0]) < time_score:
        record[0] = time_score

    Похоже, в record[0] будет целое.

    record[0] = encryption(key, mode, iv, record[0])

    Вы передаёте в функцию значение record[0] (целое)
    В самой функции encryption

    def encryption(key, mode, iv, record):
        ...
        record[0] = encryptor.encrypt(record[0])  # record - не список! Это число!
    Ответ написан
    Комментировать