Monthly Archives: Ağustos 2014

Genel

Django REST Framework İle RESTFul Web Servisi Geliştirme

django-restframework-logo
Django REST Framework, Django uygulamalarınız için RESTFul web servisi geliştirmenize olanak sağlayan oldukca kullanışlı bir python paketi. Benzeri diğer bir python kütüphanesi olan Tastypie ile karşılaştırdığımda ilk bakışta anlaması/öğrenmesi oldukca kolay göründüğünü söylemeliyim.

Django REST Framework ile RESTFul web servisi geliştirmek, aslında bildiğimiz django view lerini kullanarak uygulama geliştirmeye oldukca benziyor. Kendi view sınıf ve dekoratörleri djangodaki class ve function based viewler gibi kodlama yapmanıza olanak sağlıyor.

Hızlı başlangıç için: şuradaki
Kütüphanenin güncel kaynak kodları için: buradaki
bağlantıları inceleyebilirsiniz.

Dilerseniz hemen ilk örnek uygulamamızı yazmak için yeni bir virtual environment oluşturalım ve aktif hale getirelim.

$ virtualenv myblog-env
$ cd myblog-env
$ source bin/activate

Ben bu örnek için Django 1.6.6 kullanacağım.

$ pip install django==1.6.6

ve… Django REST Framework paketinin kurulumunu gerçekleştirelim. Ben bu örnek için paketin bugünki güncel sürümü olan 2.4.0 sürümünü kuracağım.

$ pip install djangorestframework==2.4.0

Evet… Artık geliştirmeye hazırız. Hemen django projemizi ve uygulamamızı oluşturalım.

$ django-admin.py startproject myblog
$ cd myblog
$ python manage.py startapp blog

Hemen basitce bir Post modeli oluşturalım.

myblog/blog/models.py:

from django.contrib.auth.models import User
from django.db import models


class Post(models.Model):
	title = models.CharField(length=80)
	content = models.TextField()
	author = models.ForeignKey(User)

Uygulamamızı settings.py dosyasındaki INSTALLED_APPS bölümüne ekleyelim.

myblog/myblog/settings.py:

...
INSTALLED_APPS = (
...
	'rest_framework',
	'blog',
...
)
...

Tablolarımızı yaratalım…

$ python manage.py syncdb

An itibarıyla temel bir uygulama geliştirebilecek şartlara sahibiz. Bir adet veri modelimiz var ve bir API vasıtasıyla bu modele veri girişi yaptırmak istiyoruz. Başlarken, Django REST Framework kütüphanesi ile web servisi geliştirmenin, class veya function based viewler ile bildiğimiz django uygulaması geliştirmekten çok da farklı olmadığından söz etmiştik. Bilinen django view leri, sunu katmanından gelen veriyi işleyip HTTPResponse tipinde yeni bir obje dönmekteydi. Django REST Framework tarafında ise kullanıcıdan alınan veriler veya kullanıcı tarafına gönderilen veriler Serializer objeleri üzerinden API viewleri ile haberleşir.

Serializer nesneleri, uygulama altında serializers.py isimli python dosyalarında barındırılırlar.

Post modülümüz için yeni bir Serializer objesi oluşturalım.

myblog/blog/serializers.py:

from blog.models import Post
from django.contrib.auth.models import User
from rest_framework import serializers


class UserSerializer(serializer.HyperlinkModelSerializer):
	class Meta:
		model = User
		fields = ('url', 'username', 'email', 'groups')


class PostSerializer(serializer.HyperlinkModelSerializer):
	class Meta:
		model = Post
		fields = ('title', 'content', 'author')

Serializer objeleri doğrudan modeli temsil edebilecekleri gibi serializer.Serializer sınıfından türetilerek özel bir veri tipi için de kişiselleştirilmiş Serializer objeleri oluşturulabilir.

Sıra geldi kullanıcıdan gelen istekleri karşılamaya. Model ve serializer kodlamasını tamamladığımıza göre artık Post modelimiz için yeni bir view(lar) oluşturabiliriz. Django REST Framework başta da belirttiğimiz gibi aynı Django uygulamalarında olduğu gibi class ve function based viewlar oluşturabilmemize izin veriyordu. Ben örnek uygulamamız için kolay okunabilmesi nedeniyle class base view tercih edeceğim.

from blog.serializers import PostSerializer

