Змея / Говнокод #12499 Ссылка на оригинал

0

  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 Kakashulenka, (Updated )

Комментарии (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? А потому что емейлов с одинаковым префиксом не так много как кажется. Ну будет vasya@mail.ru, vasya@gmail.com ну еще штуки 2-3..., а тут и популярные домены кончились. Поэтому цикл отработает быстро, в 99% случаев за 1 итерацию.

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

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

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

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

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

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

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

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8