29 Eylül 2013 Pazar

Django’da signals kullanımı

Django’da signals kullanımı
Django’nun admin paneli çoğu durum için yeterli olsa da biraz değişik bir şey yapmak istediğinizde tutorial’da bahsedilenden farklı bir işlem yapmanız gerekiyor. Sinyaller (signals), Django’nun bu durumda yardımcı olabilecek bir özelliği.
Sinyaller, uygulamada belirlenen alıcıların göndericilerin yaptığı işlemlerden haberdar olmasını sağlar. Bu ne demek biraz açalım; mesela bir modeliniz var ve bu model save edildiği zaman başka bir fonksiyon çağırmak istiyorsunuz. Modelinizi gönderici (sender) olarak belirleyip olurturduğunuz diğer bir fonksiyonu da alıcı (receiver) olarak gösterebilirsiniz.
Django’da kendiniz sinyal fonksiyonlarınızı oluşturabileceğiniz gibi hazırda bulunan sinyaller de mevcut. Modellerin kaydedilme esnasında (öncesinde ve sonrasında) tetiklenen sinyaller ve http isteği başlarken ve biterken tetiklenen sinyaller gibi.
Bir örnek vermek gerekirse:
Ekipman isimli bir modelimiz olsun. Bu modelde her değişiklik yapıldığında bunu ayrı bir tabloda tutmak istiyoruz. Böylelikle ekipmanda yapılan her değişikliği kayıt altında tutabileceğiz.
class Ekipman(models.Model):
    seri_no = models.CharField(max_length=20)
    bulundugu_yer = models.CharField(max_length=20)
    tamirde = models.BooleanField()
    notlar = models.TextField(blank=True)

Gecmis isimli bir de tablomuz var. Buna da yapılan değişiklikleri kaydedeceğiz.
class Gecmis(models.Model):
    ekipman = models.ForeignKey(Ekipman)
    seri_no = models.CharField(max_length=20)
    bulundugu_yer = models.CharField(max_length=20)
    tamirde = models.BooleanField()
    notlar = models.TextField(blank=True)

Şimdi de kayıt işlemini gerçekleştirecek fonksiyonumuzu oluşturalım.
def GecmisTut(sender, **kwargs):
    ekipman = kwargs['instance']
    gecmis = Gecmis(ekipman = ekipman, \
    seri_no = ekipman.seri_no, \
    bulundugu_yer = ekipman.bulundugu_yer, \
    tamirde = ekipman.tamirde, \
    notlar = ekipman.notlar)
 
    ekipman.save()

Alıcı fonksiyonu her zaman sender ve kwargs parametrelerini almalıdır. sender parametresi göndericinin sınıfını (instance’ını değil) tutar. Oluşturduğumuz modelin kendisini (instance’ını) almak için kwargs içindeki instance anahtarını kullanmamız gerekir.
Bu fonksiyonu iki şekilde gönderici ile bağlayabiliriz. Model kaydedildikten sonra alıcının çağırılmasını istediğimize göre:
from django.models.signals import post_save
def GecmisTut(sender, **kwargs):
    ekipman = kwargs['instance']
    gecmis = Gecmis(ekipman = ekipman, \
    seri_no = ekipman.seri_no, \
    bulundugu_yer = ekipman.bulundugu_yer, \
    tamirde = ekipman.tamirde, \
    notlar = ekipman.notlar)
 
    ekipman.save()
 
post_save.connect(GecmisTut, sender=Gecmis)

Veya fonksiyonu bir decorator ile kullanalım:
from django.models.signals import post_save
@receiver(post_save, sender=Ekipman)
def GecmisTut(sender, **kwargs):
    ekipman = kwargs['instance']
    gecmis = Gecmis(ekipman = ekipman, \
    seri_no = ekipman.seri_no, \
    bulundugu_yer = ekipman.bulundugu_yer, \
    tamirde = ekipman.tamirde, \
    notlar = ekipman.notlar)
 
    ekipman.save()

şeklinde kullanabiliriz.


Yasin Aktimur

24 Eylül 2013 Salı

Django Projesini virtualenv wsgi gunicorn supervisor ve nginx kullanarak VPS server'a Deploy etmek.

