<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Pylons 0.9.4</title>
    <link>http://blog.zabiello.com/articles/2006/12/31/pylons-0-9-4</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Pylons 0.9.4</title>
      <description>&lt;p&gt;Wysz&#322;a nowa wersja pythonowego megaframeworka (korzysta z zewn., ju&#380; istniej&#261;cych bibliotek) do szybkiego budowania aplikacji webowych &amp;#8211; &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt;. W wersji 0.9.4 &lt;a href="http://groups.google.com/group/pylons-discuss/browse_thread/thread/1f05fee97b1e5217/2147ea572dc235b5?hl=en#2147ea572dc235b5"&gt;dodano troch&#281; poprawek i ulepsze&#324;&lt;/a&gt;. M.in. jest nowy &lt;a href="http://routes.groovie.org/"&gt;Routes&lt;/a&gt; 1.6.1, ulepszono introspekcj&#281; dla &lt;span class="caps"&gt;XML&lt;/span&gt;-RPC,Akcje kontroler&#243;w s&#261; teraz generatorami a helpery oraz metoda _ (z gettext) generuj&#261; teraz obiekty Unicodowe zamiast string&#243;w &lt;span class="caps"&gt;UTF&lt;/span&gt;-8. Znowu Pylons znacznie wyprzedza, to co dopiero jest w powijakach dla &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;SQLAlchemy&lt;/h3&gt;


	&lt;p&gt;Coraz bardziej zaznacza si&#281; tendencja w u&#380;ywanych pod Pythonem &lt;span class="caps"&gt;ORM&lt;/span&gt;&amp;#8217;ach (Pylons mo&#380;e korzysta&#263; z dowolnych) aby zamiast &lt;a href="http://www.sqlobject.org/"&gt;SQLObject&lt;/a&gt; wybiera&#263; raczej &lt;a href="http://www.sqlalchemy.org/"&gt;SQLAlchemy&lt;/a&gt;. Ten drugi jest uwa&#380;any za znacznie bardziej wyrafinowany i o wi&#281;kszych mo&#380;liwo&#347;ciach. Na li&#347;cie dyskusyjnej Pylons&#243;w Ben Bangert pokaza&#322; &lt;a href="http://groups.google.com/group/pylons-discuss/browse_thread/thread/1f05fee97b1e5217/2147ea572dc235b5?hl=en#2147ea572dc235b5"&gt;jak w praktyce mo&#380;na u&#380;ywa&#263; SQLAlchemy&lt;/a&gt;.&lt;/p&gt;


	&lt;h3&gt;Szablony&lt;/h3&gt;


	&lt;p&gt;Pylons potrafi korzysta&#263; z dowolnych system&#243;w szablon&#243;w dost&#281;pnych dla 
