TechLife devBlog

#- Python

Python, Postgres i aplikacje czasu rzeczywistego

Kodowanie, Python 17 lipca 2015 09:20

Wczoraj trafiłem na bardzo fajną prezentację autorstwa Brenta Tubbsa, która pokazuje jak wykorzystać postgresowego PubSuba, postgresowego JSONa, minimalny backend w Pythonie oraz któryś z popularnych frameworków JS do budowy webaplikacji czasu rzeczywistego.

Link do przykładowej aplikacji - bitbucket.org/btubbs/todopy-pg

pgpubsub - pypi.python.org/pypi/pgpubsub

Pelican - generator statycznych stron

Kodowanie, Python 11 listopada 2014 23:19

Opuszczając dawno wymarły Jogger, zastanawiałem się gdzie przerzucić mojego bloga. Niestety drugiego takiego miejsca nie ma i pewnie już nie będzie :'-( IMHO Jogger zaczął umierać w momencie kiedy Sparrow, nie zgodził się na uwolnienie kodu o co prosiła społeczność.

Anyway, do wyboru jest bardzo niewiele. Dodatkowo chciałem:

  • zaimportować dotychczasowe treści
  • nie przekazywać nikomu prawa do dysponowania generowanymi przeze mnie treściami (Facebook, Google Plus)
  • nie być ograniczonym różnymi płatnymi usługami jak np. płatne podpięcie domeny (WordPress.com)
  • mieć do dyspozycji składnię w której można ładnie prezentować kod, i nie męczyć się z HTML-em (bez TinyMCE ani pochodnych).

W końcu wpadłem na notkę 10 Open Source Blogging Platforms for Developers i zaskoczyło mnie bardzo elastyczne zastosowanie dla Pelicana - generatora statycznych stron.

Z grubsza Pelican jest prostą aplikacją napisaną w Pythonie, która potrafi z plików .md (Markdown), .rst (reStructuredText) i .html wygenerować cały blog, tak jak to robią inne systemy dynamicznie generujące treść. Różnica jest tylko taka, że Pelican robi to tylko raz, wtedy kiedy dodawana jest nowa treść. Zalety są takie, że wygenerowana strona to zwykłe pliki HTML + JS, więc od jej hostowania wystarczy najprostszy serwer www, nie musi nawet posiadać obsługi PHP czy innego Pythona. Nie potrzeba też żądnej bazy danych.

Wystarczy nam nawet typowy hosting z lat '90 z dostępem przez FTP. Oczywiście są też Pelican wspiera również czasy współczesne, czyli SSH, Amazonowy S3, Dropbox-a, GitHub-a czy rackspace.

Instalacja i konfiguracja

Instalacja jest banalnie prosta, najlepiej zrobić sobie wirtualne środowisko i w nim zainstalować wymagane pakiety.

:::sh
$ pip install pelican markdown

Później odpalamy prosty konfigurator:

:::sh
$ pelican-quickstart

Całą resztę załatwiamy przez edycji pliku pelicanconf.py. Pełną listę opcji znajdziecie w dokumentacji - a jest ich tam dość sporo.

Używanie

Generalna zasada jest taka, w katalogu content umieszczamy właściwe treści, z których później wygenerowana zostanie strona, której pliki znajdziemy w katalogu output. Oczywiście nazwy katalogów można również skonfigurować.

Obojętnie który z formatów wybierzemy (.md, .rst czy .html) musi on zawierać metadane. Np. tytuł, data, kategoria, tagi, slug, autorzy. Żeby jednak było łatwiej to jedynym wymaganym do wygenerowania strony atrybutem jest tytuł.

Przykład z dokumentacji dla Markdown-a:

:::text
Title: My super title
Date: 2010-12-03 10:20
Modified: 2010-12-05 19:30
Category: Python
Tags: pelican, publishing
Slug: my-super-post
Authors: Alexis Metaireau, Conan Doyle
Summary: Short version for index and feeds

This is the content of my super blog post.

Po stworzeniu pliku wystarczy nam komenda

