RkBlog

Hardware, programming and astronomy tutorials and reviews.

Myghty

Opis wysokowydajnego i niezależnego systemu szablonów Myghty umożliwiającego ich bezpośrednie hostowanie. Jest to niezależny system szablonów i stron z logiką napisaną w Pythonie

Myghty to serwer jak i framework to tworzenia dynamicznych stron www w Pythonie. Myghty to głownie potężny system szablonów, lecz można w nim tworzyć kompletne aplikacje. Wykorzystywany jest przez megaframework Pylons.
Myghty nie jest już rozwijane ze względu przejęcia jego funkcjonalności przez szablony Mako i aplikacje takie jak Paste i PasteDeploy. Dla Pylons 1.0 domyślnym systemem szablonów będzie Mako.


Myghty może działać niezależnie lub poprzez mod_python/Apache. Na początek skorzystamy z serwera Myghty. W pustym katalogu zapisz jako server.py:
import myghty.http.HTTPServerHandler as HTTPServerHandler
httpd = HTTPServerHandler.HTTPServer(port = 8080, handlers = [{'.*\.myt' : HTTPServerHandler.HSHandler(data_dir = './cache', component_root = './')},], docroot = [{'.*' : './'}],)
httpd.serve_forever()
jako index.myt: Strona testowa Witaj w Myghty ! [/rk:syntax] Teraz uruchom serwer python server.py i w przeglądarce wpisz adres: http://localhost:8080/index.myt - zobaczysz tekst z pliku index.myt. Jak na razie mamy dane statyczne, czas na trochę pythona. Proste fragmenty kodu można umieszczać w następujący sposób:
% for x in range(0, 10):
 print 'petla!<br/>'
%
Wiersze zaczynające się od znaku % zawierają kod pythona, który zostanie wykonany, w tym przypadku mamy pętlę. Jak widać można robić "przerwy" w kodzie. Przy bardziej złożonym kodzie należy oczywiście pamiętać o wcięciach itd.:
% for mood in ['happy', 'happy', 'sad', 'sad', 'happy']:
%	if mood == 'happy':
Mamy Happy<br />
%	else:
Nie mamy Happy :)<br />
% #koniec ifa
% #koniec pętli

Inny sposób dodawania kodu pythona to bloki:
<%python>
m.write('aaaaaaaaaa')
</%python>
Gdzie jeżeli chcemy coś wyświetlić na stronie to musimy skorzystać z m.write a nie print. Bloki przydają się gdy chcemy umieścić jakiś bardziej złożony kod, na ten przykład:
<%python>
import struct
plik = open('Spells.bif', 'rb')
try:
        tekst = plik.read()
finally:
        plik.close()

m.write('Number of entries: ' + str(struct.unpack('i', tekst[0x0008:0x0008+4])[0]) + '<br />')
m.write('Number of tileset entries: ' + str(struct.unpack('i', tekst[0x000c:0x000c+4])[0])+ '<br />')
m.write('Offset of entries: ' + str(struct.unpack('i', tekst[0x0010:0x0010+4])[0])+ '<br />')

m.write('Resource: ' + str(struct.unpack('i', tekst[0x0000+16:0x0000+20])[0])+ '<br />')
m.write('Ofset do plikow: ' + str(struct.unpack('i', tekst[0x0004+16:0x0004+20])[0])+ '<br />')
m.write('Ile tilsow: ' + str(struct.unpack('i', tekst[0x0008+16:0x0008+20])[0])+ '<br />')
m.write('rozmiar tilsa: ' + str(struct.unpack('i', tekst[0x000c+16:0x000c+20])[0])+ '<br />')
</%python>
Co czyta plik BIFF z gier opartych o silnik Infinity (baldurs gate i reszta) i wyświetla dane o pliku.
myg1


Szablony

Najprostszy przypadek to załączenie jednego pliku .myt z drugiego. Wystarczy do tego polecenie:
<& plik.myt &>

Komponenty mogą określać zestaw zmiennych jakie chcą/muszą otrzymywać. Do definiowania ich służy blok args:
<%args>
foo = None
</%args>
W tym przykładzie zmienna foo ma przypisaną domyślną wartość None. Jeżeli zmienna nie miałaby określonej wartości to próba otwarcia takiej strony skończy się błędem. Podanym w %args zmiennym można przypisać wartości metodami GET i POST, np plik.myt?foo=blablabla przypisze blablabla do zmiennej foo.
Nieco inny przykład:
Plik plik.myt
<%args>
    username
    email
</%args>

Username: <% username %><br/>
Email: <a href="mailto:<% email %>"><% email %></a><br/>
Plik index.myt (otwierany w przeglądarce)
<html>
<head><title>Test Page</title></head>
<body>
<h1>dane logowania</h1>
<& plik.myt, username='andrzej', email='andrzej@lepper.com' &>
</body>
</html>
Efekt będzie taki:
myg2
RkBlog

14 July 2008;

Comment article