Pythona. Generalnie, popularne s&#261; dwa podej&#347;cia. Szablony pisane pod propgramist&#243;w lub pod webmaster&#243;w/designer&#243;w, kt&#243;rzy zajmuj&#261; si&#281; sam&#261; kwesti&#261; prezentacji, wizualizacji i pracuj&#261; najcz&#281;&#347;ciej ze &amp;#8220;wspomagaczami&amp;#8221; takimi jak edytor Dreamweaver.&lt;/p&gt;


	&lt;p&gt;Dla tych drugich, polecane jest podej&#347;cie albo takie jak promuje Django, czyli &lt;a href="http://www.djangoproject.com/documentation/templates/"&gt;specjalnie uproszczony j&#281;zyk szablon&#243;w&lt;/a&gt; umo&#380;liwiaj&#261;cym generowanie zar&#243;no &lt;span class="caps"&gt;HTML&lt;/span&gt; jak i &lt;span class="caps"&gt;CSS&lt;/span&gt;, czy innej dowolnej tre&#347;ci.&lt;/p&gt;


	&lt;p&gt;Albo podej&#347;cie jeszcze bardziej uproszczone (dla designer&#243;w, nie dla programist&#243;w), czyli koncepcja, jak&#261; promuj&#261; tw&#243;rcy frameworka &lt;a href="http://zope.org"&gt;Zope&lt;/a&gt;. Chodzi o szablony &lt;a href="http://www.zope.org/Documentation/ZopeBook/ZPT.stx"&gt;&lt;span class="caps"&gt;ZPT&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://kid-templating.org/"&gt;Kid&lt;/a&gt; czy &lt;a href="http://genshi.edgewall.org/"&gt;Genshi&lt;/a&gt; gdzie logika szablon&#243;w jest dodana do atrybut&#243;w. Dzi&#281;ki temu s&#261; one przezroczyste dla edytor&#243;w takich jak Dreamweaver i je&#347;li wymagana jest cz&#281;sta konsultacja z designerami to takie podej&#347;cie oszcz&#281;dza ponownego, r&#281;cznego dodawania logiki dla programist&#243;w.&lt;/p&gt;


	&lt;h3&gt;Nadchodzi Mako&lt;/h3&gt;


	&lt;p&gt;Moim zdaniem, znacznie lepszym podej&#347;ciem jest podej&#347;cie jakie oferuj&#261; szablony &lt;a href="http://www.cheetahtemplate.org/"&gt;Cheetah&lt;/a&gt; czy &lt;a href="http://myghty.org"&gt;Myghty&lt;/a&gt;. Te drugie, s&#261; aktualnie najpote&#380;niejsze. Maj&#261; nie tylko du&#380;a szybko&#347;&#263;, ale bardzo dobrze dzia&#322;aj&#261;cy (lepszy od Cheetah) cache oraz &#322;atwo&#347;&#263; do tworzenia komponent&#243;w, klock&#243;w wielokrotnego u&#380;ycia.&lt;/p&gt;


	&lt;p&gt;Nadchodzi jednak co&#347; jeszcze lepszego. Developerzy Pylons&#243;w szykuj&#261; zupe&#322;nie nowy system szablon&#243;w zwany Mako (&lt;a href="http://makotemplates.org"&gt;http://makotemplates.org&lt;/a&gt;). Jest on wzorowany na najlepszych funkcjach jakie oferuj&#261; Myghty, Cheetah, Genshi i Django. Jest te&#380; bardzo szybki.&lt;/p&gt;


	&lt;p&gt;Mako oferuj&#261; wielostrefowe dziedziczenie (podobnie jak Cheetah i Django). Nie jest te&#380; wymagane tak jak w Myghty, aby wstawki Pythona (zaczynaj&#261;ce si&#281; w szablonach Myghty od znaku procenta) zaczyna&#322;y wiersz. Mo&#380;na wstawia&#263; je w &#347;rodku tekstu lub gdziekolwiek w ramach tag&#243;w &amp;lt;% kod Pythona %&amp;gt;.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="ident"&gt;inherit&lt;/span&gt; &lt;span class="ident"&gt;file&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;base.html&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;/&amp;gt;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;%&lt;/span&gt;
    &lt;span class="ident"&gt;rows&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[[&lt;/span&gt;&lt;span class="ident"&gt;v&lt;/span&gt; &lt;span class="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;v&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;range&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;)]&lt;/span&gt; &lt;span class="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;row&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;range&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;0&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;)]&lt;/span&gt;
&lt;span class="punct"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="string"&gt;
&amp;lt;table&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="punct"&gt;%&lt;/span&gt; &lt;span class="keyword"&gt;for&lt;/span&gt; &lt;span class="ident"&gt;row&lt;/span&gt; &lt;span class="keyword"&gt;in&lt;/span&gt; &lt;span class="ident"&gt;rows&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
        &lt;span class="global"&gt;${&lt;/span&gt;&lt;span class="ident"&gt;makerow&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;row&lt;/span&gt;&lt;span class="punct"&gt;)}&lt;/span&gt;
    &lt;span class="punct"&gt;%&lt;/span&gt; &lt;span class="ident"&gt;endfor&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;table&amp;gt;

