<?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: Category Pylons</title>
    <link>http://blog.zabiello.com/articles/category/myghty</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Pylons + Mako</title>
      <description>&lt;p&gt;Mako &amp;#8211; nowy, wydajny system szablon&#243;w dla Pylons&#243;w jest ju&#380; dost&#281;pny publicznie na stronie &lt;a href="http://makotemplates.org"&gt;http://makotemplates.org&lt;/a&gt;. Mo&#380;na go pobra&#263; za pomoc&#261; setuptools&#243;w, czyli skryptem: &lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;easy_install&lt;/span&gt; &lt;span class="constant"&gt;Mako&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 02 Jan 2007 04:46:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:eee84405-3f35-4b43-99f8-6cd160fc9822</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/01/02/pylons-mako</link>
      <category>Pylons</category>
      <category>pylons</category>
      <category>mako</category>
    </item>
    <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>Skype3 i polski czat dla Rails&#243;w, Django i Pylonsa</title>
      <description>&lt;p&gt;Nowy Skype 3 wprowadza ma&#322;&#261; rewolucj&#281; w stos. do poprzedniej wersji. Mo&#380;na nie tylko rozmawia&#263;, ale pogra&#263; w szachy, k&#243;&#322;ko i krzy&#380;yk i inne gry (s&#261; b. &#322;adnie zrobione we Flashu 9). Mo&#380;na nagrywa&#263; rozmowy na dysk. Mo&#380;na tworzy&#263; publiczne czaty. I w&#322;a&#347;nie w tej sprawie pisz&#281; ten tekst bo 
stworzy&#322;em &lt;a href="http://www.skype.com/go/joinpublicchat?chat&amp;#38;skypename=hipertracker&amp;#38;topic=Rails%2C+Django%2C+Pylons+%28Polish%29&amp;#38;blob=qL-BIeEXX7A-qDj26JrmQcoze6L4kn_YE4016SUPrFY2DUmNoHxxVoeROiE4d1UZFQ4UJUo8-KPFDhFLqFhSVeo"&gt;polski czat dla mi&#322;o&#347;nik&#243;w framework&#243;w Ruby on Rails, Django i Pylons&lt;/a&gt;.
Wygodniej jest czasem skonsultowa&#263; co&#347; w czasie rzeczywistym ni&#380; na grupie czy &lt;a href="http://forum.rubyonrails.pl"&gt;forum dyskusyjnym&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Fri, 15 Dec 2006 00:48:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:6232652d-1ffd-4b4e-bcce-a630cc5bc711</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/12/15/skype3-i-polski-czat-dla-rails%C3%B3w-django-i-pylonsa</link>
      <category>Ruby on Rails</category>
      <category>Pylons</category>
      <category>Python</category>
      <category>Django (en)</category>
      <category>Ruby</category>
      <category>Django</category>
      <category>rails</category>
      <category>django</category>
      <category>pylons</category>
    </item>
    <item>
      <title>Du&#380;y polski serwis w Pylons</title>
      <description>&lt;p&gt;Widz&#281;, &#380;e &lt;a href="http://murator.com.pl"&gt;Wydawnictwo Murator&lt;/a&gt; w ko&#324;cu wypu&#347;ci&#322;o oficjaln&#261; wersj&#281; vortalu &lt;a href="http://www.poradnikzdrowie.pl/"&gt;PoradnikZdrowie&lt;/a&gt; wykorzystuj&#261;cego framework &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt; bo w &lt;a href="http://pylonshq.com/project/pylonshq/wiki/SitesUsingPylons"&gt;Wiki na stronie Pylons&#243;w&lt;/a&gt; widz&#281; dopisan&#261; informacj&#281;.&lt;/p&gt;</description>
      <pubDate>Sat, 07 Oct 2006 02:50:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:5f76d405-461a-4fb4-a26e-5405ce2368cf</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/10/07/du%C5%BCy-polski-serwis-w-pylons</link>
      <category>Pylons</category>
      <category>pylons</category>
    </item>
    <item>
      <title>MySQLdb &amp;amp; client encoding</title>
      <description>&lt;p&gt;[vide: &lt;a href="http://blog.zabiello.com/pages/en/mysqldb-client-encoding"&gt;English version&lt;/a&gt;]&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://sourceforge.net/projects/mysql-python"&gt;MySQLdb&lt;/a&gt; to g&#322;&#243;wna biblioteka dla Pythona obs&#322;uguj&#261;ca baz&#281; MySQL. Baza ta (od werseji 4.1 wzwy&#380;) ma wbudowany wygodny mechanizm translacji znak&#243;w jakie maj&#261; by&#263; wy&#347;wietlane dla klienta. Oczywi&#347;cie, nale&#380;y za&#322;o&#380;y&#263;, &#380;e natywnym formatem danych dla bazy to &lt;span class="caps"&gt;UTF&lt;/span&gt;-8. Za pomoc&#261; prostej kwerendy (SET &lt;span class="caps"&gt;NAMES&lt;/span&gt; latin2) mo&#380;na wymusi&#263; aby wszelkie napisy by&#322;y wypluwane do klienta w wybranym formacie (tu: iso-8859-2).&lt;/p&gt;


	&lt;p&gt;Ostatnio, przy okazji pracy z &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt;, przyjrza&#322;em si&#281; bardzo ciekawemu projektowi: &lt;a href="http://www.sqlalchemy.org/"&gt;SQLAlchemy&lt;/a&gt;. Wszystko wskazuje na to, &#380;e &lt;a href="http://www.sqlobject.org/"&gt;SQLObject&lt;/a&gt; odejdzie do lamusa (tym bardziej &#380;e jego tw&#243;rca co&#347; go porzuci&#322; i planuje stworzy&#263; nowy SQLObject2). &lt;a href="http://www.sqlalchemy.org/"&gt;SQLAlchemy&lt;/a&gt; jest nie tylko znacznie pote&#380;niejszym &lt;a href="http://en.wikipedia.org/wiki/Object-relationship_modeling"&gt;&lt;span class="caps"&gt;ORM&lt;/span&gt;&lt;/a&gt;, ale ma tak&#380;e znacznie lepsz&#261; dokumentacj&#281; ni&#380; SQLObject &amp;#8211; ok. 117 stron samego tylko &lt;a href="http://www.sqlalchemy.org/docs/"&gt;manuala&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Jedyny problem, jakie to typowe, to brak czytelnej opcji translacji polskich znak&#243;w. Podobny problem swego czasu znalaz&#322;em w Django (wys&#322;a&#322;em patcha i to poprawili dodaj&#261;c na sztywno &amp;#8220;SET &lt;span class="caps"&gt;NAMES&lt;/span&gt; utf8&amp;#8221;) W wypadku SQLAlchemy nie ma opcji do definicji kodowania po stronie klienta. Manual wspomina tylko o ustawieniu kodowania dla bazy, a to nie to samo. Okazuje, si&#281;, &#380;e rozwi&#261;zanie jest bardzo proste. Podczas tworzenia po&#322;&#261;czenia do bazy wystarczy u&#380;y&#263; dodatkowych parametr&#243;w. Nie ma potrzeby bawienia si&#281; w &#380;adne kwerendy &amp;#8220;SET &lt;span class="caps"&gt;NAMES&lt;/span&gt;&amp;#8221;. Owe parametry to &lt;strong&gt;use_unicode&lt;/strong&gt; i &lt;strong&gt;charset&lt;/strong&gt;:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="constant"&gt;MySQLdb&lt;/span&gt;
&lt;span class="ident"&gt;conn&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;MySQLdb&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connect&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;
    &lt;span class="ident"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;root&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; 
    &lt;span class="ident"&gt;passwd&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; 
    &lt;span class="ident"&gt;db&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; 
    &lt;span class="ident"&gt;use_unicode&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;False&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; 
    &lt;span class="ident"&gt;charset&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;cp1250&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;W powy&#380;szym wypadku, MySQL b&#281;dzie zak&#322;ada&#322; &#380;e klient ma odebra&#263; teksty w formacie string&#243;w cp1250. Za&#347; w wypadku u&#380;ycia &amp;#8220;use_unicode=True&amp;#8221; zwracane b&#281;d&#261; &#347;liczne obiekty unicodowe! Przyk&#322;adowy plik konfiguracyjny dla Pylonsa korzystaj&#261;cego z SQLAlchemy (config/&lt;i&gt;init&lt;/i&gt;.py) mo&#380;e zatem wygl&#261;da&#263; np. tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;from&lt;/span&gt; &lt;span class="ident"&gt;sqlalchemy&lt;/span&gt; &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;
&lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="ident"&gt;sqlalchemy&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;pool&lt;/span&gt; &lt;span class="ident"&gt;as&lt;/span&gt; &lt;span class="ident"&gt;pool&lt;/span&gt;
&lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="constant"&gt;MySQLdb&lt;/span&gt;

&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;getconn&lt;/span&gt;&lt;span class="punct"&gt;():&lt;/span&gt;
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;MySQLdb&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connect&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;
        &lt;span class="ident"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;root&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; 
        &lt;span class="ident"&gt;passwd&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; 
        &lt;span class="ident"&gt;db&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; 
        &lt;span class="ident"&gt;use_unicode&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;False&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; 
        &lt;span class="ident"&gt;charset&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;utf8&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;

&lt;span class="ident"&gt;db&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;create_engine&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;
    &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mysql://root:@localhost/test&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
    &lt;span class="ident"&gt;pool&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="ident"&gt;pool&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;QueuePool&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;getconn&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;pool_size&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;20&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;max_overflow&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;40&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; 
    &lt;span class="ident"&gt;strategy&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;threadlocal&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;
&lt;span class="ident"&gt;metadata&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;BoundMetaData&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;db&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="ident"&gt;test_table&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Table&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;metadata&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;autoload&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;True&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Test(object):&lt;/span&gt;  
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;__str__&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;  
        &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;title&lt;/span&gt;  

&lt;span class="ident"&gt;test_mapper&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mapper&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;test_table&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;W powy&#380;szym przyk&#322;adzie, wymusi&#322;em kodowanie utf8 dla klienta oraz po&#322;&#261;czenie z baz&#261; dzia&#322;a&#263; b&#281;dzie w puli 20-40 w&#261;tk&#243;w. W&#322;a&#347;nie tego mi brakuje w Django: pracy wielow&#261;tkowej, bo zu&#380;ywa ona mniej pami&#281;ci. W/w model mo&#380;na u&#380;y&#263; w kontrolerze Pylons (controllers/home.py) np. tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;from&lt;/span&gt; &lt;span class="ident"&gt;myproject&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;lib&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;base&lt;/span&gt; &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;
&lt;span class="ident"&gt;from&lt;/span&gt; &lt;span class="ident"&gt;myproject&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;models&lt;/span&gt; &lt;span class="ident"&gt;import&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;HomeController(BaseController):&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;):&lt;/span&gt;        
      &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rows&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;select&lt;/span&gt;&lt;span class="punct"&gt;([&lt;/span&gt;&lt;span class="ident"&gt;test_table&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;test_table&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;]).&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;()&lt;/span&gt;
      &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="ident"&gt;render_response&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;/home.myt&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 16 Aug 2006 01:28:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:a7940b1d-4893-4e0a-b1aa-60d91a5a1207</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/08/16/mysqldb-client-encoding</link>
      <category>Databases</category>
      <category>Pylons</category>
      <category>Python</category>
      <category>mysql</category>
      <category>pylons</category>
      <category>python</category>
      <category>sqlalchemy</category>
    </item>
    <item>
      <title>Django i jego konkurenci</title>
      <description>&lt;p&gt;Po ostatnich paru &lt;a href="http://blog.zabiello.com/articles/2006/06/12/django-zab%C3%B3jcza-aplikacja-cz%C4%99%C5%9B%C4%87-iii"&gt;tekstach o Django&lt;/a&gt;, pora na odrobin&#281; odmiany, bo Django niekoniecznie musi by&#263; uwa&#380;any za najlepszy framework w klasie &#347;rodowisk &amp;#8220;railsopodobnych&amp;#8221;. :)&lt;/p&gt;


	&lt;h2&gt;TurboGears&lt;/h2&gt;


	&lt;p&gt;Trzeba pochwali&#263; dobry marketing megaframeworku&lt;sup&gt;&lt;a href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt; &lt;a href="http://www.turbogears.org/"&gt;TurboGears&lt;/a&gt;, bo ju&#380; w Amazonie jest nawet dost&#281;pna &lt;a href="http://www.amazon.com/gp/product/0132433885/102-4872618-4917751?adid=114F4FPZ5WP720AHCPNB&amp;#38;camp=14573&amp;#38;creative=327641&amp;#38;link%5Fcode=as1&amp;#38;n=283155"&gt;ksi&#261;&#380;ka&lt;/a&gt; na jego temat. Jednak&#380;e, ma&#322;e to pocieszenie. TurboGears raczej nie b&#281;dzie powa&#380;n&#261; alternatyw&#261; dla &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt; z prostej przyczyny. Ca&#322;y jego kr&#281;gos&#322;up opiera si&#281; na ma&#322;o profesjonalnej implementacji frameworka &lt;a href="http://cherrypy.org"&gt;CherryPy&lt;/a&gt;. Na ten temat by&#322;o sporo dyskusji na grupie pl.comp.lang.python, wi&#281;c nie b&#281;d&#281; si&#281; powtarza&#322;.&lt;/p&gt;


	&lt;h2&gt;Pylons&lt;/h2&gt;


	&lt;p&gt;&lt;a href="http://blog.zabiello.com/articles/2006/03/04/pylons-czyli-si%C5%82a-myghty-i-wygoda-rubyonrails"&gt;O Pylons pisa&#322;em wcze&#347;niej&lt;/a&gt;  ale nie w kontek&#347;cie &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt;. Moim zdaniem, Pylons jest jedynym frameworkiem, kt&#243;ry aktualnie mo&#380;e stanowi&#263; by&#263; realn&#261; alternatyw&#281; dla &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Wpierw trzeba napisa&#263; kilka s&#322;&#243;w wyja&#347;nienia dla tych, co my&#347;l&#261; &#380;e &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt; to jaki&#347; taki zlepek innych bibliotek i framework&#243;w jak &lt;a href="http://www.turbogears.org/"&gt;TurboGears&lt;/a&gt;. Pylons to w&#322;a&#347;ciwie nic innego jak framework &lt;a href="http://myghty.org"&gt;Myghty&lt;/a&gt; tylko, &#380;e ze znacznie wi&#281;kszym prze&#322;o&#380;eniem akcent&#243;w na paradygmat &lt;span class="caps"&gt;MVC&lt;/span&gt; i podobie&#324;stwo do b&#281;dacych aktualnie &amp;#8220;na fali&amp;#8221; &lt;a href="http://rubyonrails.com"&gt;Rails&#243;w&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Tw&#243;rcy Myghty, mimo bardzo dobrej implementacji i wydajno&#347;ci nie mogli wcze&#347;niej przebi&#263; si&#281; do mi&#322;o&#347;nik&#243;w Pythona ze wzgl&#281;du na zbytnie podobie&#324;stwa do Perla (nic dziwnego, Myghty by&#322; wzorowany na bardzo dobrym perlowym &lt;a href="http://masonhq.com"&gt;Masonie&lt;/a&gt;, kt&#243;ry jest u&#380;ywany na dosy&#263; du&#380;&#261; skal&#281;)&lt;/p&gt;


	&lt;p&gt;Postanowiono wi&#281;c troszk&#281; dostosowa&#263; Myghty dla ludzi lubi&#261;cych prostot&#281; &lt;a href="http://python.org"&gt;Pythona&lt;/a&gt; i elegancj&#281; &lt;a href="http://rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt;. I tak powsta&#322; &lt;strong&gt;Pylons&lt;/strong&gt;.&lt;/p&gt;


	&lt;h3&gt;Zalety Pylons&#243;w.&lt;/h3&gt;


	&lt;p&gt;&lt;a href="http://myghty.org"&gt;Myghty&lt;/a&gt; pozwala praktycznie na wymian&#281; wszystkich swoich &amp;#8220;podzespo&#322;&#243;w&amp;#8221;. W wypadku Pylons&#243;w, u&#380;yto resolvera adres&#243;w &lt;span class="caps"&gt;URL&lt;/span&gt; opartego na bibliotece &lt;a href="http://routes.groovie.org/"&gt;Routes&lt;/a&gt;. W skr&#243;cie mo&#380;na powiedzie&#263;, &#380;e &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt; jest tu prawie identyczne jak Rails. &amp;#8220;Prawie&amp;#8221;, bo Routes jest &lt;strong&gt;pot&#281;&#380;niejszym&lt;/strong&gt; resolverem od tego co maj&#261; Railsy (pozwala np. na u&#380;ywanie wi&#281;kszych uog&#243;lnie&#324; i wyra&#380;e&#324; regularnych).&lt;/p&gt;


	&lt;h4&gt;Elastyczno&#347;&#263;&lt;/h4&gt;


	&lt;p&gt;Elastyczno&#347;&#263; Pylons&#243;w jest znacznie wi&#281;ksza od Django. W praktyce tam, gdzie stosuje si&#281; wstawki &lt;span class="caps"&gt;PHP&lt;/span&gt; do profesjonalnych system&#243;w &lt;span class="caps"&gt;CMS&lt;/span&gt; takich jak &lt;a href="http://reddot.pl"&gt;RedDot&lt;/a&gt;, Pylons dzi&#281;ki  swojej elastyczno&#347;ci i pot&#281;dze szablon&#243;w Myghty znacznie &#322;atwiej mo&#380;e wyprze&#263; tu &lt;span class="caps"&gt;PHP&lt;/span&gt;. Django jest systemem znacznie bardziej &lt;strong&gt;monolitycznym&lt;/strong&gt;. To jest jego zalet&#261; ale r&#243;wnocze&#347;nie tak&#380;e i &lt;strong&gt;wad&#261;&lt;/strong&gt; w wypadkach kiedy potrzebujemy znacznie wi&#281;kszej elastyczno&#347;ci.&lt;/p&gt;


	&lt;h4&gt;&lt;span class="caps"&gt;DRY&lt;/span&gt; w kontek&#347;cie generowania adres&#243;w &lt;span class="caps"&gt;URL&lt;/span&gt;&lt;/h4&gt;


	&lt;p&gt;Przewag&#261; korzystania z &lt;a href="http://routes.groovie.org/"&gt;Routes&lt;/a&gt; jest nie tylko prostota budowania adres&#243;w url bez konieczno&#347;ci posiadania wiedzy o wyra&#380;eniach regularnych. Najwi&#281;ksz&#261; zalet&#261; jest stosowanie helper&#243;w do budowania adres&#243;w &lt;span class="caps"&gt;URL&lt;/span&gt;. Identycznie jak w Railsach, jakakolwiek zmiana zasady rozwi&#261;zywania adres&#243;w, automatycznie przemapuje wszystkie adresy http we wszystkich szablonach. W wypadku Django musimy mozolnie poprawia&#263; wszystkie szablony. W wypadku du&#380;ego serwisu jest to kupa, niepotrzebnej roboty&lt;sup&gt;&lt;a href="#fn2"&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;


	&lt;h4&gt;Ajax i ca&#322;a reszta helper&#243;w z Ruby on Rails.&lt;/h4&gt;


	&lt;p&gt;Django (jak dot&#261;d) nie posiada wbudowanej implementacji Ajax&amp;#8217;a. Nie ma nawet jednomy&#347;lno&#347;ci jak&#261; bibliotek&#281; do tego celu mieliby u&#380;y&#263;&lt;sup&gt;&lt;a href="#fn3"&gt;3&lt;/a&gt;&lt;/sup&gt;. Poza tym Pylons implementuj&#261; wiele z &lt;a href="http://pylonshq.com/WebHelpers/module-index.html"&gt;helper&#243;w&lt;/a&gt; jakie maj&#261; Rails dost&#281;pne dla swoich szablon&#243;w.&lt;/p&gt;


	&lt;h4&gt;Pot&#281;ga szablon&#243;w Myghty&lt;/h4&gt;


	&lt;p&gt;Je&#347;li komu&#347; przeszkadzaj&#261; ma&#322;e mo&#380;liwo&#347;ci szablon&#243;w Django (celowo takie s&#261;, bo s&#261; kierowane do nieprogramist&#243;w) to mo&#380;liwo&#347;ci jakie daj&#261; szablony Myghty s&#261; po prostu powalaj&#261;ce. Je&#347;li kto&#347; m&#243;wi, &#380;e Django ma dobry cache, to niech si&#281; przyjrzy temu co potrafi&#261; wykorzystywane w Pylons &amp;#8211; szablony Myghty.&lt;/p&gt;


	&lt;p&gt;Ka&#380;dy szablon mo&#380;e by&#263; komponentem niezale&#380;nie keszowanym wg bardzo wyrafinowanych zasad (pot&#281;&#380;niejszych od tych, co oferuje Django) Regeneracja cache jest tak&#380;e inteligentnie napisana (podobnie jak to robi &lt;a href="http://skunkweb.sourceforge.net/"&gt;Skunkweb&lt;/a&gt;) Tzn. nigdy nie ma sytuacji, kiedy nadchodzi &#380;&#261;danie wy&#347;wietlenia strony i w tym samym momencie trzeba od&#347;wie&#380;y&#263; cache (bo si&#281; np. przeterminowa&#322;). Pylons w takim wypadku, odwleka operacj&#281; od&#347;wie&#380;ania cache&amp;#8217;a i podaje star&#261; zawarto&#347;&#263;. Regeneracja nast&#281;puje zaraz za tym requestem. W efekcie nigdy nie ma &#380;adnych &amp;#8220;czkawek&amp;#8221; w takiej krytycznej sytuacji.&lt;/p&gt;


	&lt;p&gt;Je&#347;li kto&#347; my&#347;li, &#380;e to bardzo rzadki przypadek, to niech sobie wyobrazi czy co si&#281; dzieje w wypadku naprawd&#281; du&#380;ego obci&#261;&#380;enia serwera. Pylons/Myghty by&#322; od pocz&#261;tku tworzony z my&#347;la pracy w sytuacji mocno obci&#261;&#380;onego serwera.&lt;/p&gt;


	&lt;p&gt;Szablony Myghty obs&#322;uguj&#261; nie tylko bardzo &lt;strong&gt;pot&#281;&#380;ne mechanizmy includowania&lt;/strong&gt; (tzn. mo&#380;na przekaza&#263; wiele r&#243;&#380;nych parametr&#243;w do includowanego szablonu w&#322;&#261;cznie z indywidualnymi zasadami keszowania). Myghty obs&#322;uguj&#261; tak&#380;e mechanizm dziedziczenia&lt;sup&gt;&lt;a href="#fn4"&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;


	&lt;h4&gt;Automatyczne generowanie dokumentacji.&lt;/h4&gt;


	&lt;p&gt;Pylonsy pozwalaj&#261; na &lt;a href="http://pylonshq.com/docs/0.8.2/adding_docs.html"&gt;automatyczne generowanie dokumentacji&lt;/a&gt; z projektu. Wykorzystuje do tego celu pythonowe &lt;a href="http://blog.zabiello.com/articles/2006/03/06/dokumentacja-dla-leniwych-pot%C4%99ga-pythona"&gt;docstringi&lt;/a&gt; i zamiast &lt;span class="caps"&gt;HTML&lt;/span&gt; &amp;#8211; reStructuredText (kt&#243;re s&#261; cz&#281;&#347;ci&#261; projektu &lt;a href="http://docutils.sf.net/"&gt;docutils&lt;/a&gt;)&lt;/p&gt;


	&lt;h4&gt;Zapakowanie projekt&#243;w do uniwersalnego formatu .egg.&lt;/h4&gt;


	&lt;p&gt;Pylonsy potrafi&#261; &lt;a href="http://pylonshq.com/docs/0.8.2/application_setup.html"&gt;zapakowa&#263; ca&#322;y projekt do paczki .egg&lt;/a&gt; co umo&#380;liwia bardzo &#322;atw&#261; dystrybucj&#281; aplikacji pylonsowych. Django tej (jak&#380;e po&#380;ytecznej) opcji w og&#243;le nie ma zaimplementowanej!&lt;/p&gt;


	&lt;h3&gt;Zalety Django.&lt;/h3&gt;


	&lt;p&gt;Mimo powy&#380;szych zalet Pylons&#243;w, Django ma tak&#380;e kilka swoich, dobrych stron.&lt;/p&gt;


	&lt;h4&gt;Lepsza dokumentacja.&lt;/h4&gt;


	&lt;p&gt;Dzi&#281;ki swojej monolityczno&#347;ci, Django dysponuje znacznie pe&#322;niejsz&#261; dokumentacj&#261; i jest ona zgromadzona w jednym miejscu. W wypadku Pylons&#243;w dokumentacja jest niezbyt wyczerpuj&#261;ca i porozrzucana. Wynika to w g&#322;&#243;wnej mierze z tego, &#380;e Pylons u&#380;ywa gotowych komponent&#243;w z innych projekt&#243;w.&lt;/p&gt;


	&lt;h4&gt;&#346;wietna obs&#322;uga formularzy.&lt;/h4&gt;


	&lt;p&gt;Django pracuje na wy&#380;szym poziomie abstrakcji odno&#347;nie pracy z formularzami. O ile nie potrzebujemy wi&#281;kszej elastyczno&#347;ci, to t&#261; kwesti&#281; maj&#261; doskonale zaprojektowan&#261;. Je&#347;li chcemy czego&#347; wi&#281;cej, mo&#380;emy przeci&#261;&#380;y&#263; metody jakie u&#380;ywa Django i wzbogaci&#263; je w dodatkowe opcje (np. obs&#322;ug&#281; zdarze&#324; javascript). Django obs&#322;uguje bardzo elegancko walidacj&#281; formularzy. Pylons TurboGears te&#380;) korzysta z &lt;a href="http://www.turbogears.org/about/extras.html#formencode"&gt;FormEncode&lt;/a&gt;, ale wydaje mi si&#281;, &#380;e Django jest tu jeszcze prostsze.&lt;/p&gt;


	&lt;h4&gt;&lt;span class="caps"&gt;ORM&lt;/span&gt;&lt;/h4&gt;


	&lt;p&gt;Djangowy korzysta z w&#322;asnego &lt;span class="caps"&gt;ORM&lt;/span&gt; (mapera relacyjno-obiektowego) Pylons korzysta z SQLObject. Oba &lt;span class="caps"&gt;ORM&lt;/span&gt;&amp;#8217;y s&#261; podobne, ale mnie si&#281; bardziej podoba ten, co ma Django. Moim zdaniem ma bardziej eleganck&#261; sk&#322;adni&#281;. Ma tak&#380;e lepsz&#261; dokumentacje. Troch&#281; to dziwne, bo SQLObject nie jest wcale nowym projektem. Mogliby si&#281; postara&#263; o   lepsz&#261; dokumentacj&#281;, bo ta co jest, jest fatalna.&lt;/p&gt;


	&lt;h4&gt;Panel admina.&lt;/h4&gt;


	&lt;p&gt;To jest wizyt&#243;wka Django. O ile nie potrzebujemy bardzo specyficznego jego dzia&#322;ania, to jest bardzo pomocny. To nie jest &#380;aden &amp;#8220;scaffolding&amp;#8221; z Rails&#243;w. To dopracowana aplikacja ko&#324;cowa.&lt;/p&gt;


	&lt;h4&gt;Generic views&lt;/h4&gt;


	&lt;p&gt;To kolejna wizyt&#243;wka Django. Za pomoc&#261; konfiguracji adres&#243;w (w pliku urls.py) i generic views mo&#380;na budowa&#263; ca&#322;e serwisy bez tworzenia ani jednego kontrolera. W ten spos&#243;b dzia&#322;a ca&#322;a &lt;a href="http://djangoproject.com"&gt;strona domowa&lt;/a&gt; Django. Osobi&#347;cie g&#322;&#281;boko nie wchodzi&#322;em w dzia&#322;anie tych mechanizm&#243;w, ale wygl&#261;daj&#261; bardzo interesuj&#261;co i mog&#261; da&#263;o gromne przy&#347;pieszenie w budowaniu stron www.&lt;/p&gt;


	&lt;h4&gt;Szersze wdro&#380;enia i silniejsze wsparcie komercyjne.&lt;/h4&gt;


	&lt;p&gt;Django mo&#380;e si&#281; poszczyci&#263; niez&#322;a list&#261; powa&#380;nych wdro&#380;e&#324;. Skala z&#322;ozono&#347;ci portal&#243;w zbudowanych w Django przewy&#380;sza to, czym si&#281; chwali strona domowa Rails&#243;w. Je&#347;li chodzi o Pylons, to wdro&#380;e&#324; jest bardzo ma&#322;o. Mo&#380;e brakuje im troch&#281; zmys&#322;u marketingowego jaki maj&#261; tw&#243;rcy Rails&#243;w i Turbogears? Na pewno brakuje lepszej, obszerniejszej dokumentacji wraz z wi&#281;ksz&#261; ilo&#347;ci&#261; przyk&#322;ad&#243;w.&lt;/p&gt;


	&lt;p&gt;Na bazie Django oferowany jest tak&#380;e odp&#322;atnie, komercyjny &lt;span class="caps"&gt;CMS&lt;/span&gt; (system zarz&#261;dania tre&#347;ci&#261;) &amp;#8211; &lt;a href="http://www.ellingtoncms.com/"&gt;Ellington&lt;/a&gt;. Specjalizowany jest do wi&#281;kszych serwis&#243;w, gazet itp. Firmy ceni&#261;ce sobie wsparcie komercyjne, nie musz&#261; si&#281; wi&#281;c obawia&#263;, &#380;e Django to jaki&#347; projekt paru zapale&#324;c&#243;w.&lt;/p&gt;


	&lt;p&gt;&lt;strong&gt;Django w rzeczy samej, jest projektem kt&#243;ry zosta&#322; wyekstraktowany z komercyjnego projektu &lt;a href="http://www.ellingtoncms.com/"&gt;Ellington&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;


	&lt;p&gt;No i na koniec, &lt;em&gt;last but not least&lt;/em&gt;, tw&#243;rcom Django uda&#322;o si&#281; pozyska&#263; sympati&#281; samego tw&#243;rcy j&#281;zyka Pythona &amp;#8211; Guido van Rossum&amp;#8217;a. Na &lt;a href="http://python.org"&gt;stronie g&#322;&#243;wnej&lt;/a&gt;. Pythona w sekcji Web programming, obok Zope widzimy Django i Turbogears&amp;#8230;&lt;/p&gt;


	&lt;h3&gt;Podsumowanie.&lt;/h3&gt;


	&lt;p&gt;Django ma swoje zalety, ale nie jest wolny od wszelkich wad. Jednak&#380;e, og&#243;lnie rzecz bior&#261;c, to dobry framework, kt&#243;ry raczej nie powinien mie&#263; trudno&#347;ci w zdominowaniu dziedziby budowania aplikacji internetowych w Pythonie.&lt;/p&gt;


	&lt;p&gt;Jednak tam, gdzie liczy si&#281; wi&#281;ksza elastyczno&#347;&#263; i gdzie monolityczno&#347;&#263; Django jest nie do zaakceptowania, g&#322;&#243;wnym moim faworytem jest &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt;. To jedyna realna alternatywa dla Django&lt;sup&gt;&lt;a href="#fn5"&gt;5&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;del&gt;-&lt;/del&gt;&lt;/p&gt;


	&lt;p id="fn1"&gt;&lt;sup&gt;1&lt;/sup&gt; Megaframework &amp;#8211; &#347;rodowisko zbudowane z gotowych, innych rozwi&#261;za&#324;. Turbogears korzysta m.in. z frameworku CherryPy, szablon&#243;w Kid, SQLObject jako &lt;span class="caps"&gt;ORM&lt;/span&gt; (mapera relacyjno obiektowego).&lt;/p&gt;


	&lt;p id="fn2"&gt;&lt;sup&gt;2&lt;/sup&gt; Developerzy Django s&#261; przyciskani do muru &#380;&#261;daniami aby wprowadzi&#263; jaki&#347; mechanizm zast&#281;puj&#261;cy r&#281;czne wpisywanie adres&#243;w, i nie wykluczaj&#261;, &#380;e u&#380;yj&#261; Routes jako alternatywnego resolvera &lt;span class="caps"&gt;URL&lt;/span&gt;. Ale nie wiadomo kiedy i czy w og&#243;le to zrobi&#261;.&lt;/p&gt;


	&lt;p id="fn3"&gt;&lt;sup&gt;3&lt;/sup&gt;  Nie wiem dlaczego nie chca u&#380;y&#263; gotowych bibliotek jakie ju&#380; u&#380;ywa Pylons. Po co odkrywa&#263; na nowo ko&#322;o?&lt;/p&gt;


	&lt;p id="fn4"&gt;&lt;sup&gt;4&lt;/sup&gt; Dziedziczenie dzia&#322;a troch&#281; inaczej ni&#380; w Django i &lt;a href="http://cheetahtemplate.org"&gt;Cheetah&lt;/a&gt;. Np. nie ma tu, tak wygodnych &amp;#8220;blok&#243;w&amp;#8221; do przeci&#261;&#380;ania. Ale jest za to co&#347;, co przypomina &amp;#8220;akwizycj&#281;&amp;#8221; znan&#261; z &lt;a href="http://zope.org"&gt;Zope&lt;/a&gt;. Tzn. w Myghty mo&#380;na wrzuci&#263; do folderu z szablonami plik &amp;#8220;autohandler&amp;#8221; i automatycznie staje si&#281; szablonem bazowym dla wszystkich szablon&#243;w (bez dotykania ich zawarto&#347;ci!) To pozwala na wygodne zarz&#261;dzanie ca&#322;ymi grupami szablon&#243;w.&lt;/p&gt;


	&lt;p id="fn5"&gt;&lt;sup&gt;5&lt;/sup&gt; Poza oczywi&#347;cie Zope czy Plone, ale to jest troch&#281; inna bajka i temat na oddzielne rozwa&#380;ania. :)&lt;/p&gt;</description>
      <pubDate>Wed, 21 Jun 2006 17:18:00 +0200</pubDate>
      <guid isPermaLink="false">urn:uuid:d8ae9ac4-ed22-4de6-abae-f6338bec50f8</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/06/21/django-i-jego-konkurenci</link>
      <category>Pylons</category>
      <category>Django</category>
      <category>django</category>
      <category>pylons</category>
      <category>turbogears</category>
    </item>
    <item>
      <title>Pylons - czyli si&#322;a Myghty i wygoda RubyonRails</title>
      <description>&lt;p&gt;Coraz bardziej ciekawie rozwija sie pythonowy framework do szybkiego budowania aplikacji internetowych: &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt;. W przeciwie&#324;stwie do &lt;a href="http://www.turbogears.org/"&gt;TurboGears&lt;/a&gt; Pylons jest zbudowany na bazie &lt;a href="http://myghty.org"&gt;Myghty&lt;/a&gt; a nie &lt;a href="http://cherrypy.org"&gt;CherryPy&lt;/a&gt;. Myghty jest &lt;strong&gt;bardzo szybkim&lt;/strong&gt;, stabilnym i dobrze napisanym frameworkiem. Pracuje jako cgi, mod_python, wielow&#261;tkowo lub wieloforkowo, dzi&#281;ki &lt;a href="http://www.saddi.com/software/flup/"&gt;&lt;span class="caps"&gt;WSGI&lt;/span&gt;&lt;/a&gt;. Posiada doskona&#322;y, elastyczny cache, obs&#322;ug&#281; &lt;span class="caps"&gt;AJAX&lt;/span&gt;&amp;#8217;a, s&#322;owem prawie wszystko co trzeba dla wsp&#243;&#322;czesnej aplikacji internetowej. Jednak posiada za du&#380;o cech kt&#243;re w bran&#380;y pythonowej okre&#347;la si&#281; jaki &amp;#8220;perlish&amp;#8221; (&lt;a href="http://myghty.org"&gt;Myghty&lt;/a&gt; by&#322; wzorowany na perlowym &lt;a href="http://masonhq.com"&gt;Masonie&lt;/a&gt;)&lt;/p&gt;


	&lt;p&gt;I tu z pomoc&#261; przychodzi &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt;. Jest on czym&#347; w rodzaju &lt;strong&gt;megaframeworku&lt;/strong&gt;, czyli frameworku zbudowanym &lt;em&gt;na bazie&lt;/em&gt; innego frameworku, w tym wypadku: &lt;a href="http://myghyt.org"&gt;Myghty&lt;/a&gt;. (Na podobnej zasadzie &lt;a href="http://www.turbogears.org/"&gt;TurboGears&lt;/a&gt;  jest megaframeworkiem opartym na &lt;a href="http://cherrypy.org"&gt;CherryPy&lt;/a&gt;).&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://pylonsqh.com"&gt;Pylons&lt;/a&gt; r&#243;&#380;ni si&#281; jednak tym od &lt;a href="http://www.turbogears.org/"&gt;TurboGears&lt;/a&gt; &#380;e jest oparty na frameworku znacznie bardziej solidnym i znacznie lepiej na&#347;laduje framework bed&#261;cy natchnieniem dla wi&#281;kszo&#347;ci innych, czyli &lt;a href="http://rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt;. &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt; czerpie pe&#322;nymi gar&#347;ciami z najlepszych pomys&#322;&#243;w  Rails&#243;w dodaj&#261;c do tego wi&#281;ksz&#261; wydajno&#347;&#263; Pythona, elastyczno&#347;&#263; i prostot&#281; sk&#322;adni oraz si&#322;&#281; jego bibliotek (np. Python ma doskonale zaimplementowan&#261; obs&#322;ug&#281; Unicode, co jest w Ruby potraktowane troch&#281; po macoszemu, a w &lt;span class="caps"&gt;PHP&lt;/span&gt; to w og&#243;le tragedia)&lt;/p&gt;


	&lt;p&gt;Zobaczmy przyk&#322;adowo, co nam daje Pylons. Np. rozwi&#261;zywanie adres&#243;w. Adresy &lt;span class="caps"&gt;URL&lt;/span&gt; s&#261; rozwi&#261;zywane za pomoca bardzo ciekawej biblioteki &lt;a href="http://routes.groovie.org/"&gt;Routes&lt;/a&gt; w spos&#243;b podobny do Rails&#243;w. Np. za&#322;&#243;&#380;my &#380;e bie&#380;&#261;cy request zwraca nast&#281;puj&#261;cy s&#322;ownik: {&amp;#8216;controller&amp;#8217;: &amp;#8216;blog&amp;#8217;, &amp;#8216;action&amp;#8217;: &amp;#8216;view&amp;#8217;, &amp;#8216;id&amp;#8217;: 2 (gdzie rozwi&#261;zywanie adres&#243;w url odbywa si&#281; wg definicji podobnej do Rails&#243;w: &amp;#8217;:controller/:action/:id&amp;#8217;). 
Uzyskamy nast&#281;puj&#261;ce wyniki:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;url_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;                    &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/blog/view/4&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
&lt;span class="ident"&gt;url_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;/admin&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;     &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/admin&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
&lt;span class="ident"&gt;url_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;controller&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;admin&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;      &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/admin/index/4&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;url_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;edit&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;           &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/blog/post/4&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
&lt;span class="ident"&gt;url_for&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;='&lt;/span&gt;&lt;span class="string"&gt;list&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;None&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;  &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/blog/list&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Pylons &amp;#8220;przeportowa&#322; do Pythona&amp;#8221; ca&#322;&#261; mas&#281; u&#380;ytecznych helper&#243;w znanych w Rails. Zajmuje si&#281; tym biblioteka &lt;a href="http://pylonshq.com/RailsHelpers/"&gt;RailsHelpers&lt;/a&gt;. Przyk&#322;adowo wygl&#261;da to tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;link_to&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Delete this page&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;url&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;destroy&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="number"&gt;4&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="ident"&gt;confirm&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Are you sure?&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
&lt;span class="ident"&gt;link_to&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Help&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;url&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;help&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;),&lt;/span&gt; &lt;span class="ident"&gt;popup&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;True&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="ident"&gt;link_to&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Busy loop&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;url&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;busy&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;),&lt;/span&gt; &lt;span class="ident"&gt;popup&lt;/span&gt;&lt;span class="punct"&gt;=['&lt;/span&gt;&lt;span class="string"&gt;new_window&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;height=300,width=600&lt;/span&gt;&lt;span class="punct"&gt;'])&lt;/span&gt;
&lt;span class="ident"&gt;link_to&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Destroy account&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;url&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;action&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;destroy&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;),&lt;/span&gt; &lt;span class="ident"&gt;confirm&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Are you sure?&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="ident"&gt;post&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;True&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Jak&#261; to daje nam korzy&#347;&#263;? Ogromn&#261;! Wyobra&#378;my sobie &#380;e chcemy zmienic spos&#243;b rozwi&#261;zywania adres&#243;w url. Co z milionami stron, kt&#243;re mia&#322;y linki do r&#243;&#380;nych wewn&#281;trznych cz&#281;&#347;ci naszego serwisu? Koszmar! Trzeba r&#281;cznie je poprawia&#263;. Dzi&#281;ki Pylon, nie musimy bezpo&#347;rednio wklepywa&#263; adres url, ale u&#380;ywamy do tego helper&#243;w. Zmiana zasad rozwi&#261;zywania adres&#243;w &lt;strong&gt;automatycznie&lt;/strong&gt; poprawi adresy we wszystkich miejscach. Korzy&#347;&#263; jest niewymierna!&lt;/p&gt;


	&lt;p&gt;RailsHelpers zawiera tak&#380;e wi&#281;cej helper&#243;w. Np. mo&#380;na na nie zrzuci&#263; &lt;a href="http://pylonshq.com/RailsHelpers/module-railshelpers.helpers.form_tag.html"&gt;budow&#281; formularzy&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Mo&#380;na te&#380; uzyska&#263; &lt;a href="http://pylonshq.com/RailsHelpers/module-railshelpers.helpers.scriptaculous.html"&gt;efekty specjalne&lt;/a&gt; po&#322;&#261;czone z &lt;span class="caps"&gt;AJAX&lt;/span&gt;&amp;#8217;em w identyczny spos&#243;b jak w Railsach. Pylons bowiem impelmentuje w Pythonie t&#261; sam&#261;, znakomit&#261; bibliotek&#281; JavaScript: &lt;a href="http://script.aculo.us/"&gt;scriptaculous&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Nie spos&#243;b nie wspomnie&#263; tak&#380;e o &lt;strong&gt;interaktywnym debuggerze&lt;/strong&gt;. To poprostu jest &lt;a href="http://pylonshq.com/docs/0.8/interactive_debugger.html"&gt;nowa jako&#347;&#263;&lt;/a&gt;. Mo&#380;na &lt;a href="http://pythonpaste.org/screencasts/evalerror-screencast.html"&gt;interaktywnie&lt;/a&gt; prze&#347;ledzi&#263; stan obiekt&#243;w aplikacji internetowej. &#346;wietny pomys&#322;.&lt;/p&gt;


	&lt;p&gt;Jak dla mnie, &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt; staje si&#281; g&#322;&#243;wnym rywalem &lt;a href="http://djangoproject.com"&gt;Django&lt;/a&gt; do tytu&#322;u najlepszego frameworka dla j&#281;zyka Python. Jest znacznie bardziej elastyczny, posiada wysok&#261; wydajno&#347;&#263; i mo&#380;liwo&#347;ci &lt;a href="http://myghty.org"&gt;Myghty&lt;/a&gt; oraz w &#322;atwiejszy spos&#243;b rozwi&#261;zuje adresy url i ma wygodniejsze helpery, bo wzorowane na &lt;a href="http://rubyonrails.com"&gt;Ruby on Rails&lt;/a&gt;. Wi&#281;cej na temat &lt;a href="http://pylonshq.com"&gt;Pylons&lt;/a&gt; mo&#380;na &#347;ledzi&#263; tak&#380;e na stronie &lt;a href="http://groovie.org/"&gt;http://groovie.org/&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 04 Mar 2006 00:51:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:836615e3-4601-4761-9777-8455fe318463</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/03/04/pylons-czyli-si%C5%82a-myghty-i-wygoda-rubyonrails</link>
      <category>Pylons</category>
      <category>Python</category>
      <category>pylons</category>
      <category>rails</category>
    </item>
    <item>
      <title>Guido van Rossum o szablonach Django i Cheetah</title>
      <description>&lt;p&gt;Guido van Rossum (tw&#243;rca j&#281;zyka Python) &lt;a href="http://www.artima.com/weblogs/viewpost.jsp?thread=146606"&gt;w swoim blogu&lt;/a&gt; przygl&#261;da si&#281; zaletom i wadom &lt;a href="http://www.djangoproject.com/documentation/templates/"&gt;szablon&#243;w Django&lt;/a&gt; oraz &lt;a href="http://cheetahtemplate.org"&gt;Cheetah&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Warto przyjrze&#263; si&#281; &lt;a href="http://www.artima.com/forums/flat.jsp?forum=106&amp;#38;thread=146606&amp;#38;start=0&amp;#38;msRange=15"&gt;dyskusji, jaka si&#281; rozp&#281;ta&#322;a w blogu&lt;/a&gt; bo do dyskusji w&#322;&#261;czyli si&#281; developerzy &lt;a href="http://myghty.org"&gt;Myghty&lt;/a&gt;, Django i Cheetah.&lt;/p&gt;


	&lt;p&gt;To, &#380;e tw&#243;rca Pythona w ko&#324;cu zainteresowa&#322; si&#281; kwesti&#261; webowych framework&#243;w mo&#380;e w ko&#324;cu z g&#261;szczu rozwi&#261;za&#324; wy&#322;oni wyra&#378;nych zwyci&#281;zc&#243;w. W ka&#380;dym razie ciesz&#281; si&#281; &#380;e developerzy framework&#243;w w&#322;&#261;czyli si&#281; do tej debaty. &lt;a href="http://panela.blog-city.com/python_web_framework_shootout_take_3__petitioning_guido_goog.htm"&gt;Guido pracuje teraz dla Google. Python jest jednym z 3 g&#322;&#243;wnych j&#281;zyk&#243;w jakie tam s&#261; wykorzystywane. By&#263; mo&#380;e Google b&#281;dzie chcia&#322;o u&#380;ywa&#263; kt&#243;rego&#347; z framework&#243;w.&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 01 Feb 2006 11:03:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:4a35029e-90e3-43e8-aafc-c7aa33bc5dc8</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/02/01/guido-van-rossum-o-szablonach-django-i-cheetah</link>
      <category>Pylons</category>
      <category>Python</category>
      <category>Django</category>
      <category>myghty</category>
      <category>pylons</category>
      <category>django</category>
    </item>
    <item>
      <title>Myghty 1.0</title>
      <description>&lt;p&gt;Niedawno wysz&#322;a finalna wersja Myghty 1.0. &lt;a href=":http://myghty.org"&gt;Myghty&lt;/a&gt; to framework napisany w Pythonie. Jest bardzo szybki (z tego co sprawdza&#322;em, to jest on najszybszy z wszystkich framework&#243;w opartych na j&#281;z. dynamicznych). Mimo silnych inspiracji perlowym &lt;a href="http://masonhq.com/"&gt;Masonem&lt;/a&gt; Myghty idzie &lt;a href="http://www.myghty.org/docs/technical.myt#technical_differences"&gt;znacznie dalej&lt;/a&gt;. W tej chwili posiada &#347;wietnie zaimplementowany cache, wygodny &lt;span class="caps"&gt;AJAX&lt;/span&gt;, i co jest najsilniejsz&#261; jego stron&#261;: budow&#281; komponentow&#261;. Myghty mo&#380;e dzia&#322;a&#263; jako &lt;span class="caps"&gt;CGI&lt;/span&gt;, fast-cgi, mod_python, &lt;span class="caps"&gt;WSGI&lt;/span&gt;.&lt;/p&gt;


	&lt;p&gt;Warto zwr&#243;ci&#263; uwag&#281; na &lt;a href="http://pylons.groovie.org/project"&gt;Pylons&lt;/a&gt;, kt&#243;ry jest megaframeworkiem opartym na &lt;a href="http://myghty.org"&gt;Myghty&lt;/a&gt; o filozofii inspirowanej przez &lt;a href="http://rubyonrails"&gt;Ruby on Rails&lt;/a&gt; i &lt;a href="http://www.turbogears.org/"&gt;TurboGears&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Thu, 26 Jan 2006 09:42:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:bc062637-7820-463b-ae72-bb9efe3ebce1</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2006/01/26/myghty-1-0</link>
      <category>Pylons</category>
      <category>Python</category>
      <category>myghty</category>
      <category>pylons</category>
    </item>
  </channel>
</rss>
