Проект PasteOb

7 views
Skip to first unread message

u960

unread,
Mar 8, 2010, 12:17:04 PM3/8/10
to Пишем на Python лучше
Интересует судьба проекта, его будущее, и вообще чем он лучше Paste.
А то не совсем разобрался. В данный момент хочу использовать
paste.auth из Paste.

спасибо

Sergey Schetinin

unread,
Mar 8, 2010, 12:58:31 PM3/8/10
to better-p...@googlegroups.com
Проект активно развивается и используется лично мной, но насколько я
знаю пока что только мной. Причиной тому 1) недостаток документации,
2) то, что есть места где работа еще не окончена (например в
pasteob.auth часть кода приведена к новому API, а часть лежит ожидая
рефакторинга). С одной стороны доделать все "хвосты" нетрудно, но
поскольку использую его вроде как только я, то делаю я это тогда,
когда оно мне нужно. Поэтому же 3) можно найти и пару модулей которые
зависят от моего проприетарного кода (например в pasteob.debug есть
зависимость от mext.sendmail)

С документацией я планирую подойти таким образом: я пишу в группу
paste-users краткие обзоры модулей и потом, с учетом возникающих
вопросов (если какие-то будут) составляю из этих обзоров доки.

Теперь про собственно разницу. Paste сделан таким образом, что
функциональность нужная в нем есть, но использовать её, на мой взгляд,
не всегда удобно. В pasteob куча всего выкинуто, благодаря webob сам
код понятней и API очень простые. Вообще само разбиение на компоненты
сделано в pasteob, по моему мнению, умнее и чище. Ну и PasteDeploy в
pasteob умышленно никак не поддерживается.

В целом, если pasteob интересен, то я бы предложил во-первых
подписаться на http://groups.google.com/group/paste-users, во-вторых
просмотреть исходники (как минимум pasteob/__init__.py) и доктесты
http://bitbucket.org/mlk/pasteob/src/tip/tests/PasteOb.txt. В-третьих,
рассмотреть возможность выдирания нужных кусков кода -- код там
компактный и без "спагетти", так что скопировать нужное себе в проект
это нормальный вариант.

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

И насчет собственно части auth. Приведены к общему API там appengine
(которого в paste нет), auth_tkt (плюс фиксы, оригинал в paste шалит
при работе с кукизами) и basic. Остальными еще не занимался. Как с
этим всем оптимально работать без доки навеное будет непонятно, но я
как раз собрался в paste-users на неделе обьяснить.

paste.auth работает, но как-то тихо про него -- или так хорошо
работает или так мало используют. Я в свое время пользовался, но API
был категорически недоволен. Если хочется готового и чтоб с кучей фич,
то надо еще смотреть на repoze.who и еще несколько вариантов. Сам их
не использовал, но может кто из присутствующих подскажет.

2010/3/8 u960 <phli...@gmail.com>:

> --
> Группа: http://groups.google.com/group/better-python-ru
> Отписка: better-python-...@googlegroups.com

--
Best Regards,
Sergey Schetinin

http://s3bk.com/ -- S3 Backup
http://word-to-html.com/ -- Word to HTML Converter

Алексей С.

unread,
Mar 8, 2010, 2:10:29 PM3/8/10
to better-p...@googlegroups.com
понятно, исходники гляну, доктесты тоже.

