1. Python / Говнокод #12499

    −106

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    # Generate a unique username from the first part of the email address
        base_name = email.split('@')[0][:25]
        if User.objects.filter(username=base_name).count() == 0:
            username = base_name
        else:
            for ii in range(1, 99999+1):
                if User.objects.filter( username = base_name + str(ii) ).count() == 0:
                    username = email.split('@')[0][:25] + str(ii)
                    break

    хардкорная генерация имени пользователя на django

    Запостил: Kakashulenka, 29 Января 2013

    Комментарии (17) RSS

    • 1. почему `99999+1`?
      2. в чем говнокод? Вижу только неиспользование `base_name` в строке 8
      Ответить
      • >почему `99999+1`?
        Может добавили после того, как один раз сбойнуло?
        Ответить
      • По-моему, во всём ) По крайней мере без знания удава это выглядит так.
        Ответить
    • В чем говнокод, милая какашуленька?
      Ответить
    • username = email.split('@')[0][:25]
      while User.objects.filter(username).count() != 0:
          # у юзера нет фантазии чтобы придумать уникальное мыло? исправим!
          username = hashlib.md5(username).hexdigest()[:25]
      Ответить
      • 1. while User.objects.filter(usename).count() !=0 вывалится в эксепшн
        2. md5 от const - const, то есть в выражении нет смысла уже так как или count() будет равен нулю или будет бесконечный цикл.

        В качестве альтернативы лучше использовать uuid
        Ответить
    • пипец, ребята. дело в самом подходе к задаче: опрашивать базу в цикле ради сраного юзернейма. разве это нормально?
      Ответить
      • Юзернеймы добавляют не так часто. Почему нет? Ну разве что рандом вместо последовательного перебора, чтобы быстрее подбирался уникальный логин.
        Ответить
        • 1) нет - потому что долго. каждый запрос это время, io.
          2) в данном случае это кусок backendа для мобильного приложения, там регистрации случались бы очень часто
          Ответить
          • 4-5 запросов погоды не сделают. Тем более рядом всяко идет пачка инсертов, посвященная регистрации, которые будут выполняться куда дольше селекта.

            Почему 4-5? А потому что емейлов с одинаковым префиксом не так много как кажется. Ну будет [email protected], [email protected] ну еще штуки 2-3..., а тут и популярные домены кончились. Поэтому цикл отработает быстро, в 99% случаев за 1 итерацию.

            Разве что злодей захочет заддосить сайт путем регистрации пачки почти одинаковых емейлов...

            > там регистрации случались бы очень часто
            Чаще чем пачки других запросов, порожденные работой юзера с приложением? Ну-ну. Ну и нахрен тогда нужно приложение, на котором регистрируются чаще чем им пользуются?

            P.S. Оптимизните лучше более "горячий" код. Пользы будет на порядки больше.
            Ответить
            • дело даже не в io, это просто дурной подход с манипуляцией данными.
              Ответить
          • P.P.S. Ну, в принципе, я согласен, что так делать не оптимально. Но такого рода вещи, имхо, нужно править уже когда вылизан весь действительно "горячий" код, и больше нечем заняться.

            Буду рад выслушать ваше решение данной задачи.
            Ответить
      • >опрашивать базу в цикле

        User.objects делает запрос к базе каждый раз без кеширования?
        Ответить
        • Да.

          ps стоит заметить, что возможности к кешированию фреймворком заложены. но django не делает этого за программиста.
          Ответить
        • вы умеете кэшировать будущее?

          там как бы разные запросы.
          Ответить
    • - Спасибо большое, - впервые за многие месяцы улыбнулся он.
      Ответить

    Добавить комментарий