:::sh
pelican content

i już w katalogu output powinna czekać na nas gotowa do przeglądania strona.

Oczywiście każdy lubi na bieżąco oglądać swoje postępy dlatego, żeby nie generować co chwilę całej strony powstał server developerski - develop_server.sh. Wystarczy go odpalić:

:::sh
$ ./develop_server.sh start

i od tech wili będzie on śledził wszystkie zmiany w katalogu content i automatycznie generował pliki związany z treścią, która uległa zmianie a całość podglądać możemy wstukując w przeglądarce adres: 127.0.0.1:8001.

Publikacja treści

Przed wypchnięciem treści na właściwy serwer należy skonfigurować jeszcze dwa pliki. W pliku publishconf.py możemy przeciążyć zmienne z pelicanconf.py np. podać właściwy adres url strony (zmienna SITEURL). Drugim plikiem jest Makefile gdzie ustawiamy dostępy do naszego serwera (FTP, SSH czy coś innego).

Przykład konfiguracji dla FTP:

:::ini
FTP_HOST=localhost
FTP_USER=anonymous
FTP_TARGET_DIR=/

Po skonfigurowaniu obu plików wydajemy komendę odpowiadającą sposobowi transportu naszych plików na serwer. Czyli np.

:::sh
$ make ssh_upload

Czy przy wrzucaniu plików przez FTP:

:::sh
$ make ftp_upload

I to wszystko, gotowa strona ląduje w odpowiednim miejscu gotowa do oglądania.

Podsumowanie

Jak widać za pomocą Palicana udało mi się niemal identycznie odtworzyć Joggera pomimo, że są to zwykłe pliki HTML + JS. Wszystko dzięki bardzo elastycznemu systemowi szablonów (Jinja) oraz systemowi pluginów, który dokłada nam dodatkowe możliwości tj. generowanie mapy strony, dodawanie systemu komentarzy czy dodawanie galerii. Całość jest bardzo konfigurowalna, udało mi się nawet odtworzyć strukturę url-i jaką miałem na Joggerze, dzięki czemu linki do wpisów, które znaleźć można przez Googla nadal pozostaną aktualne.

Całą stronę można trzymać w repozytorium, np. na GitHubie, dzięki czemu backup i historię mamy załatwioną. Swoją drogą ciekawy byłby serwis generowany przez Pelicana, gdzie własne autorzy artykuły zgłaszaliby przez pull requesta :-)

Linki do pooglądania:

Sumowanie statystyk Google Analytics

Kodowanie, Python, Techblog 20 listopada 2009 23:30

Zawsze mnie ciekawiło jaki jest ruch na naszym firmowym serwerze ale nie chciałem obciążać maszyny dodatkowym oprogramowaniem, które by to zliczało. Zwłaszcza że każda hostowana przez nas strona jest podpięta pod Google Analytics. Nie znalazłem jednak sposobu aby w panelu statystyk wyświetlić sumę odwiedzin z kilku kont. Na szczęście Analytics podobnie jak większość usług Googla ma swoje API. Wystarczyło więc zaprząc do pracy Pythona oraz bibliotekę gdata.

Użytkownikom ArchLinuksa polecam paczkę python-gdata-svn

yaourt -S python-gdata-svn

Skrypt jest dość prosty i działa w konsoli:

#!/usr/bin/python

import datetime import sys

import gdata.analytics import gdata.analytics.service

def main(argv):

GOOGLE_ANALYTICS_LOGIN = 'TWOJE@KONTO'
GOOGLE_ANALYTICS_PASSWORD = 'TAJNE_HASLO'

if len(argv) > 1:
    d = argv[1].split('-')
    data = datetime.date(int(d[0]), int(d[1]), int(d[2]))
else:
    data = datetime.datetime.now()

print "\ndata: %d-%d-%d" % (data.year, data.month, data.day)
print "\nodw\tods\tdomena"
print "--------------------------"

