Python i Ruby jako alternatywa dla PHP
14 July 2008
Comments
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']
(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'}),
# 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)
topic = Topic.objects.get(id=10)
topic.post_set.all().order_by('post_date')
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 internetowych10 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
Blog użytkowników RoR
RkBlog
Comment article