Vps server için ben digitalocean  kullanıyorum linkten kaydolursanız banada sakal atıyor.

Django'yu  mod_wsgi ve apache ile deploy edebilirsiniz bunun için ortalıkta bir çok tutorial var hatta türklerin django öğrenmek için başvuracağı kaynak olan mustafa başer  'in yazdığı django kitabındada mod_wsgi + apache anlatılmış fakat en mükkemmel sonucu Green Unicorn (Gunicorn) [wsgi] + Nginx verdiği için ki zaten wsgi 'yi dahil etmesek bile Nginx 'in apacheden daha iyi bir web server olduğuda kanıtlanmış .


Önce size worker'ın ne olduğundan bahsedeyim diyelim ki 1 cpu 'ya sahip bir  VPS 'e sahipsiniz.

1*2+1 = 3 adet worker kullanma hakkınız var. . 2 cpu 'nuz varsada 2*2+1 den 5 worker eder.

Eğer verdiğim linkten 1 aylık 5 dolara vps alırsanız 1 cpu nuz olacak ve 3 worker ile çalışacaksınız.



Yukarıdaki grafikte uwsgi 10 çalışan'la 2500 request işleyebiliyormuş saniyede.

Diğer grafikte 2100 5 workerla neredeyse yarım worker ama sonuç neredeyse eşit .

Bu güç nereden geliyor derseniz cevap : gunicorn

Sistemimizi upgrate ediyoruz.

$ sudo apt-get update
$ sudo apt-get upgrade
 
 

Gerekli şeyleri indirelim.

$ sudo apt-get install vim
$ apt-get install git
 
Vim : Komut listesinde dosya editlemeyi sağlar 4 reslik bir eğitimi var youtube 'Da
 
isteyen 15 dakikasını ayırıp dinleyebilir olmazsa olmazlardan : Vim dersleri 


2. Git : Git Github'ın kullandığı versiyon Kontrol sistemidir.
 
değil odtü, boun falan; harvard ya da stanford mezunu bile olsa, 
eğer ki adam github'dan bihaberse, yazılımcıyım falan dememelidir.

o derece mühimdir. o derece vazgeçilmezdir kanaat-i acizanemce. 

Github ve git hakkında ekşisözlük
 
 

virtualenv

sudo apt-get install python-virtualenv
 
$ cd /opt
$ virtualenv venv 
 
New python executable in venv/bin/python
Installing distribute..............done.
Installing pip.....................done.
 
$cd venv
$. bin/activate 
 
Yakın zamanda udemy'de ücretsiz venv kullanımını anlatan ders yapıp buraya ekleyeceğim.
şimdilik virtualenv hakkında bilgi için şu yazıyı okuyun : Virtualenv nedir ?  
 
virtualenv'i aktif ettik .
 
(venv)$ şeklinde olması gerekiyor komut satırının venv aktif olunca ! 

$ pip install django
$ django-admin.py startproject hello
$ cd hello
$ python manage.py syncdb
 
Gunicorn 
 
 
$ pip install gunicorn
 
sitenizin settings.py 'de
 
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'django.contrib.admindocs',
    'gunicorn'
)
Eklemeyi unutmayın !
 
  
$ gunicorn_django --bind siteniz.com:8001
 
http://siteniz.com:8001 
 
Yaptığınızda sitenizi başarılı bir şekilde görüntülüyor olacaksınız !
 
Şimdi venvin içindeki bin klasörü içine girelim..
 
vi gunicorn_start  diyerek boş bi sayfa oluşturun ve buraya vim 'de bişiler eklemek 
için i tuşuna basın artık buraya istediğinizi yazabilirsiniz ..


Şimdi gunicorn_starta buradakileri yapıştırın. gunicorn_start rawı

gunicorn_start'ı executable yapalım şu an bin klasöründeyiz..
 
$ chmod u+x gunicorn_start

Gunicorn startı başlatalım..
$. gunicorn_start (arada boşluk olmayada bilir onuda deneyin olmazsa)
 
Şu ekran çıkacak ..