Ситуация следующая, сделал для себя два проекта, в целях изучения
питона, и делал по быстрому, неважно как,
лишь бы взлететь. изпользовал webob, tempita, antiorm(http://furius.ca/antiorm/)

1. потом решил что нужно бы закрыть админский функционал в виде
решения: декоратор + paste.auth.basic

2. потом подумал что неплохо бы какой нить роутинг несложный стал
присматриваться к
Selector(http://pypi.python.org/pypi/selector/0.8.7), хотя возможно
что то из Paste подойдет, но не факт, сейчас тупо регулярками разбираю
урл в __call__ методе.

3. потом решил что нужно сделать нормульную обработку форм и стал
приглядываться к FormEncode.htmlfill


к чему это я всё - хочу выбрать инструменты, для изучения и
изпользования, чтобы потом быстро создавать приложения.
и стоит ли в это многообразие втягивать pasteob.

8 марта 2010 г. 20:58 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Sergey Schetinin

unread,
Mar 8, 2010, 2:29:44 PM3/8/10
to better-p...@googlegroups.com
Да, стоит. У pasteob соотношение отдача / время_на_изучение очень
высокое. Ну и Paste я даже не устанавливаю теперь, мне оттуда ничего
не нужно.

Диспатчинг (он же роутинг) в pasteob добротный, понятный и стабильный.
Годится в постоянное использование.

pasteob.auth когда будут доки будет хорош. creq из той же оперы.

pasteob.debug отличная вещь (но как я говорил проблема с зависимостями
у нескольких модулей). Там форк weberror приведенный в человеческий
вид.

Про ReqAddon еще напишу -- очень полезная штука. Да и всё остальное
можно смело использовать (кроме server, который вероятно уйдет).

2010/3/8 Алексей С. <phli...@gmail.com>:

Алексей С.

unread,
Mar 8, 2010, 2:36:57 PM3/8/10
to better-p...@googlegroups.com
понятно, хорошо.
буду ждать доки в paste-users и смотреть исходники

8 марта 2010 г. 22:29 пользователь Sergey Schetinin <mal...@gmail.com> написал:

u960

unread,
Mar 25, 2010, 11:48:54 AM3/25/10
to Пишем на Python лучше
хм, а что без целой библиотеки mext нельзя даже декораторы
попробывать?


On 8 мар, 22:29, Sergey Schetinin <mal...@gmail.com> wrote:
> Да, стоит. У pasteob соотношение отдача / время_на_изучение очень
> высокое. Ну и Paste я даже не устанавливаю теперь, мне оттуда ничего
> не нужно.
>
> Диспатчинг (он же роутинг) в pasteob добротный, понятный и стабильный.
> Годится в постоянное использование.
>
> pasteob.auth когда будут доки будет хорош. creq из той же оперы.
>
> pasteob.debug отличная вещь (но как я говорил проблема с зависимостями
> у нескольких модулей). Там форк weberror приведенный в человеческий
> вид.
>
> Про ReqAddon еще напишу -- очень полезная штука. Да и всё остальное
> можно смело использовать (кроме server, который вероятно уйдет).
>

> 2010/3/8 Алексей С. <phlin...@gmail.com>:

> >> подписаться наhttp://groups.google.com/group/paste-users, во-вторых


> >> просмотреть исходники (как минимум pasteob/__init__.py) и доктесты
> >>http://bitbucket.org/mlk/pasteob/src/tip/tests/PasteOb.txt. В-третьих,
> >> рассмотреть возможность выдирания нужных кусков кода -- код там
> >> компактный и без "спагетти", так что скопировать нужное себе в проект
> >> это нормальный вариант.
>
> >> В целом от тех частей которые задокументированы можно ожидать
> >> стабильности, апгрейд ничего не поломает, а вот остальное я могу еще
> >> менять -- пока пользователей нет или мало, я использую это по полной.
>
> >> И насчет собственно части auth. Приведены к общему API там appengine
> >> (которого в paste нет), auth_tkt (плюс фиксы, оригинал в paste шалит
> >> при работе с кукизами) и basic. Остальными еще не занимался. Как с
> >> этим всем оптимально работать без доки навеное будет непонятно, но я
> >> как раз собрался в paste-users на неделе обьяснить.
>
> >> paste.auth работает, но как-то тихо про него -- или так хорошо
> >> работает или так мало используют. Я в свое время пользовался, но API
> >> был категорически недоволен. Если хочется готового и чтоб с кучей фич,
> >> то надо еще смотреть на repoze.who и еще несколько вариантов. Сам их
> >> не использовал, но может кто из присутствующих подскажет.
>

> >> 2010/3/8 u960 <phlin...@gmail.com>:


> >>> Интересует судьба проекта, его будущее, и вообще чем он лучше Paste.
> >>> А то не совсем разобрался. В данный момент хочу использовать
> >>> paste.auth из Paste.
>
> >>> спасибо
>
> >>> --
> >>> Группа:http://groups.google.com/group/better-python-ru
> >>> Отписка: better-python-...@googlegroups.com
>
> >> --
> >> Best Regards,
> >> Sergey Schetinin
>
> >>http://s3bk.com/-- S3 Backup

> >>http://word-to-html.com/-- Word to HTML Converter

Sergey Schetinin

unread,
Mar 25, 2010, 2:12:55 PM3/25/10
to better-python-ru
Можно.

2010/3/25 u960 <phli...@gmail.com>
To unsubscribe from this group, send email to better-python-ru+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.



--
Best Regards,
Sergey Schetinin

Алексей С.

unread,
Mar 25, 2010, 2:19:22 PM3/25/10
to better-p...@googlegroups.com
ну даже незнаю. когда я хочу воспользоваться диспачером то вижу такое
from mext.dispatch import Adapter

а в самом mext.dispatсh еще куча зависимостей.

если устанавливать через setup.py
то тянет дофига всего(

25 марта 2010 г. 21:12 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Алексей С.

unread,
Mar 25, 2010, 2:26:18 PM3/25/10
to better-p...@googlegroups.com
ну да, библиотек 10 вытянул(

25 марта 2010 г. 21:19 пользователь Алексей С. <phli...@gmail.com> написал:

Sergey Schetinin

unread,
Mar 25, 2010, 2:27:12 PM3/25/10
to better-python-ru
Конкретно для декоратора эти зависимости не нужны, так что можно просто скопировать его себе в код.

А вообще в зависимостях нет ничего страшного. Там пакеты по одному модулю по большей части.


2010/3/25 Алексей С. <phli...@gmail.com>

Алексей С.

unread,
Mar 25, 2010, 2:31:35 PM3/25/10
to better-p...@googlegroups.com
вы уже извините, я конечно может туплю нереально.
но

class webob_wrap(object):
....
req = Request(env)
try:
app = WSGI(self.func(req))
......

WSGI = Adapter('__wsgi__')
WSGI[None] = lambda none: HTTPNotFound()


from mext.dispatch import Adapter


25 марта 2010 г. 21:27 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Алексей С.

unread,
Mar 25, 2010, 2:36:15 PM3/25/10
to better-p...@googlegroups.com
диспетчеризация тоже хочет сторонние библиотеки
from mext.uri import Uri

и по доктестам я не совсем понял есть ли хоть простая возможность
разборов динамических урлов
что то типа: /arcticles/:id где id всегда разный

25 марта 2010 г. 21:27 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Алексей С.

unread,
Mar 25, 2010, 2:45:23 PM3/25/10
to better-p...@googlegroups.com
и еще парочка вопросов:

1. есть WSGI сервер который сам перезапускает приложение, при
изменение кода (пользуюсь wsgiref.simple_server)

2. может у вас есть тестовый пример сайта, паттерн, чтобы можно было
на его примере посмотреть и по учиться, как всё должно быть, используя
pasteob

25 марта 2010 г. 21:27 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Sergey Schetinin

unread,
Mar 25, 2010, 3:00:42 PM3/25/10
to better-python-ru
Там можно WSGI убрать, он там для адаптации не-WSGI обьектов к WSGI.

app = WSGI(self.func(req))

замени на

app = self.func(req)
if app is None:
    app = HTTPNotFound()

В целом может и сам декоратор к такому виду верну. Адаптацию-то можно и вручную делать.


2010/3/25 Алексей С. <phli...@gmail.com>

Sergey Schetinin

unread,
Mar 25, 2010, 3:02:30 PM3/25/10
to better-python-ru
Для диспечеризации надо разобраться с script_path / path_info, в webob есть вспомогательные методы path_info_peek, path_info_pop. Вот с их помощью это делается.

2010/3/25 Алексей С. <phli...@gmail.com>

Sergey Schetinin

unread,
Mar 25, 2010, 3:03:40 PM3/25/10
to better-python-ru
К сожалению сейчас таких примеров нет.

2010/3/25 Алексей С. <phli...@gmail.com>

Алексей С.

unread,
Mar 25, 2010, 3:11:00 PM3/25/10
to better-p...@googlegroups.com
я разбирался вот таким быдло кодом:

if req.path_info_peek():
r = re.compile(r'^([0-9]+)\.html$')
find = r.findall(req.path_info_peek())
if len(find):
req.GET['action'] = 'view'
req.GET['entry'] = int(find[0])

if req.path_info_peek() == 'submit.html':
req.GET['action'] = 'submit'

action = req.params.get('action', 'index')

и надеялся увидеть что то типа такого

s = Selector()
s.add('/myapp/hello/{name}', GET=say_hello)
s.add('/archives/{year}/{month}', GET=load_archive)

25 марта 2010 г. 22:02 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Sergey Schetinin

unread,
Mar 25, 2010, 3:34:41 PM3/25/10
to better-python-ru
Поскольку тут у нас приложение "окончательное", то есть путь разбираем до конца, то можно смотреть просто на path_info.
Ну и с регекспами можно компактней.

m = re.match(r'/(\d+)\.html', req.path_info)
if m:
    entry_id = int(m.group(1))
    return ViewEntryApp(entry_id) # вот так лучше

Вместо того чтобы проталкивать данные в GET лучше сделать отдельно приложение в виде класса который принимает при инициализации номер записи. Особенно если делать урлы в стиле REST: /entry/1, /entry/1/edit, /entry/1/metadata итп

Как в селекторе разбора нет, но если хочется можно же самому сделать, там мизерное количество кода потребуется.


2010/3/25 Алексей С. <phli...@gmail.com>

Алексей С.

unread,
Mar 25, 2010, 4:15:18 PM3/25/10
to better-p...@googlegroups.com
Так, а можно по порядку.
что посоветуете.

сейчас вообще всё приложение(сайт) в виде одного класса, у которого
около десятка методов,
в принципе всё как у Яна, как в его примерах.

В заметке от 12 числа он прикручивает Routes, и тут я вспоминаю что
нужно сделать диспатчеризацию по взрослому,
и вспоминаю, что хотел попробывать еще и pasteob.

вопрос такой, какой шаблон построения сайта посоветуете.
щас всё в одном классе.

25 марта 2010 г. 22:34 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Алексей С.

unread,
Mar 25, 2010, 4:19:25 PM3/25/10
to better-p...@googlegroups.com
25 марта 2010 г. 22:34 пользователь Sergey Schetinin <mal...@gmail.com> написал:

> Поскольку тут у нас приложение "окончательное", то есть путь разбираем до
> конца, то можно смотреть просто на path_info.
> Ну и с регекспами можно компактней.
>
> m = re.match(r'/(\d+)\.html', req.path_info)
> if m:
>     entry_id = int(m.group(1))
>     return ViewEntryApp(entry_id) # вот так лучше
>
> Вместо того чтобы проталкивать данные в GET лучше сделать отдельно
> приложение в виде класса который принимает при инициализации номер записи.
> Особенно если делать урлы в стиле REST: /entry/1, /entry/1/edit,
> /entry/1/metadata итп

ЧПУ я переболел давно.
все админские и управленческие функции - всё это разруливаю через параметры.

/entry/1.html
/entry/2.html
...
можно конечно заменить на
entry.html?1
entry.html?2

правда так вроде кэш работать не будет

Sergey Schetinin

unread,
Mar 25, 2010, 4:32:21 PM3/25/10
to better-python-ru
Хм, ну кеш не от того зависит в общем-то, там главное заголовки правильные послать. Про кеширование вот можно почитать: http://www.mnot.net/cache_docs/

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


Насчет как сайт лучше сделать -- лучше выделить типы обьектов реально в классы. То есть допустим есть статья, которую можно смотреть, править, удалять. Тогда можно сделать например так:

class ArticleApp(Autodispatch):
    def __init__(self, id):
        self.id = id
  
    @wapp
    def GET(self, req):
        body = db.query(article_id == self.id) # условно
        return ...

    @wapp
    def ANY_edit(self, req):
        ...
    # и всякие GET_comments, GET_comments_rss итд итп

Дальше надо экземпляры этого класса откуда-то брать. Например так:

@wapp
def articles_app(req):
    id = req.path_info_peek()
    if id.isdigit():
        req.path_info_pop()
        return ArticleApp(int(id))


и увязать это всё с другими приложениями:

root_app = PathMap()
root_app['/articles'] = articles_app
root_app[...] = ...

serve(root_app)


Пока писал пример понял, что можно бы чуть улучшить path_info_pop, напишу сразу в paste-users.



2010/3/25 Алексей С. <phli...@gmail.com>

Sergey Schetinin

unread,
Mar 25, 2010, 4:47:55 PM3/25/10
to better-python-ru

Пока писал пример понял, что можно бы чуть улучшить path_info_pop, напишу сразу в paste-users.


Вот оно: http://bitbucket.org/ianb/webob/changeset/45dc8e052537/
http://groups.google.com/group/paste-users/browse_thread/thread/d93786daf00ff704

Алексей С.

unread,
Mar 25, 2010, 5:29:58 PM3/25/10
to better-p...@googlegroups.com
25 марта 2010 г. 23:32 пользователь Sergey Schetinin <mal...@gmail.com> написал:

не совсем понимаю, зачем удалять часть пути, зачему урл изменять?
req.path_info_pop()


> и увязать это всё с другими приложениями:
>
> root_app = PathMap()
> root_app['/articles'] = articles_app

а зачем нужна эта промежуточная функция? ведь можно сразу делать
экземпляр обьекта, ну или
функционал этой функции перенести в __call__ метод.

Или эта функция (articles_app) что то вроде "локальной" диспетчиризации?
на уровне приложения рулит PathMap, а все остальные методы приложения
разруливает эта функция?

И это типа удобнее для тестирования и масштабирования?


Да, и зачем каждый метод в классе оборачивать декоратором, только
articles_app низя?

Sergey Schetinin

unread,
Mar 25, 2010, 5:40:28 PM3/25/10
to better-python-ru


2010/3/25 Алексей С. <phli...@gmail.com>
25 марта 2010 г. 23:32 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Для того чтобы дальнейший диспатчинг этого куска уже не видел. Ну например если путь /article/100/comments, то в root_app script_name / path_info будут '', '/article/100/comments'

В articles_app уже

Когда дойдет до ArticleApp.__call__, то уже '/article/100', '/comments'

И скажем на /comments при желании можно очередной PathMap нахлобучить -- они все работают в любом месте пути, как раз благодаря что мы меняем path_info

 


> и увязать это всё с другими приложениями:
>
> root_app = PathMap()
> root_app['/articles'] = articles_app

а зачем нужна эта промежуточная функция? ведь можно сразу делать
экземпляр обьекта, ну или
функционал этой функции перенести в __call__ метод.


Какого обьекта? Который ArticleApp? Так таких обьектов по штуке на каждую статью (понятно создаются и удаляются по мере надобности).

 
Или эта функция (articles_app) что то вроде "локальной" диспетчиризации?
на уровне приложения рулит PathMap, а все остальные методы приложения
разруливает эта функция?

И это типа удобнее для тестирования и масштабирования?


Похоже я не понимаю вопрос. Приведи код, какая собственно альтернатива?
 

Да, и зачем каждый метод в классе оборачивать декоратором, только
articles_app низя?


Оборачивать надо потому что все эти методы превращаются в WSGI приложения. А мы хотим чтобы они в них превращались потому что мы всё время работаем на этом уровне. Эти повторения декораторов окупаются с лихвой вот например потому что любой из методов мы можем заменить допустим вот так:

class ArticlesApp(...):
      ...
      @property
      def GET_comments(self):
          return HTTPPermanentRedirect(location='http://intensedebate.....' % self.id)
  
или вообще что нибудь эдакое

     GET_media = DirectoryApp('/www/static')



 

Sergey Schetinin

unread,
Mar 25, 2010, 5:42:01 PM3/25/10
to better-python-ru
> Для того чтобы дальнейший диспатчинг этого куска уже не видел. Ну например если путь /article/100/comments, то в root_app script_name / path_info будут '', '/article/100/comments'

Потерялось :
В articles_app уже '/article', '/100/comments'

Алексей С.

unread,
Mar 25, 2010, 6:21:17 PM3/25/10
to better-p...@googlegroups.com
26 марта 2010 г. 0:40 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Это видно я не всё так понял.
Я подумал что ArticleApp это целиком WSGI приложение то есть

class ArticleApp() {
@wapp
def __call__(self, reg) {


r = re.compile(r'^([0-9]+)\.html$')
find = r.findall(req.path_info_peek())
if len(find):
req.GET['action'] = 'view'
req.GET['entry'] = int(find[0])

if req.path_info_peek() == 'submit.html':
req.GET['action'] = 'submit'

return getattr(self, req.GET['action']) // ну что нить эдакое
}

def edit(self, req):
return Response()

def view(self, req):
return Response()

def GET_ALL_ARTICLES(self, req):
return Response()

def UPDATE_RSS(self, req):
return Response()

def SUBSCRIBE(self, req):
return Response()
....
ну и вообще всё что можно запихать сюда по смыслу+)
}

root_app = PathMap()
root_app['/articles'] = ArticlesApp()


А получается что экземляр класса ArticlesApp это только одна статья
на каждую статью делается свой обьект?

и куда выносится методо, к примеру, получить список всех статей?
в articles_app?

@wapp
def articles_app(req):
id = req.path_info_peek()
if id.isdigit():
req.path_info_pop()
return ArticleApp(int(id))

else:
articles = Article.select(db.cursor, 'ORDR BY id')
body = template.render('all.html', select)
return Response(body)

и так далее

или выборка всех статей оформляется в виде отдельного WSGI приложения

Sergey Schetinin

unread,
Mar 25, 2010, 6:25:14 PM3/25/10
to better-python-ru
2010/3/26 Алексей С. <phli...@gmail.com>:

Да. Читай внимательней, там это и прямым текстом несколько раз сказано
и в коде видно.

> и куда выносится методо, к примеру, получить список всех статей?
> в articles_app?
>
>  @wapp
>  def articles_app(req):
>     id = req.path_info_peek()
>     if id.isdigit():
>         req.path_info_pop()
>         return ArticleApp(int(id))
>     else:
>         articles = Article.select(db.cursor, 'ORDR BY id')
>         body = template.render('all.html', select)
>         return Response(body)
>
>      и так далее

Можно так.

> или выборка всех статей оформляется в виде отдельного WSGI приложения

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

Алексей С.

unread,
Mar 25, 2010, 7:00:31 PM3/25/10
to better-p...@googlegroups.com
26 марта 2010 г. 1:25 пользователь Sergey Schetinin <mal...@gmail.com> написал:

а если нужно удалить статью?
.....
article = ArticleApp(id)
return article.delete()

Sergey Schetinin

unread,
Mar 25, 2010, 7:06:55 PM3/25/10
to better-python-ru
>> и куда выносится методо, к примеру, получить список всех статей?
>> в articles_app?
>>
>>  @wapp
>>  def articles_app(req):
>>     id = req.path_info_peek()
>>     if id.isdigit():
>>         req.path_info_pop()
>>         return ArticleApp(int(id))
>>     else:
>>         articles = Article.select(db.cursor, 'ORDR BY id')
>>         body = template.render('all.html', select)
>>         return Response(body)
>>
>>      и так далее
>
> Можно так.

а если нужно удалить статью?
.....
article = ArticleApp(id)
return article.delete()


Можно и так.

Я обычно делаю отдельный класс Article, который никакого отношения к WSGI не имеет.
Потом класс ArticleApp который принимает не id а собственно обьект Article (так можно подсовывать ему другие реализации, которые вообще с базой не связаны например) и работает через его методы.

Ну и тогда для удаления дается ссылка на путь по типу /article/100/delete и ArticleApp.GET_delete который проверяет есть ли у пользователя права, переспрашивает если нужно итп.

Алексей С.

unread,
Mar 26, 2010, 4:40:12 AM3/26/10
to better-p...@googlegroups.com
26 марта 2010 г. 2:06 пользователь Sergey Schetinin <mal...@gmail.com> написал:

а права доступа проверяются декоратором?
ArticleApp.GET_delete(ArticleApp(id))

@perms
def ArticleApp.GET_delete(self, article_object) {
....
article_object.delete()
....
}

хм, а почему GET? POST_delete по идеи, все изменения данных
производятся чере POST, ну как бы правило
если что то изменяем то это POST, если просто отдаем данные то GET

Sergey Schetinin

unread,
Mar 26, 2010, 4:42:31 AM3/26/10
to better-python-ru


2010/3/26 Алексей С. <phli...@gmail.com>

Это просто пример.
 

>
> --
> Группа: http://groups.google.com/group/better-python-ru
> Отписка: better-python-...@googlegroups.com
>
> To unsubscribe from this group, send email to
> better-python-ru+unsubscribegooglegroups.com or reply to this email with the
> words "REMOVE ME" as the subject.
>

--
Группа: http://groups.google.com/group/better-python-ru
Отписка: better-python-...@googlegroups.com

To unsubscribe from this group, send email to better-python-ru+unsubscribegooglegroups.com or reply to this email with the words "REMOVE ME" as the subject.

Алексей С.

unread,
Mar 26, 2010, 4:48:44 AM3/26/10
to better-p...@googlegroups.com
26 марта 2010 г. 11:42 пользователь Sergey Schetinin <mal...@gmail.com> написал:

понятно, а вот ArticleApp наследует Autodispatch
могли бы рассказать про Autdispatch, не совсе понял
спасибо

Sergey Schetinin

unread,
Mar 26, 2010, 4:50:31 AM3/26/10
to better-python-ru
У него обширный докстринг, плюс в paste-users о нем было.

http://bitbucket.org/mlk/pasteob/src/tip/pasteob/dispatch.py#cl-154

Алексей С.

unread,
Mar 26, 2010, 4:51:56 AM3/26/10
to better-p...@googlegroups.com
ок. буду разбираться

26 марта 2010 г. 11:50 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Алексей С.

unread,
Mar 26, 2010, 7:27:43 AM3/26/10
to better-p...@googlegroups.com
А по идеи, если мы ArticleApp будем подсовывать разные реализации Article
нужно ведь Article наследовать от абстрактного класса или интерфейса,
где определены базовые методы.

Я так понял интерфейсов и абстрактных класснов на уровне ядра в питоне
нету, а абстрактные классы реализуемы модулем ABC.

Или это не тот уровень чтобы заморачиватсья с абстрактными классами.

26 марта 2010 г. 11:50 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Sergey Schetinin

unread,
Mar 26, 2010, 7:37:07 PM3/26/10
to better-python-ru
2010/3/26 Алексей С. <phli...@gmail.com>

А по идеи, если мы ArticleApp будем подсовывать разные реализации Article
нужно ведь Article наследовать от абстрактного класса или интерфейса,
где определены базовые методы.

Не обязательно. Достаточно определиться (в идеале задокументировать) с интерфейсом и его реализовать. ArticleApp будет вызывать методы да смотреть атрибуты, до базовых классов ему дела никакого.
 
Я так понял интерфейсов и абстрактных класснов на уровне ядра в питоне
нету, а абстрактные классы реализуемы модулем ABC.

Или это не тот уровень чтобы заморачиватсья с абстрактными классами.

Не, заморачиваться не надо.
 

Алексей С.

unread,
Mar 28, 2010, 6:14:08 AM3/28/10
to better-p...@googlegroups.com
только начал разбиратсья с Autodispatch, а вы уже и тесты добавили спасибо.
по ReqAddon, чувствую у меня будет много вопросов=) только чуть позже

27 марта 2010 г. 2:37 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Алексей С.

unread,
Mar 30, 2010, 7:17:03 AM3/30/10
to better-p...@googlegroups.com
А как должны обрабатываться ошибки, на каком уровне?
Class ArticleApp(autodispatch):
def __init__(self, obj):
if not isinstance(obj, Article):
raise Exception # или уже тут должно отдаваться WSGI
oшибка то бишь return HTTPInternalServerError()
....

@wapp
artcile_app(req):
try:
return ArticleApp(Artcile())
except:
return HTTPInternalServerError()

или вообще все по другому?


27 марта 2010 г. 2:37 пользователь Sergey Schetinin <mal...@gmail.com> написал:

Sergey Schetinin

unread,
Mar 30, 2010, 7:23:24 AM3/30/10
to better-p...@googlegroups.com
Не вижу зачем проверять тип переданного обьекта. Если код написан с ошибками и вылетит необработанное исключение сервер сам справится и выдаст пользователю 500 server error.

Так что в этом смысле обрабатывать ошибки не надо.

2010/3/30 Алексей С. <phli...@gmail.com>
Reply all
Reply to author
Forward
0 new messages