dc = gdata.analytics.service.AnalyticsDataService()
dc.ClientLogin(GOOGLE_ANALYTICS_LOGIN, GOOGLE_ANALYTICS_PASSWORD, account_type='GOOGLE')
a = dc.GetAccountList()

odwiedziny, odslony = [], []

for b in a.entry:
    tid = b.id.text.replace('http://www.google.com/analytics/feeds/accounts/','')
    query = dc.GetData(
        ids=tid, 
        start_date='%.4d-%.2d-%.2d' % (data.year, data.month, data.day), 
        end_date='%.4d-%.2d-%.2d' % (data.year, data.month, data.day), 
        metrics='ga:visitors,ga:pageviews',
        dimensions='ga:day'
    )
    odw = int(query.entry[0].visitors.value)
    ods = int(query.entry[0].pageviews.value)
    odwiedziny.append(odw)
    odslony.append(ods)
    print "\033[1;31m%d\t%d\033[0m\t\033[33m%s\033[0m" % (odw, ods, b.title.text)

print "--------------------------"
print "%d\t%d\tRazem" % (sum(odwiedziny),sum(odslony))

if name == "main": sys.exit(main(sys.argv))

Jeżeli wywoła się go bez parametrów wówczas pokaże statystyki dla dnia dzisiejszego. Można też podać mu jako parametr datę, np:

python stats.py 2012-12-21

Przykładowy wynik działania wygląda tak:
Przykład działania

Python i jQuery czyli pyquery

Kodowanie, Python, Techblog 4 maja 2009 15:51

Ostatnio wpadł mi w ręce bardzo ciekawy moduł Pythona, który śmiało można określić jako jQuery po stronie serwera. Jeżeli potrzebowaliście kiedyś wyciągnąć jakieś dane z kodu HTML-a i denerwowała was zabawa z parsowaniem kodu za pomocą sgmllib czy innego tego typu wynalazku, to wasze cierpienia właśnie się skończyły.

Jak to działa?

Na początek pobierzemy zawartość jakieś strony, z której chcemy wyciągnąć dane. Ja posłużę się stroną antyweb.pl, ponieważ jest całkiem przystępnie zakodowana.

from pyquery import PyQuery as pq
import urllib

html = urllib.urlopen("http://antyweb.pl").read()
html = pq(html)

Teraz wystarczy już zadecydować co chcemy wyciągnąć i po prostu to zrobić :-) Np. informacje o autorze

print  html("#f li.frt").text()

Wynik:

Witaj, nazywam sie Grzegorz Marczak i jestem autorem tego bloga. Piszę tutaj o serwisach spolecznosciowych, nowych technologiach i nowych trendach w internecie.

Wyciągnięcie wszystkich kategorii

for a in html("li.categories a"):
    print a.text

Wynik:

antytydzień Biała flaga
Ciekawe strony
google
Świat
Miniblog
Mobilnie
Moje przemyślenia
Off topic
polska
Pytamy.pl
Startups
To mnie drażni.
Uncategorized
W trakcie tworzenia
wywiady

Wyszukanie najczęściej komentowanego wpisu ze strony głównej

max_comments = 0
title = ''
for a in html("ul.clnn li.l a"):
    try:
        # liczba komentarzy
        comments = int(a.text.split(" ")[1])
        if max_comments < comments:
            max_comments = comments
            # nazwa wpisu
            title = a.values()[1].replace("Komentarze do wpisu ",'')
    except:
        pass

print "Najwiecej komentarzy: %s" % max_comments
print "Wpis: %s" % title

Wynik:

Najwiecej komentarzy: 32
Wpis: Interia mówi, tak kupujemy ruch (bo inni też tak robią)

Więcej

To oczywiście tylko mała próbka możliwości. pyquery pozwala również na manipulację stylami (addClass, toggleClass, removeClass, attr, css) czy samą strukturą danych (append, prepend, prependTo, insertAfter, remove, replaceWith itd.). Jeżeli posiadamy moduł WebOb możemy też zaprzęgnąć do pracy Ajax.

Po więcej informacji zapraszam na stronę projektu pyquery.

Strona 1 z 2 | Starsze »