Python i Ruby jako alternatywa dla PHP

Od 10 lat PHP króluje w dziedzinie tworzenia dynamicznych stron, w szczególności pod względem popularności. Dostępnych jest wiele gotowych skryptów napisanych w tym języku. Liczba dostępnych książek również jest imponująca, a język używany jest zarówno do celów hobbystycznych jak i komercyjnych zakrojonych na szeroką skalę. Rodzi się więc pytanie czy istnieje konkurencja dla PHP ? Czy warto zainteresować się innymi rozwiązaniami ? Celem niniejszego artykułu jest zaprezentowanie Ruby on Rails, Django i Pylons jako alternatyw PHP dla programistów PHP.

Węże z WWW

Django to jeden z wielkiej trójki frameworków napisanych w Pythonie (pozostałe to Pylons i TurboGears). Jest on dostosowany do tworzenia "typowych" aplikacji CMS - czy będzie to forum dyskusyjne, blog, katalog produktów - Django podoła temu zadaniu z zadziwiającą szybkością. Django oferuje prostą i przejrzystą strukturę MVC wspieraną przez wysokopoziomowy ORM czy automatycznie generowany panel admina.

Jak stworzyć system artykułów w Django ?

Skrótowo, zaczynamy od określenia modeli aplikacji, przykład dla artykułów:
class Page(models.Model):
	title = models.CharField(maxlength=255, verbose_name='Tytuł')
	slug = models.SlugField(maxlength=255, unique=True, verbose_name='Odnośnik', prepopulate_from=['title'])
	description = models.CharField(maxlength=255, verbose_name='Opis')
	text = models.TextField(verbose_name='Treść')
	creation_date = models.DateTimeField(auto_now_add = True, verbose_name='Data Dodania')
	class Meta:
		verbose_name = 'Strona'
		verbose_name_plural = 'Strony'
	class Admin:
		list_display = ('title', 'description')
		list_filter = ['creation_date']
		search_fields = ['title', 'description', 'text']
Model zostanie automatycznie zamieniony na tabelę w bazie (MySQL, SQLite, PostgreSQL, wkrótce Oracle). Teraz wypadałoby napisać widok... ale nie w Django. Do prostych czynności - dodaj/edytuj/usuń/pokaż wpis/listuj wpisy ze stronicowaniem i innych Django oferuje generyczne widoki - predefiniowane widoki wykonujące określone zadania. W tym przypadku wystarczy podać regułę odnośników używającą generycznego widoku:
(r'^p/(?P<slug>[\w\-_]+)/', 'django.views.generic.list_detail.object_detail', {'queryset':Page.objects.all() , 'slug_field':'slug', 'template_name':'content/page_show.html'}),
I wyświetlanie artykułu mamy z głowy... A dodawanie/edycja/kasowanie, system użytkowników i uprawnień? Już istnieje - automatycznie:
djn1
djn2
djn3
To było proste, a powiązane tabele, złożone projekty ? To żaden problem, obsługa zależności między tabeli jest dziecinnie prosta. Oto model dla skryptu forum dyskusyjnego:
# Forum Categories
class Category(models.Model):
	cat_name = models.CharField(maxlength=255, verbose_name="Category Name")
	cat_order = models.PositiveSmallIntegerField(default=0, verbose_name="Order")
	class Meta:
		verbose_name = "Category"
		verbose_name_plural = "Categories"
	class Admin:
		list_display = ('cat_name','cat_order')
	def __str__(self):
		return self.cat_name

