Показаны сообщения с ярлыком paster. Показать все сообщения
Показаны сообщения с ярлыком paster. Показать все сообщения

19 декабря 2011

Как поднять demo версию проекта на paster + virtualenv в Debian

Иногда необходимо поднять демо версию своего проекта для тестов. Склонируем наш git проект на сервер где будет демо
git clone --bare ~/myproject ssh://uralbash@myserver/~/my_project.git
Проект склонируется в домашнюю директорию сервера myserver. Ключ --bare означает что клон предназначен только для push или pull т.е. все коммиты мы будем делать у себя локально а потом пушить на сервак. Далее напишем скрипт который будет из нашего bare репозитария создавать проект для запуска демки
rm -r /home/uralbash/my_project
git clone /home/uralbash/my_project.git /home/uralbash/my_project
После этого создаем virtualenv окружение (/home/uralbash/mypythonenv/) и добавляем скрипт запуска в /etc/init.d/my_project.sh
#! /bin/sh
 
### BEGIN INIT INFO
# Required-Start:    $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the paster server
# Description:       starts paster 
### END INIT INFO
 
 
PROJECT=/home/uralbash/my_project
PID_DIR=/var/run/my_project/
PID_FILE=/var/run/my_project/paster.pid
LOG_FILE=/home/uralbash/logs/my_project/paster.log
USER=root
GROUP=root
PROD_FILE=/home/uralbash/demo.ini
RET_VAL=0
 
cd $PROJECT
 
case "$1" in
start)
../mypythonenv/bin/paster  serve \
--daemon \
--pid-file=$PID_FILE \
--log-file=$LOG_FILE \
--user=$USER \
--group=$GROUP \
$PROD_FILE \
start
 
;;
stop)
../mypythonenv/bin/paster  serve \
--daemon \
--pid-file=$PID_FILE \
--log-file=$LOG_FILE \
--user=$USER \
--group=$GROUP \
$PROD_FILE \
stop
 
;;
restart)
../mypythonenv/bin/paster  serve \
--daemon \
--pid-file=$PID_FILE \
--log-file=$LOG_FILE \
--user=$USER \
--group=$GROUP \
$PROD_FILE \
restart
 
 
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
Для того что бы не хранить пароли в репозитарии файл с настройками вынесен отдельно /home/uralbash/demo.ini

И добавляем в крон перезапуск
# выполнять каждый четный час в 00 мин
0 */2 * * *       /etc/init.d/my_project.sh stop > /dev/null
# выполнять каждый четный час в 01 мин
1 */2 * * *       /etc/init.d/my_project.sh start > /dev/null
# выполнять в 9:00
0 9 * * *       /home/uralbash/demo_update.sh > /dev/null

После этого каждый день в 9:00 будет обновляться код и каждые 2 часа перезапускаться сервер (на случай если он полег по какойто причине). Останется только периодически отправлять коммиты.

26 октября 2011

Авторизация в Pylons за 5 мин при помощи repoze.what

Статья по сути вольный перевод PylonsTemplates: extra Paster templates for Pylons apps с моими дополнениями.

PylonsTemplates дает вам дополнительные шаблоны в paster для приложений на Pylons. После установки PylonsTemplates можно создать новый проект на Pylons примерно так:
paster create -t [templatename] [projectname]

pylons_repoze_what


Шаблон pylons_repoze_what добавляет систему авторизации основанную на repoze.what и repoze.what-quickstart. (При этом аутентификация на repoze.who устанавливается автоматически.)
Шаблон включает в себя:
* Модели User, Group и Permission для SQLALchemy
* Контроллер login (& logout)
* Простой шаблон для входа
* Зависимость от repoze.what-pylons, включающая декораторы которые можно использовать в контроллерах и действиях(action).
* Закоментированный код в websetup.py который создает user, group и permission.

Список всех шаблонов:
paster create --list-templates

Создание проекта:
paster create -t pylons_repoze_what myapp

Пример с repoze.what-pylons


После создания проекта используя paster create -t pylons_repoze_what, вам нужно защитить контроллеры и их действия от несанкционированного доступа. Ниже простой пример:
from repoze.what.predicates import has_permission
from repoze.what.plugins.pylonshq import ActionProtector

class HelloWorldController(BaseController):
    @ActionProtector(has_permission('be_cool'))
    def index(self):
        return 'Hello World'
Здесь запрещен доступ к действию index всем у кого нет прав 'be_cool'. Что бы запретить весь контроллер есть декоратор ControllerProtector. Более подробно об этом можно почитать в документации на repoze.what-pylons.

У меня в шаблонах отображается постоянно кто сейчас залогирован. Что бы это сделать, создадим lib/auth.py
from pylons import request

def get_user(default):
    """Return the user object from the `repoze.who` Metadata Plugin

    :param default: default item to send back if user not logged in

    Since we might not be logged in and template choke on trying to output
    None/empty data we can pass in a blank User object to get back as a default
    and the templates should work ok with default empty values on that

    """
    if 'repoze.who.identity' in request.environ:
        return request.environ['repoze.who.identity']['user']
    else:
        return default
И добавим контекстную переменную во все контроллеры при помощи lib/base.py
from gottlieb.model.auth import User
from gottlieb.lib import auth

class BaseController(WSGIController):

    def __call__(self, environ, start_response):
        """Invoke the Controller"""
        # WSGIController.__call__ dispatches to the Controller method
        # the request is routed to. This routing information is
        # available in environ['pylons.routes_dict']

        # if there's no user set, just setup a blank instance
        c.current_user = auth.get_user(User())

        try:
            return WSGIController.__call__(self, environ, start_response)
        finally:
            meta.Session.remove()

Теперь можно в шаблоны вставлять что то вроде того(примеры на Jinja):
{% if c.current_user.user_name %} {{ c.current_user.user_name }} (logout) {% else %} login {% endif %}
или
{% for group in c.current_user.groups %}
    {% if group.group_name == 'admin' %}
        

  • Admin
  • {% endif %} {% endfor %}

    отображение залогированного пользователя

    форма авторизации