from django.http import Http404

from rest_framework import views
from rest_framework.response import Response
from rest_framework import status


class PostList(views.APIView):
	def get(self, request, format=None):
		posts = Post.objects.all()
		serializer = PostSerializer(posts, many=True)
		return Response(serializer.data)

	def post(self, request, format=None):
		serializer = PostSerializer(data=request.DATA)
		if serializer.is_valid():
			serializer.save()
			return Response(serializer.data, status=status.HTTP_201_CREATED)
		return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

class PostDetail(views.APIView):
    def get_object(self, pk):
        try:
            return Post.objects.get(pk=pk)
        except Post.DoesNotExist:
            raise Http404

    def get(self, request, pk, format=None):
        post = self.get_object(pk)
        serializer = PostSerializer(snippet)
        return Response(serializer.data)

    def put(self, request, pk, format=None):
        post = self.get_object(pk)
        serializer = PostSerializer(post, data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        post = self.get_object(pk)
        post.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

Gördüğünüz üzere Post modeli için GET, PUT, POST, DELETE isteklerine cevap verebilen detail ve list viewlerimizi oluşturduk.

Django REST Framework class based view lerin method handle etmeyen halleri gibi tanımlayabileceğimiz ViewSet denilen uyarlamaları da kullanabilmemize olanak sunar. ViewSetler farklı kütüphanelerde Resource gibi farklı şekillerde de isimlendirilerler.

from blog.models import Post
from blog.serializers import PostSerializer

from rest_framework import viewsets


class PostViewSet(viewsets.ModelViewSet):
	queryset = Post.objects.all()
	serializer_class = PostSerializer

Bu yazı Django REST Framework kütüphanesini başlangıç seviyesinde tanıtmayı amaçladığından şimdlilik bu bölümü anlatmayacağım. Merak edenler dökümaın şu bölümünü inceleyebilirler.

Class based viewlerimizi oluşturduğumuza göre sıra geldi router a viewlerimizi kayıt etmeye.

myblog/myblog/urls.py:

from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from blog import views

urlpatterns = patterns('',
    url(r'^post/$', views.PostList.as_view()),
    url(r'^post/(?P<pk>[0-9]+)/$', views.PostDetail.as_view()),
)

urlpatterns = format_suffix_patterns(urlpatterns)

Artık uygulamamız istekleri kabul etmeye hazır. Örnek istek oluşturup yanıtını göstermeye üşendiğim için işin en zevkli kısmınıı size bırakıyorum :)

Django REST Framework konusunda anlatılacak çok şey var. Kullanışlı ve son derece esnek. Detaylı dökümantasyon ve örnekler için Django REST Framework Resmi Web Sitesi‘ni ziyaret edebilirsiniz.

Genel

ASUS Türkiye Dolandırıcılığı

asus-logo

Geçtiğimiz ay ASUS marka dizüstü bilgisayarımı ısınma sorunu nedeniyle ASUS Türkiye ye gönderdim. Cihazın termal macunu yenilenip pil’i değiştirerek bana geri gönderdiler ve bu işlem karşılığında benden tam 390 TL aldılar. Ancak cihazı kutudan çıkardığımda bir türlü ubuntuya login olamadım. Çünkü klavyede şifremin içerdiği harflere ait bazı tuşlar çalışmıyordu ve cihaz hala aşırı ısınyordu. Cihazı paketleyip düzgün bir açıklama yazarak önceki servis formu ile birlikte servise geri gönderdim. Bu defada servis benden kendi bozduğu klavyeyi onarmak ve halledemediği ısınma sorununu çözmek için 330 TL daha talep etti. Servisi telefonla aradığımda ise hiçbir şekilde konuyla ilgili bilgisi olan birine ulaşalamadım. Kimi kullanıcı hatası, siz bozmuşsunuz diyor. Kimi garanti belgesi istiyor.

ASUS dünya çapında ürünlerini pazarlayan ve servis veren bir şirket. Ancak bu ölçekteki bir firmanın “cam kıran camcı” misali böyle küçük hesaplar peşinde koşuyor olması düpedüz dolandırıcılıktan başka birşey değil.

Güncelleme:

ASUS Türkiye, 28.08.2014 14:25 de gönderdiği iletiyle, sorunumu garanti kapsamında ücretsiz olarak çözeceği bilgisini vermiştir.