2 Ekim 2008 Perşembe

Cgi-python'a Giriş

Bu yazımızda cgi modülünü ve cgi-python ile web sayfaları yazmayı anlatacağız.
Öncelikle python destekleyen bir yer bulmalısınız veya kendi bilgisayarınızda deneyebilirsiniz.


# -*- coding: utf-8 -*-

print """\
Content-Type: text/html\n

<html>
<body> bu bir deneme sayfasıdır... </body>
</html>
"""


cgi-python da html kodları print ile yazılır.
Content-Type: text/html\n satırı ile içeriğin türünü belirttik buradaki "\n" karakteri koyduk çünkü bu satırdan sonra 2 tane "\n" olmalı.

şimdi örneğimizi geliştirelim...


# -*- coding: utf-8 -*-

import cgi

form = cgi.FieldStorage()
isim = form.getfirst("isim", "bos")

print """\
Content-Type: text/html\n

<html>
<body>
<b>Gelen isim: </b> %s
</body>
</html>
""" % str(isim)


burada cgi modülündeki FieldStorage sınıfının getfirst metodu ile "isim" adındaki argumanı aldık bu arguman index.py?isim=deneme şeklinde gelir buradaki "deneme" argumandır.
getfirst e verilen 2. arguman ise hiçbir değer gelmezse isim değişkenine atanır yani değer verilmezse değişkenin değeri "bos" olur.

örneğimizi daha da geliştirecek olursak...


# -*- coding: utf-8 -*-
import cgi

form = cgi.FieldStorage()
isim = form.getfirst("isim", "bos")

print """\
Content-Type: text/html\n
<html>
<body>
"""

if isim != "bos":
print """\n
<b> Gelen isim: </b> %s
""" % isim
else:
print """\
<form action="deneme.py">
isminiz: <input type=text name="isim">
</form>
"""

Hata yakalma:

# -*- coding: utf-8 -*-

import cgi
import cgitb

cgitb.enable()

try:
open("olmayan_doysa", "r")
except:
cgitb.handler()

Hata yakalamak istediğmizde cgitb modülünü cgitb.enable() ile aktif ediyoruz daha sonra ise hata yakalandığında cgitb.handler() i çalıştırıyoruz.