# Forums
class Forum(models.Model):
	forum_category = models.ForeignKey(Category, verbose_name="Forum Category")
	forum_name = models.CharField(maxlength=255, verbose_name="Forum Name")
	forum_description = models.CharField(maxlength=255, verbose_name="Forum Description")
	forum_topics = models.PositiveIntegerField(default='0', blank=True, verbose_name="Topics")
	forum_posts = models.PositiveIntegerField(default='0', blank=True, verbose_name="Posts")
	forum_lastpost = models.CharField(maxlength=255, verbose_name="Last Post", blank=True, default='', null=True)
	forum_order = models.PositiveSmallIntegerField(default=0)
	is_redirect = models.BooleanField(blank=True, default=False, verbose_name="Forum is a redirect URL", help_text="If checked the forum link will be a link to an URL specified as Forum Description")
	class Meta:
		verbose_name = "Forum"
		verbose_name_plural = "Forums"
	class Admin:
		list_display = ('forum_name', 'forum_description', 'forum_category', 'forum_order')
		fields = (
		(None, {
		'fields': ('forum_category', 'forum_name', 'forum_description', 'forum_order', 'forum_topics', 'forum_posts', 'is_redirect')
		}),)
	def __str__(self):
		return self.forum_name

# Topics
class Topic(models.Model):
	topic_forum = models.ForeignKey(Forum, verbose_name="Forum")
	topic_name = models.CharField(maxlength=255, verbose_name="Topic Title")
	topic_author = models.CharField(maxlength=255, verbose_name="Author", blank=True)
	topic_posts = models.PositiveIntegerField(default=0, blank=True, verbose_name="Posts")
	topic_lastpost = models.CharField(maxlength=255, verbose_name="Last Post")
	topic_modification_date = models.DateTimeField(auto_now = True)
	is_sticky = models.BooleanField(blank=True, default=False)
	is_locked = models.BooleanField(blank=True, default=False)
	is_global = models.BooleanField(blank=True, default=False)
	class Meta:
		verbose_name = "Topic"
		verbose_name_plural = "Topics"
	def __str__(self):
		return self.topic_name

class Post(models.Model):
	post_topic = models.ForeignKey(Topic, verbose_name="Post")
	post_text = models.TextField()
	post_author = models.CharField(maxlength=255, verbose_name="Author", blank=True)
	post_date = models.DateTimeField(auto_now_add = True)
	post_ip = models.CharField(maxlength=20, blank=True)
	class Meta:
		verbose_name = "Post"
		verbose_name_plural = "Posts"
	def __str__(self):
		return str(self.id)
Wystarczy models.ForeignKey czy models.ManyToManyField do definiowania powiązań między tabelami. Jak teraz pobrać posty tematu o id 10 ? a tak:
topic = Topic.objects.get(id=10)
topic.post_set.all().order_by('post_date')
Django to potężny framework umożliwiający tworzenie złożonych aplikacji webowych w krótkim czasie zachowując przy tym wysoką jakość.


Rubinowy kącik

Na sukces Ruby on Rails (RoR) złożyło się wiele czynników lecz nie bez znaczenia pozostaje fakt iż jest to jedyny liczący się framework dla "swojego" języka. Dzięki temu programiści skupiają się na rozwijaniu jednego frameworka a nie tysiąca. Oprócz tego sam framework jest bardzo dobrym narzędziem do tworzenia aplikacji internetowych
10 powodów, dla których warto wypróbować Ruby on Rails (według Dave'a Thomas'a)
  • Zręczne programowanie aplikacji WWW
  • Łatwe dodanie do tworzonych stron ciekawych, dynamicznych efektów (AJAX i biblioteka JS Prototype)
  • Skupienie się na rozwoju aplikacji a nie na zarządzaniu frameworkiem
  • Wraz z rozwojem aplikacji, możliwe jest utrzymanie ich w dobrym stanie
  • Nasi klienci częściej słyszą odpowiedź "Tak"
  • Testowanie jest wbudowane we framework
  • Natychmiastowe efekty zmian: zmień kod, kliknij "Odśwież" i zmiany są widoczne
  • Metaprogramowanie oznacza, że mogę programować na bardzo wysokim poziomie
  • Generatory kodu umożliwiają mi szybkie rozpoczęcie pracy
  • Brak plików konfiguracyjnych XML
Strona Ruby on Rails
Strona Ruby
Blog użytkowników RoR
RkBlog

PHP w Akcji, 14 July 2008

Comment article
Comment article RkBlog main page Search RSS Contact