Starting hello_app
2013-06-09 21:14:07 [2792] [INFO] Starting gunicorn 0.17.4
2013-06-09 21:14:07 [2792] [DEBUG] Arbiter booted
2013-06-09 21:14:07 [2792] [INFO] Listening at: unix:/webapps/hello_django/run/gunicorn.sock (2792)
2013-06-09 21:14:07 [2792] [INFO] Using worker: sync
2013-06-09 21:14:07 [2798] [INFO] Booting worker with pid: 2798
2013-06-09 21:14:07 [2799] [INFO] Booting worker with pid: 2799
2013-06-09 21:14:07 [2800] [INFO] Booting worker with pid: 2800 

$ sudo apt-get install python-dev
 
Supervisiord ...
 
$ sudo apt-get install supervisor
  
$ cd /etc/supervisor/conf.d 
 
hello.conf diye bi dosya oluşturalım .
 
$vi hello.conf
 
ve bu raw'ı yapıştırın . hello raw
 
Supervisor ayarları ile ilgili daha fazla bilgi için şuraya bakın bize bu kadarı yeterli.
 
$ mkdir -p /opt/venv/logs/
$ touch /opt/venv/logs/gunicorn_supervisor.log  

Supervisord aktif etme.
$ sudo supervisorctl reread
hello: available
$ sudo supervisorctl update
hello: added process group
 
Supervisord durumlarını kontrol etme durdurma başlatma vs işlemler 
 
$ sudo supervisorctl status hello                       
hello                            RUNNING    pid 18020, uptime 0:00:50
$ sudo supervisorctl stop hello  
hello: stopped
$ sudo supervisorctl start hello                        
hello: started
$ sudo supervisorctl restart hello 
hello: stopped
hello: started 
 

Nginx

$ sudo apt-get install nginx
$ sudo service nginx start
$ cd /etc/nginx/sites-available 
$ vi hello
 
Hello'yada buradakileri kendinize göre değiştirip atıyorsunuz. nginx raw 
 
sites-enabled klasörüne sembolik link vermeniz gerekiyor .
 
$ ln -s /etc/nginx/sites-available/hello /etc/nginx/sites-enabled/hello 
 
Nginx'i restart ediyoruz ve sistemimiz hazır. 

$ sudo service nginx restart 
 
 
 
 Yasin Aktimur Twitter 

 
  
 
 


 
 


 
 
 

 


6 Eylül 2013 Cuma

Python timezone pytz örnekleri.

 strftime = datetime değerlerini senkrinize etmeye yarar.
suankizaman = time.strftime("%Y-%m-%d %H:%M:%S")
istanbul = pytz.timezone('Europe/Istanbul')

timenow = time.mktime(time.strptime(time.strftime("%Y-%m-%d %H:%M:%S"), "%Y-%m-%d %H:%M:%S"))
        for twt in hometweets[0:1]:
            dt = twt.created_at
       
        strfmaker = dt.strftime("%Y-%m-%d %H:%M:%S")
       
        created_at = datetime.strptime(str(strfmaker), "%Y-%m-%d %H:%M:%S")
        amigo = pytz.utc.localize(created_at).astimezone(istanbul)
       
        normal = dt.strftime("%m")

        xnxx = time.mktime(time.strptime(str(dt),"%Y-%m-%d %H:%M:%S"))
       

1 Eylül 2013 Pazar

Django admine tabloların eklenmesi

from django.contrib import admin
from models import *


admin.site.register(tabloismi1)
admin.site.register(tabloismi2)

Git kullanımı basit anlatım

Git nasıl kullanılır ..

git init
git dosyalarını indirerek git'i kullanıma hazır hale getirir.

git status

Yeni ve değiştirilmiş dosya varmı bunları kontrol eder

git add dosyaismi

Dosyayı githuba göndermeye hazır hale getirir

git commit -m "dosyasdasd"

Yaptııığınız değişikliğe ad vermenizi sağlar meselaki index.php değiştirdiniz

git commit -m "index.py değişti" -- gibi bilgilendirmeler eklemenizi sağlar

git remote add origin https://github.com/try-git/try_git.git

Projenizi gitgub'taki proje ile iilişkilendirmenizi sağlar .. 

git push -u origin master

Dosyaları göndermeye yarar ..

@yasinaktimur