15 yorum:

  1. Yerel sunucuda özel bir ayar mı yapmak gerekiyor ?
    Yazdığım ".py" dosyasını "localhost/ilk.py" olarak çalıştırmak istediğimde, her seferinde yeni pencere açılıyor ve "ne ile açalım" diye soruyor.

    YanıtlaSil
  2. 1-Öncelikle dosyalarınızı "cgi-bin" içerisine kaydedin

    2-Çalıştırılabilir olduğunu kontrol edin

    3-"cgi-bin" içerisine ".htaccess" adında bir dosya oluşturun ve içine şunları kaydedin:

    Options +ExecCGI
    AddHandler cgi-script .py


    4-httpd.conf içerisinde aşağıdaki satırı bulun ve "AllowOverride None" ifadesini aşağıda olduğu gibi değiştirin.

    Directory "/var/www/localhost/cgi-bin/"
    #AllowOverride None


    Not: Apache sunucusu kullandığınız varsayılmıştır.

    YanıtlaSil
  3. Dediklerinizi yaptım ama 4. dediğinizdeki "4-httpd.conf" dosyasını bulamadım.

    Tam yolu nerede acaba ?

    YanıtlaSil
  4. linux:
    /etc/apache2/httpd.conf

    win:
    apache\conf\httpd.conf

    YanıtlaSil
  5. Yardımınız için sağ olun.

    Bu arada 4. adımı yapmadan da çalışıyor :)

    YanıtlaSil
  6. iyi günlerde kullanın :)

    localde çalıştığınız sürece 4. adımı yapmanıza gerek yok, sunucuda .htaccess içerisinde yaptığınız değişikliklerin işlemesi için gerekli.

    kolay gelsin..

    YanıtlaSil
  7. cgi-bin altında ".py" biçemleri çalışıyor ancak ".html" belgeleri çalıştırmak istediğimde şu hatayı veriyor : "Internal Server Error"

    htdocs dizini altında da ".html" çalışıyor, ".py" çalışmıyor. :)

    Bu ilginç sorunu nasıl çözebilirim ?

    YanıtlaSil
  8. öncelikle .htaccess dosyanızı htdocs içerisine kopyalayın, yada direk localhost'un içine atın alt klasörlerdeki tüm .py dosyaları için geçerli olur.

    daha sonra dosyanızı
    localhost/htdocs/deneme.py
    şeklinde çağırın, çalışacaktır.

    YanıtlaSil
  9. söylediğim şekilde yapınca bende çalıştı. Bir yeri eksik yada farklı yapmış olabilirsin.

    Tam olarak ne yaptığını sırasıyla yazarsan belki eksik yeri görebiliriz.

    Bu arada ilk adımları tekrar ettin değil mi, dosyayı çalıştırılabilir yapmak vs..

    YanıtlaSil
  10. Bu arada ".htaccess" dosyasını her dizine koydum...

    http://img183.imageshack.us/img183/4517/39602435lh6.png
    http://img512.imageshack.us/img512/9184/81282672jt6.png
    http://img518.imageshack.us/img518/4132/33099720qq5.png
    http://img388.imageshack.us/img388/94/92125052vi0.png

    YanıtlaSil
  11. En başına dosyanın python’nun yüklü oldugu yeri yazarsan sorun kalkar.
    #!C:/apache2triad/python/bin/python.exe (win)
    #!/usr/python (linux)
    uft-8 yerine de türkçe karackter için 1254 kullan…

    Apache_Mod_Python ile çalışacaksan mod_python modulü aktifleştirmelisin.
    windows altında çalışma yapacaksan! apache2triad 1.4.4 versiyon ve apache2triadcp panelinden mod_python aktif edilmeli ve cgi-bin klasöründe çalışma yapacaksan gerekli dizin belirtilmeli ve dosya ismi yazılmalı…

    Linux altında çalışma yapacaksan http.conf haricinde mod_python.conf da da degişiklik yapıp gerekli dizin ve izinleri belirttikten sonra sorun kalkar.Gentoo için mod python ve apache belgelerine bakarsan gerekli ayarları rahatlıkla yaparsın!Birde mod_python apache sürümünle uyumlu olmalı yoksa çalışmaz.

    Şayet Django ile sadece çalışacaksan mod_python a gerek yok ama Django kullanıp Apache ile internete açılacaksan mod_python ayaraları şu şekilde olmalı…

    http://docs.djangoproject.com/en/dev/howto/deployment/modpython/#howto-deployment-modpython

    Gerekli linkler:

    http://thinkhole.org/wp/2006/04/03/django-on-windows-howto/

    Yorumu Yapan : Ahmet Muratoglu October 18, 2008 10:01 am ek-1 linux için gerekli ayar dosyası

    /etc/apache2/modules.d/16_mod_python.conf

    site linki:

    http://www.gentoo-wiki.com/Apache_Modules_mod_python

    YanıtlaSil
  12. .htaccess, yukle.html, yukle.py dosyalarını htdocs içerisine al.

    localhost/yukle.html
    ve
    localhost/htdocs/yukle.py

    ile o dosyaları çalıştırabilirsin.

    YanıtlaSil
  13. Vallahi o kadar uğraştık yine değişen olmadı, neyse ki benim barındırma alanı (hosting) piton destekliyormuş; yerel sunucuya tutuklu kalmaktan kurtulduk.

    Yardımcı olmaya çalışan arkadaşlar, sağ olun var olun. İlerleyen günlerde yeniden başınızı ağrıtacağıma dair söz verip, bu konuya nokta koyuyorum. :)

    YanıtlaSil
  14. Vallahi böyle bir kaynak bulmam süper oldu, eline sağlık hocam. Fakat ben burayı bulmadan önceden internetten edindiğim bilgilere göre windows altında Apache2TRiAD python'u desteklediğini gördüm ve Apache2TRiAD'ı kurdum. Fakat örnek kendi çapımda şöyle birşey yazdım, denemek açısından (http://pae.st/qNm1/) çalıştırdığımda IDLE'de çıktı sorunsuz geliyor. Fakat Apache2TRiAD yapısında çalıştırdığımda ise farklı türlerde hata alıyorum.

    Mesela #!C:\apache2triad\python\bin\python.exe
    #-*- coding: utf-8 -*- ikisinden biri olduğunda veya ikisi bir olduğunda bu hatayı;
    http://e1201.hizliresim.com/t/u/23szm.png

    ikiside olmadığında ise,
    http://e1201.hizliresim.com/t/u/23szp.png

    Tarayıcım google chrome, aynı zamanda firefox 3.6.4 de yüklü onda da aynı hataları alıyorum. Sanırım bir yerde yanlış yapıyorum ama nerde :/

    Teşekkürler..

    YanıtlaSil