• Как подтвердить регистрацию на сайте Django по смс?

    intelligence
    @intelligence
    Простая модель со связью юзер<->пасскод для смс, целери для фоновой отправки сообщений и пересоздания задания в случае проблем с смс гейтом. Пару вьюшек для генерации и верификации кода.
    Похожие пример\куски кода можно посмотреть тут:
    https://github.com/sgurminder/django-passcode
    atodorov.org/blog/2014/03/19/sms-pin-verification-...
    Ответ написан
    Комментировать
  • Как и что вы используете в zsh (oh-my-zsh)?

    RicoX
    @RicoX
    Ушел на http://ru.stackoverflow.com/
    oh-my-zsh не пользуюсь, на zsh мой конфиг ниже:

    ~/.zshrc
    
    bindkey '^[[A' up-line-or-search                # up arrow for back-history-search
    bindkey '^[[B' down-line-or-search              # down arrow for fwd-history-search
    bindkey ';5D' backward-word                    # ctrl+left
    bindkey ';5C' forward-word                      # ctrl+right
    bindkey '\e[1~' beginning-of-line              # home
    bindkey '\e[2~' overwrite-mode                  # insert
    bindkey '\e[3~' delete-char                    # del
    bindkey '\e[4~' end-of-line                    # end
    bindkey '\e[5~' up-line-or-history              # page-up
    bindkey '\e[6~' down-line-or-history            # page-down
    
    zstyle ':completion:*' insert-tab false        # Автокомплит для первого символа
    
    HISTFILE=~/.zhistory
    ## Число команд, сохраняемых в HISTFILE
    SAVEHIST=5000
    ## Чucлo команд, coxpaняeмыx в сеансе
    HISTSIZE=5000
    DIRSTACKSIZE=20
    # Опции истории команд
    #Добавляет в историю время выполнения команды.
    setopt extended_history
    alias history='fc -il 1'
    
    #История становится общей между всеми сессиями / терминалами.
    setopt share_history
    
    # Дополнение файла истрии
    setopt  APPEND_HISTORY
    
    #Добавить команду в историю не после выполнения а перед
    setopt INC_APPEND_HISTORY
    
    # Игнopupoвaть вce пoвтopeнuя команд
    setopt  HIST_IGNORE_ALL_DUPS
    
    # Удалять из файл истории пустые строки
    setopt  HIST_REDUCE_BLANKS
    
    # команды «history» и «fc» в историю заноситься не будут
    setopt HIST_NO_STORE 
    
    # если набрали путь к директории без комманды CD, то перейти
    setopt AUTO_CD
    
    #Сообщать при изменении статуса фонового задания
    setopt NOTIFY
    
    #Перемещение стрелочками по выбору
    #setopt menucomplete
    #zstyle ':completion:*' menu select=1 _complete _ignored _approximate
    
    #Вести себя как в BASH
    setopt AUTO_MENU BASH_AUTO_LIST
    
    # исправлять неверно набранные комманды
    setopt CORRECT_ALL
    # вопрос на автокоррекцию
    SPROMPT='zsh: Заменить '\''%R'\'' на '\''%r'\'' ? [Yes/No/Abort/Edit] '
    
    # загружаем список цветов
    autoload colors && colors
    
    #Можно вводить комментарии начинающиеся с #.
    setopt interactive_comments
    
    autoload -U compinit promptinit
    compinit
    promptinit;
    #Дополняем спрятанные .файлы:
    _comp_options+=(globdots)
    
    # экранируем спецсимволы в url, например &amp;, ?, ~ и так далее
    autoload -U url-quote-magic
    zle -N self-insert url-quote-magic
    
    # Включение поддержки выражений вроде «{1-3}» или «{a-d}» — они будут разворачиваться
    # в «1 2 3» и «a b c d» соответственно
    setopt BRACECCL 
    
    # куда же мы без калькулятора
    autoload -U zcalc
    
    if [[ $EUID == 0 ]]
    then
    #Закорючки %2` означают две директории в пути.
    PROMPT=$'%{\e[1;31m%}%n %{\e[1;34m%}%2~%{\e[1;31m%} %#%{\e[0m%} '
    else
    #PROMPT=$'%{\e[1;32m%}%n %{\e[1;34m%}%~ %#%{\e[0m%} ' # root dir #
    PROMPT=$'%{\e[1;31m%}%n %{\e[1;34m%}%2~%{\e[1;31m%} %#%{\e[0m%} '
    fi
    RPROMPT=$'%{\e[1;30m%}%T% %{\e[1;36m%} %M%{\e[0m%}' # right prompt with time
    
    alias ls='ls --color=auto'
    alias grep='grep --colour=auto'
    alias df='df -k --print-type --human-readable' 
    alias du='du -k --total --human-readable' 
    alias -g  HE='2>>( sed -ue "s/.*/$fg_bold[red]&$reset_color/" 1>&2 )' # Highlight Errors
    
    # разукрашиваем команды с помощью grc
    if [ -f /usr/bin/grc ]; then
    alias ping='grc --colour=auto ping'
    alias traceroute='grc --colour=auto traceroute'
    alias make='grc --colour=auto make'
    alias diff='grc --colour=auto diff»'
    alias cvs='grc --colour=auto cvs'
    alias netstat='grc --colour=auto netstat'
    # разукрашиваем логи с помощью grc
    alias logc="grc cat"
    alias tail='grc --colour=auto tail -n 200 -f'
    alias logh="grc head"
    fi
    
    # После перехода в директорию вызываем ls. 
    function lcd() {cd "$1" && ls} 
    
    ##подключаем всякую фигню
    
    #Красивый вывод mysql
    export MYSQL_PS1="mysql: \d|> "
    # Необходимо добавить в конфиг Mysql
    # [mysql]
    # pager  = grcat ~/.grcat 
    
    #Раскраска строки ввода 
    source ~/.zsh/zsh-syntax-highlighting.zsh
    Ответ написан
    4 комментария
  • Как в Django передать данные из модели в шаблон в обход views?

    @hsc
    full stack python back-end developer
    Для начала: https://www.python.org/dev/peps/pep-0020/
    Один из пунктов там "явное лучше неявного".

    Views в django на то и придуманы чтобы передавать данные и делать это явно, но то, как это сделать всецело зависит от Вас. Вы правы, нет смысла во всех вьюхах городить огород с передачей одних и тех же данных, тем более, если они общие для большинства шаблонов, но ни custom context processor, ни тем более custom template tag Вас не выручат так, как может одна простая конструкция:

    где-нибудь в utils.py
    def base_context(request):
        return Context({
            'user': request.user,
            '...': '...',
        })


    Где-нибудь в views.py:
    def view(request):
        context = base_context(request)
        context['this view specific data'] = 'happy coding'
        return render_to_response('template.html', context)


    Таким образом Вы:
    1. Не захламляете общий request flow и сохраняете контроль над контекстом любой вьюхи. Context processors будут вызваны для любого рендера, тогда как такой подход позволит Вам всегда иметь минимум необходимых данных под рукой и полный контроль над всеми вьюхами.

    2. Передаете в контекст шаблонизатора только, что действительно должно в него попасть. Больше того, в отдельных вьюхах Вы даже можете переопределить базовые параметры, что не так удобно делать с context processors. (но лучше см. п.3)

    3. Можете расширить абстракцию как угодно, и создать хоть 2, хоть 3, хоть больше базовых контекстов под всевозожные ситуации (зависит от архитектуры).
    Ответ написан
    Комментировать
  • Что почитать про нормализацию БД?

    leahch
    @leahch
    3D специалист. Dолго, Dорого, Dерьмово.
    В принципе учебник для этого не нужен, нормализация - минимизация избыточности данных, имеет 5 форм. Первые три формы нацелены на связанность данных, две последних на улучшение структуры. Очень хорошо описано здесь - citforum.ru/database/dblearn/index.shtml (главы 6 и 7)
    Кратко здесь - support.microsoft.com/kb/283878/ru

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

    А вот и видео неплохое - www.youtube.com/watch?v=1GWx5CZdSCg
    Ответ написан
    Комментировать