спасибо
С документацией я планирую подойти таким образом: я пишу в группу
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
Ситуация следующая, сделал для себя два проекта, в целях изучения
питона, и делал по быстрому, неважно как,
лишь бы взлететь. изпользовал 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> написал:
Диспатчинг (он же роутинг) в pasteob добротный, понятный и стабильный.
Годится в постоянное использование.
pasteob.auth когда будут доки будет хорош. creq из той же оперы.
pasteob.debug отличная вещь (но как я говорил проблема с зависимостями
у нескольких модулей). Там форк weberror приведенный в человеческий
вид.
Про ReqAddon еще напишу -- очень полезная штука. Да и всё остальное
можно смело использовать (кроме server, который вероятно уйдет).
2010/3/8 Алексей С. <phli...@gmail.com>:
8 марта 2010 г. 22:29 пользователь Sergey Schetinin <mal...@gmail.com> написал:
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
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.
а в самом mext.dispatсh еще куча зависимостей.
если устанавливать через setup.py
то тянет дофига всего(
25 марта 2010 г. 21:12 пользователь Sergey Schetinin <mal...@gmail.com> написал:
25 марта 2010 г. 21:19 пользователь Алексей С. <phli...@gmail.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> написал:
и по доктестам я не совсем понял есть ли хоть простая возможность
разборов динамических урлов
что то типа: /arcticles/:id где id всегда разный
25 марта 2010 г. 21:27 пользователь Sergey Schetinin <mal...@gmail.com> написал:
1. есть WSGI сервер который сам перезапускает приложение, при
изменение кода (пользуюсь wsgiref.simple_server)
2. может у вас есть тестовый пример сайта, паттерн, чтобы можно было
на его примере посмотреть и по учиться, как всё должно быть, используя
pasteob
25 марта 2010 г. 21:27 пользователь Sergey Schetinin <mal...@gmail.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> написал:
сейчас вообще всё приложение(сайт) в виде одного класса, у которого
около десятка методов,
в принципе всё как у Яна, как в его примерах.
В заметке от 12 числа он прикручивает Routes, и тут я вспоминаю что
нужно сделать диспатчеризацию по взрослому,
и вспоминаю, что хотел попробывать еще и pasteob.
вопрос такой, какой шаблон построения сайта посоветуете.
щас всё в одном классе.
25 марта 2010 г. 22:34 пользователь Sergey Schetinin <mal...@gmail.com> написал:
ЧПУ я переболел давно.
все админские и управленческие функции - всё это разруливаю через параметры.
/entry/1.html
/entry/2.html
...
можно конечно заменить на
entry.html?1
entry.html?2
правда так вроде кэш работать не будет
Пока писал пример понял, что можно бы чуть улучшить path_info_pop, напишу сразу в paste-users.
не совсем понимаю, зачем удалять часть пути, зачему урл изменять?
req.path_info_pop()
> и увязать это всё с другими приложениями:
>
> root_app = PathMap()
> root_app['/articles'] = articles_app
а зачем нужна эта промежуточная функция? ведь можно сразу делать
экземпляр обьекта, ну или
функционал этой функции перенести в __call__ метод.
Или эта функция (articles_app) что то вроде "локальной" диспетчиризации?
на уровне приложения рулит PathMap, а все остальные методы приложения
разруливает эта функция?
И это типа удобнее для тестирования и масштабирования?
Да, и зачем каждый метод в классе оборачивать декоратором, только
articles_app низя?
25 марта 2010 г. 23:32 пользователь Sergey Schetinin <mal...@gmail.com> написал:
а зачем нужна эта промежуточная функция? ведь можно сразу делать
> и увязать это всё с другими приложениями:
>
> root_app = PathMap()
> root_app['/articles'] = articles_app
экземпляр обьекта, ну или
функционал этой функции перенести в __call__ метод.
Или эта функция (articles_app) что то вроде "локальной" диспетчиризации?
на уровне приложения рулит PathMap, а все остальные методы приложения
разруливает эта функция?
И это типа удобнее для тестирования и масштабирования?
Да, и зачем каждый метод в классе оборачивать декоратором, только
articles_app низя?
Потерялось :
В articles_app уже '/article', '/100/comments'
Это видно я не всё так понял.
Я подумал что 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 приложения
Да. Читай внимательней, там это и прямым текстом несколько раз сказано
и в коде видно.
> и куда выносится методо, к примеру, получить список всех статей?
> в 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 приложения
Когда функция разростется, то можно в отдельное приложение выделить.
а если нужно удалить статью?
.....
article = ArticleApp(id)
return article.delete()
а если нужно удалить статью?>> и куда выносится методо, к примеру, получить список всех статей?
>> в 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()
а права доступа проверяются декоратором?
ArticleApp.GET_delete(ArticleApp(id))
@perms
def ArticleApp.GET_delete(self, article_object) {
....
article_object.delete()
....
}
хм, а почему GET? POST_delete по идеи, все изменения данных
производятся чере POST, ну как бы правило
если что то изменяем то это POST, если просто отдаем данные то GET
>
> --
> Группа: 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.
понятно, а вот ArticleApp наследует Autodispatch
могли бы рассказать про Autdispatch, не совсе понял
спасибо
26 марта 2010 г. 11:50 пользователь Sergey Schetinin <mal...@gmail.com> написал:
Я так понял интерфейсов и абстрактных класснов на уровне ядра в питоне
нету, а абстрактные классы реализуемы модулем ABC.
Или это не тот уровень чтобы заморачиватсья с абстрактными классами.
26 марта 2010 г. 11:50 пользователь Sergey Schetinin <mal...@gmail.com> написал:
А по идеи, если мы ArticleApp будем подсовывать разные реализации Article
нужно ведь Article наследовать от абстрактного класса или интерфейса,
где определены базовые методы.
Я так понял интерфейсов и абстрактных класснов на уровне ядра в питоне
нету, а абстрактные классы реализуемы модулем ABC.
Или это не тот уровень чтобы заморачиватсья с абстрактными классами.
27 марта 2010 г. 2:37 пользователь Sergey Schetinin <mal...@gmail.com> написал:
@wapp
artcile_app(req):
try:
return ArticleApp(Artcile())
except:
return HTTPInternalServerError()
или вообще все по другому?
27 марта 2010 г. 2:37 пользователь Sergey Schetinin <mal...@gmail.com> написал: