python.blogowo.net

#!/usr/bin/env python

Jeśli życzysz sobie dodać tutaj swój blog, lub go usunć z tej planety - napisz maila na adres python(malpka)blogowo.net, zamieniając (malpka) na znak @. W przydaku prośby o dodanie załącz koniecznie adres rss/rdf/atom dla kategorii/taga python (jeśli oczywiście blog nie jest jedynie o Pythonie :-))

November 21, 2008

Radarek

Jarosław Zgoda

Czas się ujawnić

To uczucie nieporównywalne z niczym: budujesz aplikację przez kilka tygodni lub miesięcu i przez cały czas zastanawiasz się czy ktoś będzie tego używał?. W takiej niepewności trwasz dopóki nie zauważysz, że jednak ktoś zdecydował się jej użyć, a wtedy... No i wtedy właśnie przychodzi ten strzał adrenaliny, który mogę porównać ...

November 21, 2008 10:59 AM

Riklaunim

Łatki na Panel Admina Django pod GAE

Jeżeli kogoś interesuje korzystanie z PA Django pod GAE to na liście dyskusujnej dostępne są odpowiednie łatki. Jeszcze nie testowałem, ale niebawem na pewno to nastąpi.

November 21, 2008 12:22 AM

November 19, 2008

Binaryflow

GHRML - HAML dla Pythona

Zacząłem myśleć nad nowym projektem aplikacji, której frontend to w większości strony WWW. Postanowiłem poszukać nowego systemu szablonów, który mógłbym zastosować. Pierwszymi kandydatami (z którymi mam obycie) były Genshi i Kid,jednakże jako samodzielny wytwórca szablonów szukałem czegoś co pozwoli na stworzenie kodu HTML dość szybko. Zacząłem przeszukiwać projekty znanych frameworków1 WWW w poszukiwaniu nowego rozwiązania. Bardzo dobre wrażenie wywarł na mnie HAML. Posiadał wszystko czego potrzebowałem - prostą składnię, dzięki której szablony będą łatwiejsze do utrzymania. Dodatkowo nie przypomina kodu upstrzonego tagami zamykającymi.

Szczęśliwie udało mi się znaleźć pythonowy odpowiednik, który nazywa się GHRML i jest oparty na Genshi2.  Sam projekt znajduje się jeszcze w stanie alphy, jednak - jak zobaczycie później - wydaje się całkiem użyteczny.

Stawiając pierwsze kroki, postanowiłem przerobić parę przykładów użycia GRHML. Zacznijmy od instalacji; w moim przypadku wyglądała ona tak:

d:\work>easy_install ghrml
Searching for ghrml
Reading http://pypi.python.org/simple/ghrml/
[...]
Best match: GHRML 0.10
Downloading http://www.ghrml.org/download/GHRML-0.10.tar.gz
Processing GHRML-0.10.tar.gz
Running GHRML-0.10\setup.py -q bdist_egg --dist-dir c:\windows\temp\easy_install-kqdgnb\GHRML-0.10\egg-dist-tmp-teqbdg
zip_safe flag not set; analyzing archive contents...
ghrml.ghrml_django: module references __file__
Adding ghrml 0.10 to easy-install.pth file
Installed c:\python25\lib\site-packages\ghrml-0.10-py2.5.egg
Processing dependencies for ghrml
Finished processing dependencies for ghrml

Ostatni komunikat mówi o tym, że udało się szczęśliwie zainstalować GRHML. Warto dodać, iż po zainstalowaniu GHRML domyślnie współpracuje z Genshi w wersji 0.4.4. Developerzy umieścili w komentarzach informację jak przeportować projekt do nowszej wersji Genshi. Nie wydał mi się on jednak wyjątkowo mądry, więc dla pewności pobrałem aktualną wersją znajdującą się na repozytorium GHRML. Okazało się, że wygląda to tam o wiele lepiej.
Aby dostosować projekt do uruchomienia zarówno Genshi 0.4.4 jak i nowszych trzeba zmienić metodę inicjalizacyjną3 klasy GHRMLTemplate na:

?View Code PYTHON
    def __init__(self, source, default_namespace=None, **kwargs):
        if default_namespace is None:
            default_namespace = self.DEFAULT_NAMESPACE
        self.default_namespace = default_namespace
        MarkupTemplate.__init__(self, source, **kwargs)

Niestety nie udało mi się odpalić tej klasy bez żadnych poprawek. Zaraz po wywołaniu parsowania prostego przykładu wyrzucało wyjątek o braku ustawionej zmiennej default_tag w swojej instancji. Stworzyłem mały patch, który rozwiązuje ten problem:

--- a/ghrml/parser.py	Tue Sep 02 19:39:32 2008 +0100
+++ b/ghrml/parser.py	Sun Nov 16 23:45:19 2008 +0100
@@ -177,6 +177,7 @@
         self.filename = filename
         self.lineno = self.indentation = self.offset = 0
         self.line = None
+        self.default_tag = default_tag
         self.basedir = basedir
         self.lookup = lookup
         self.inline_directives = inline_directives

Po zaaplikowaniu GHRML zaczęła zachowywać się poprawnie.
Jak w przypadku każdego nowego oprogramowania warto wykonać prosty przykład i przywitać się ze światem. W tym przypadku przykład wygląda tak:

?View Code PYTHON
# -*- encoding: utf-8 -*-
import ghrml
 
template_string = u"""%html
  %head
    %title Witaj świecie!
  %body
    #header
      %h1 Witaj świecie
    #contents
      Witaj świecie?
"""
 
template = ghrml.GHRMLTemplate(template_string)
stream = template.generate()
 
print stream.render('xhtml')

Po wykonaniu programu otrzymujemy output w postaci dokumentu HTML:

    Witaj świecie!
<div id="header">
<h1>Witaj świecie</h1>
</div>
<div id="contents">
      Witaj świecie?</div>

Czyli to, o co nam chodziło :) Spróbujmy wykonać trochę bardziej zaawansowany przykład, i przywitać się z osobą wykonującą program, oraz wypisać dla niej wszystkie liczby od 1 do 5. Dodamy także zmienną zawierającą obiekt typu bool, dzięki czemu przetestujemy wyrażenia logiczne w znacznikach. Po zmodyfikowaniu poprzedniego przykładu wygląda on tak:

?View Code PYTHON
# -*- encoding: utf-8 -*-
import ghrml
 
template_string = u"""%html
  %head
    %title Witaj $user_name!
  %body
    %h1[ if welcome ] $user_name 
 
    #content
	  %ul.numbers
	    %li[ for number in test_list]
	      %span $number
"""
template = ghrml.GHRMLTemplate(template_string)
# Metoda generate klasy GRMTL zajmuje się przekazywaniem danych do szablonu.
#Jest ona dziedziczona z Genshi, nazwa przekazywanego parametru jest równa nazwie
#zmiennej przekazywanej do szablonu.
test_list = range(1, 6)
stream = template.generate(welcome=True, user_name="jarek", test_list=test_list)
 
print stream.render('xhtml')

Po uruchomieniu wyświetlił mi kod HTML:

    Witaj jarek!
<h1>jarek</h1>
<div id="content">
<ul class="numbers">
	<li>
          <span>1</span></li>
	<li>
          <span>2</span></li>
	<li>
          <span>3</span></li>
	<li>
          <span>4</span></li>
	<li>
          <span>5</span></li>
</ul>
</div>

Mam nadzieję że te proste przykłady zachęciły was do poznania GHRML. Dla mnie stanowczo skrócił pracę jeśli chodzi o pilnowanie struktury dokumentu.
Jeśli pracujecie/znacie webdesignerów, którzy podążają za najnowszymi trendami, sądzę że im także się to spodoba.

edit: Richard Davies - opiekun projektu, zaaplikował mój jedno-linijkowy patch :)

  1. rusztowań aplikacyjnych
  2. W praktyce jest to tylko alternatywna składnia
  3. albo pobrać najnowszą wersję z repozytorium

by bofh at November 19, 2008 10:57 PM

Jarosław Zgoda

Eureka!

Pomimo tego, że robię w Django od paru lat, wciąż zdarzają mi się odkrycia na miarę archimedejskiej eureki. Dziś właśnie zauważyłem, że skrót render_to_response może przyjmować jako pierwszy argument nie tylko nazwę szablonu, ale także listę nazw szablonów. Dzięki temu wiekopomnemu odkryciu kod, który wyglądał dość marnie:

templates = [
    'flagging/%s_flagging_form ...

November 19, 2008 09:05 AM

Riklaunim

Django 1.0.2

Wydano nową wersję Django - 1.0.2, spowodowaną pominięciem kilku katalogów przy budowaniu pakietów Django 1.0.1.

November 19, 2008 12:13 AM

November 18, 2008

Rafał Jonca

Złapany przez GAE

Jak wcześniej pisałem, przenosiłem stronę ze standardowego Django na GAE. Mocno uważałem, by aplikacja była wydajna, więc zastosowałem liczniki, cache stron, komentarze jak elementy podrzędne, ale i tak dałem się złapać na pewne przyzwyczajenie ze standardowego Django...

W oryginalnym Django stosowałem context_processor pobierający listę komentarzy i tagów, bo było to ...

by Rafał Jońca at November 18, 2008 07:20 PM

Jarosław Zgoda

Introducing django-confirmation

I'm pleased to announce my first (hopefully) reusable app for Django: django-confirmation. The idea for this app came from my personal need to handle confirming object's creation on one of my sites. I found few apps performing similar tasks, but both are targeting single classes of objects, while ...

November 18, 2008 07:57 AM

November 17, 2008

Riklaunim

pyCuda - dostęp do platformy nVidia CUDA w Pythonie

nVidia CUDA to platforma do obliczeń wykonywanych w procesorach GPU karty graficznej. pyCuda umożliwia korzystanie z tej platformy w Pythonie.

November 17, 2008 02:40 AM

Django 1.0.1 wydane

Na stronie projektu znajdziemy informację o wydaniu Django 1.0.1. Jest to wydanie zawierające wyłącznie poprawki i jest w pełni zgodne z Django 1.0. Wprowadzone zmiany to m.in:
  • Poprawki w django.contrib.comments (obsługa i18n w szablonach, poprawki RSS i XHTML)
  • Poprawki w obsłudze bazy Oracle
  • Poprawki w bibliotece formularzy
  • Aktualizacja tłumaczeń
  • Aktualizacja dokumentacji

November 17, 2008 01:50 AM

November 16, 2008

Riklaunim

Dingo :) IDE-Cośtam?

Swego czasu myślałem o stworzeniu czegoś w rodzaju poręcznego webowego IDE. Dzisiaj trochę posiedziałem i powoli składam koncepcyjny interfejs. Podstawa to lista kart, gdzie karta może mieć różne widżety - "menedżer plików", przeglądarkę www (webkit), terminal (QTermWidget), edytor tekstowy (Scintilla) itd. Zawartość karty będzie można odczepiać - bo będzie to QDockWidget i wyświetlać jako niezależne okno lub umieszczać na bokach lub rogach okna głównego. W planach też "dokowanie" takiego widżetu do listy elementów na dole okna (jak np przycisk terminala w Kate czy KDevelop) - w splitterze i z opcją pokaż/ukryj. Wszystkie widżety dostępne w kartach są modułami - URL jest mapowany na odpowiedni handler - jak się uda to zrobię coś w stylu mapowania wyrażeniami regularnymi jak w Django, co szczególnie przyda się tworząc zupełnie nietypowe widżety niezwiązane z byciem "IDE" - coś jak Konqueror, tyle że bardziej prostoliniowe :) Poniżej parę zrzutów... Interfejs jeszcze się zmieni, ale koncepcja powoli nabiera kształtów :)

November 16, 2008 07:46 AM

November 14, 2008

Polish Python Coders Group

Python 3.0RC2

6 listopada Barry Warsaw ogłosił wydanie drugiego Release Candidate'a Pythona 3.0. Niestety cały plan wydawniczy uległ dwumiesięcznemu przesunięciu i aktualną datą wydania wersji stabilnej jest 3 grudzień. W międzyczasie, w razie potrzeby, może pojawić się jeszcze jedno wydanie RC. Więcej informacji: [Python 3.0](http://www.python.org/download/releases/3.0/) Źródło: [python.org](http://www.python.org/news/)

by Łukasz Oleś at November 14, 2008 03:12 PM

Jarosław Zgoda

Code reuse that isn&#39;t

Django jest fantastyczne m.in. w tym, że istnieje masa podłączalnych aplikacji, które w sposób wystarczająco generyczny realizują często spotykane zadania, jak np. django-registration do rejestrowania użytkowników, czy django-tagging do etykietowania obiektów. Część z tych aplikacji jest naprawdę wysokiej jakości, w dodatku łatwo konfigurowalnych i możliwych do dopasowania w dość ...

November 14, 2008 09:59 AM

Riklaunim

Dodatkowe widżety dla PyQt4

Opis dodatkowych widżetów dla PyQt4 stworzonych na bazie widżetów Qt.

November 14, 2008 04:39 AM

November 12, 2008

Jarosław Zgoda

Revival

Poszukuję współpracownika do odtworzenia pewnej kultowej gry planszowej w realiach interwebu (Django 1.x + jQuery), może być na AppEngine, ale nie musi. Projekt może być Open Source, ale nie musi (bo w sumie kogo to obchodzi...). Wskazany wiek > 30 lat (młodsi raczej nie będą mieli odpowiedniego szacunku dla tej gry ...

November 12, 2008 09:32 PM

November 07, 2008

Rafał Jonca

Przepisanie bloga na GAE - opis problemów

Postaram się pokrótce przybliżyć problemy związane z przenoszeniem aplikacji ze standardowego Django do Google App Engine + Django 1.0 + GAE Helper.

Cel

W ramach testowania Google App Engine i Django, postanowiłem zrobić coś praktycznego i przepisać istniejącą aplikację bloga z tagami, komentarzami i stronami statycznymi. Zacznę od wskazania głównych aplikacji ...

by Rafał Jońca at November 07, 2008 07:15 PM