&amp;lt;%def name=&amp;quot;makerow(row)&amp;quot;&amp;gt;
    &amp;lt;tr&amp;gt;
    % for name in row:
        &amp;lt;td&amp;gt;${name}&amp;lt;&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;td&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;\&lt;/span&gt;
    &lt;span class="punct"&gt;%&lt;/span&gt; &lt;span class="ident"&gt;endfor&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;tr&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span class="punct"&gt;/%&lt;/span&gt;&lt;span class="keyword"&gt;def&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Unikalne dziedziczenie dynamiczne (zmienna mo&#380;e okre&#347;la&#263; kt&#243;re szablony maj&#261; by&#263; bazowymi dla innych). Szablony mog&#261; by&#263; te&#380; buforowane. Mo&#380;na wygodnie filtrowa&#263; dane w stylu Django (Python) czy Smarty (PHP).&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;&amp;lt;%!&lt;/span&gt;&lt;span class="string"&gt;
    def myescape(text):
        return &amp;quot;&amp;lt;TAG&amp;gt;&amp;quot; + text + &amp;quot;&amp;lt;/TAG&amp;gt;&amp;quot;
%&amp;gt;

Heres some tagged text: ${&amp;quot;text&amp;quot; | myescape}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Oczywi&#347;cie mo&#380;na dowolny element szablon&#243;w keszowa&#263; na wiele sposob&#243;w.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="punct"&gt;&amp;lt;%&lt;/span&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;name=&amp;quot;mycomp&amp;quot;&lt;/span&gt; &lt;span class="ident"&gt;cache&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;true&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="ident"&gt;cache_timeout&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;30&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="ident"&gt;cache_type&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;memory&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&amp;gt;&lt;/span&gt;
    &lt;span class="ident"&gt;other&lt;/span&gt; &lt;span class="ident"&gt;text&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;%def&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Pylons 0.9.4 ma ju&#380; wbudowan&#261; obs&#322;ug&#281; dla Mako. Wystarczy je &#347;ci&#261;gn&#261;&#263; z &lt;span class="caps"&gt;SVN&lt;/span&gt;:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;svn&lt;/span&gt; &lt;span class="ident"&gt;co&lt;/span&gt; &lt;span class="ident"&gt;http&lt;/span&gt;&lt;span class="punct"&gt;:/&lt;/span&gt;&lt;span class="regex"&gt;&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;svn&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;makotemplates&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;org&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;mako&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;trunk&lt;/span&gt; &lt;span class="ident"&gt;mako&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Po zainstalowaniu, jedyne co trzeba, to doda&#263; opcj&#281;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;template_engine&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;mako&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;do wywo&#322;ania config.init_app w middleware.py.&lt;/p&gt;</description>
      <pubDate>Sun, 31 Dec 2006 02:40:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:b86334ce-b3bf-4224-9d6f-e02573d3a4a6</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/12/31/pylons-0-9-4</link>
      <category>Pylons</category>
      <category>pylons</category>
      <category>mako</category>
      <category>sqlalchemy</category>
      <category>genshi</category>
    </item>
    <item>
      <title>"Pylons 0.9.4" by Riklaunim</title>
      <description>&lt;p&gt;Pylons jest fajny ale zajmuj&#261; si&#281; samym kodem. Dawno temu poruszana kwestia dokumentacji niczego nie zmieni&#322;a &amp;#8211; jak by&#322;o tak jest tego ma&#322;o. Mimo i&#380; Django nie jest idealne dla mnie jest znacznie przyjemniejsze i &amp;#8220;wydajniejsze&amp;#8221; w tworzeniu aplikacji, nawet tych nie u&#380;ywaj&#261;cych bazy danych i Panelu Admina :)&lt;/p&gt;


	&lt;p&gt;Punkt drugi to hosting &amp;#8211; cudem za&#322;apa&#322;em si&#281; na serwer z django ;) z Pylons by&#322;oby znacznie gorzej &amp;#8211; albo w&#322;asny serwer albo dedykowany serwer wirtualny.&lt;/p&gt;


	&lt;p&gt;Punkt trzeci to aplikacje w Pylons &amp;#8211; jako&#347; na li&#347;cie dyskusyjnej nie zach&#281;caj&#261; do tworzenia aplikacji w ich frameworku&amp;#8230; Podej&#347;cie typu &amp;#8220;chcesz CMSa to u&#380;yj Zope&amp;#8221; :P&lt;/p&gt;</description>
      <pubDate>Sun, 31 Dec 2006 23:49:28 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:2fc2aa1c-abce-45f9-b421-3bddd15f16d9</guid>
      <link>http://blog.zabiello.com/articles/2006/12/31/pylons-0-9-4#comment-352</link>
    </item>
  </channel>
</rss>
