sâmbătă, 6 noiembrie 2010

Deschiderea fisierelor cu programul potrivit

        Mecanismul prin care un program reuseste sa deschida un fisier atunci cand utilizatorul da dublu-click pe acel fisier e foarte simplu. Se foloseste transmiterea de parametrii.
        Atunci cand se da dublu-click pe un fisier in Windows, sistemul de operare cauta programul care are asociata extensia fisierului si il apeleaza sub forma: "C:\Cale_catre_program\Program.exe" "%1" . Astfel, Windows-ul ii trimite doi parametrii: calea catre program si calea catre fisier. Programul citeste al doilea parametru si manipuleaza fisierul de la calea transmisa.

        Un scurt exemplu in Python:
import sys
# daca numarul parametrilor este diferit de 2, atunci ceva nu e in regula 
if len(sys.argv) != 2:
    filePath = ""
# altfel variabila filePath primeste continutul celui de-al doilea parametru
else:
    filePath = sys.argv[1]
# daca variabila filePath nu e nula
if filePath:
    # deschide, afiseaza continutul si inchide fisierul 
    file = open(filePath, 'r')
    file.read()
    file.closed

sâmbătă, 2 octombrie 2010

DF Photo Viewer



Download: DF Photo Viewer
Am reusit sa scot prima versiune pentru Photo Viewer. Deocamdata e o aplicatie destul de lenta si s-ar putea sa apara erori.

Functionalitati:
-  deschide fisiere jpg si png
-  zoom
-  schimba imaginea curenta cu imaginea urmatoare sau anterioara

Folositi:
-  "+" si "-" pentru zoom in respectiv zoom out
-  "r" pentru a reincadra imaginea in ecran

Aplicatia functioneaza pe orice versiune de Windows pe 32 de biti. Nu se instaleaza, ci trebuie doar sa scoateti folderul din arhiva de la link-ul de mai sus.

miercuri, 8 septembrie 2010

Photo Viewer folosind Python si Pygame

    Cautam zilele trecute un photo viewer care sa imi deschida pozele pe tot ecranul, sa pot face zoom si sa fac trecerea de la o poza la alta intr-un mod simplu si placut dar nu am gasit decat programe care costa destul de mult sau programe gratuite care nu mi-au atras atentia intr-un mod deosebit. Cei drept, nici nu prea am avut chef sa caut; poate as fi gasit in cele din urma. Insa, tot raul inspre bine: de ce sa nu imi fac propriul Photo Viewer?! Mi-a sunat interesant, asa ca am inceput sa ma gandesc ce vreau sa faca si cum l-as putea scrie. Ce vreau sa faca am spus deja, iar ca sa il scriu m-am gandit ca ar fi bine sa folosesc Python. De ce Python? Pentru ca e foarte rapid sa scrii cod si, in plus, am mai folosit odata Pygame si mi-a placut.

    Tot ce trebuie sa aveti pentru a rula exemplul sunt: Python 2.6 sau mai nou (nu Python 3 pentru ca e un pic altfel), Pygame (o versiune care sa se potriveasca cu Python), o poza intr-un tip de fisier cunoscut.

   Descrierea codului
   Programul are o structura simpla: importarea bibliotecilor, o clasa Image care stie sa prelucreze imaginile, initializarea Pygame si un while in care se afiseaza continutul pe ecran si se verifica daca utilizatorul apasa vreo tasta.

   Programul

#importam bibliotecile necesare
import pygame, sys, time
from pygame.locals import *

# cream clasa Image
class Image:
    # apelam constructorul clasei caruia ii transmitem ca parametrii screen
    # (fereastra programului), screenWidth si screenHeight (dimensiunile
    # ferestrei) si imagePath (calea catre imagine) in interiorul constructorului
    # initializam datele membre: _image (e imaginea propriu-zisa incarcata
    # de la adresa transmisa ca parametru), _temporaryImage (imaginea
    # prelucrata), _width si _height (dimensiunile imaginii), _adaptedWidth si
    # _adaptedHeight (dimensiunile imaginii adaptate la dimensiunea ecranului)
    # _XPosition si _YPosition (locatia coltului imaginii din stanga-sus) si _adapted
    # (False daca imaginea nu e adaptata la dimensiunile ecranului)

    def __init__(self, screen, screenWidth, screenHeight, imagePath):
        self._screen = screen
        self._screenWidth = screenWidth
        self._screenHeight = screenHeight
        self._imagePath = imagePath
        self._image = pygame.image.load(self._imagePath).convert()
        self._temporaryImage = self._image
        self._width = self._image.get_width()
        self._height = self._image.get_height()
        self._adaptedWidth = 0
        self._adaptedHeight = 0
        self._XPosition = 0
        self._YPosition = 0
        self._adapted = False

    # modifica data _adapted astfel incat imaginea sa fie readaptata la
    # dimensiunile ecranului
    def restoreInitialDimensions(self):
        self._adapted = False

    # mareste imaginea cu 10% daca prin marirea ei are lungimea si inaltimea mai mici de
    # 9000 de pixeli formula de calcul pentru XPosition si YPosition face ca sa ramana pe
    # loc centrul imaginii
    def zoomIn(self):
        nextWidth = self._width + (self._adaptedWidth * 10) / 100
        nextHeight = self._height + (self._adaptedHeight * 10) / 100
        if nextWidth < 9000 and nextHeight < 9000:
            self._width += (self._adaptedWidth * 10) / 100
            self._height += (self._adaptedHeight * 10) / 100
            self._XPosition -= ((self._adaptedWidth * 10) / 100) / 2
            self._YPosition -= ((self._adaptedHeight * 10) / 100) / 2

    # micsoreaza imaginea cu 10% daca noile dimensiuni nu vor fi mai mici de 10 pixeli
    def zoomOut(self):
        nextWidth = self._width - (self._adaptedWidth * 10) / 100
        nextHeight = self._height - (self._adaptedHeight * 10) / 100
            if nextWidth > 10 and nextHeight > 10:
                self._width -= (self._adaptedWidth * 10) / 100
                self._height -= (self._adaptedHeight * 10) / 100
                self._XPosition += ((self._adaptedWidth * 10) / 100) / 2
                self._YPosition += ((self._adaptedHeight * 10) / 100) / 2

    # adapteaza dimensiunile imaginii pentru a fi cuprinsa de ecran
    def adaptToScreen(self):
        if self._adapted == False:
            if self._width > self._screenWidth or self._height > self._screenHeight:
                self._percent = float(self._screenWidth) / float(self._width)
                self._width = int(self._width * self._percent)
                self._height = int(self._height * self._percent)

                if self._height > self._screenHeight:
                    self._percent = float(self._screenHeight) / float(self._height)
                    self._width = int(self._width * self._percent)
                    self._height = int(self._height * self._percent)
                    self._XPosition = (self._screenWidth - self._width) / 2

            self._adaptedWidth = self._width
            self._adaptedHeight = self._height

    # centreaza imaginea
    def center(self):
        if self._width <= self._screenWidth:
            self._XPosition = (self._screenWidth - self._width) / 2

        if self._height <= self._screenHeight:
            self._YPosition = (self._screenHeight - self._height) / 2

    # muta imaginea spre dreapta cu 10 pixeli
    def moveLeft(self):
        if self._XPosition <= 0:
            self._XPosition += 10

    # muta imaginea spre stanga cu 10 pixeli
    def moveRight(self):
        if self._width - self._screenWidth >= self._XPosition * -1 :
            self._XPosition -= 10

    # muta imaginea in jos cu 10 pixeli
    def moveUp(self):
        if self._YPosition <= 0:
            self._YPosition += 10

    # muta imaginea in sus cu 10 pixeli
    def moveDown(self):
        if self._height - self._screenHeight >= self._YPosition * -1 :
            self._YPosition -= 10

    # prelucreaza si afiseaza imaginea
    def draw(self):
        self.adaptToScreen()
        self.center()
        self._adapted = True
        self._temporaryImage = pygame.transform.scale(self._image, (self._width, self._height))
        self._screen.blit(self._temporaryImage, (self._XPosition, self._YPosition))


# initializeaza modulul display din Pygame si ia dimensiunile ecranului
pygame.display.init()
width = pygame.display.Info().current_w
height = pygame.display.Info().current_h

# face ca fereastra programului sa fie de dimensiunea ecranului in mod Fullscreen
screen = pygame.display.set_mode((width, height), FULLSCREEN)

# seteaza culoarea de fundal ca fiind un gri inchis
# culorile se seteaza ca (Rosu, Verde, Albastru) si iau valori intre 0 si 255
bgColor = (40,40,40)
screen.fill(bgColor)

# programul ruleaza
running = True
# numarul de cadre (frames) pe secunda
clock = pygame.time.Clock()


# calea catre imagine
imagePath = 'D:\Poze\poza.jpg'

# initializeaza obiectul img ca fiind o clasa Image
img = Image(screen, width, height, imagePath)


# rularea programului
# cat timp programul ruleaza...
while running:
    # seteaza rularea la 30 de cadre pe secunda
    clock.tick(30)
    # seteaza culoarea de fundal / poate fi inteleasa ca refresh
    screen.fill(bgColor)

    # afiseaza imaginea
    img.draw()

    # apeleaza o metoda membra a obiectului img in functie de tasta apasata
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == K_PLUS or event.key == K_EQUALS: img.zoomIn()
            elif event.key == K_MINUS: img.zoomOut()
            elif event.key == K_LEFT: img.moveLeft()
            elif event.key == K_RIGHT: img.moveRight()
            elif event.key == K_UP: img.moveUp()
            elif event.key == K_DOWN: img.moveDown()
            elif event.key == K_r: img.restoreInitialDimensions()
            elif event.key == K_ESCAPE: sys.exit(0)
            else: pass

    pygame.display.flip()



    Gata. Asta e tot. In mod normal ar trebui sa ruleze imediat ce salvati codul intr-un fisier cu extensia .py. Atentie la identare.

    Daca va intrebati de ce am scris cu underscore datele membre ale clasei Image, le-am scris asa pentru ca sa fie tratate ca si date protected. In Python nu exista notiunile de private si protected ca si in alte limbaje, ci totul e public. Totusi, e recomandat sa istiintati programatorii cu care lucrati la un proiect ca nu garantati existenta sau continutul unei date membre si nu ar trebui sa le foloseasca. In plus, daca in interiorul expresiei while as incepe sa modific dimensiunile imaginii scriind img.width = 20, codul ar arata inestetic si greu de inteles. In cazul unui program de cateva mii de linii, ar fi un cosmar sa incercati sa il intelegeti. Totusi, daca vreti sa oferiti posibilitatea modificarii unei date membre sau afisarea continutului ei, puteti scrie o metoda care permite modificarea sau afisarea.
    De exemplu, daca vrem sa oferim posibilitatea afisarii continutului date _adaptedWidth, putem scrie metoda getAdaptedWidth in interiorul clasei Image astfel:
    def getAdaptedWidth(self):
        return self._adaptedWidth
    Si va putea fi folosita scriind: adeptedWidth = img.getAdaptedWidth()



    Photo View-ul scris aici e foarte simplu si nu ofera prea multe functii. Trebuie tratat ca si un exemplu, un fel de tutorial, si introducere in Python si Pygame. Mai departe puteti dezvolta programul astfel incat sa deschida o imagine atunci cand dati click pe acea imagine (exact asa cum se deschide un fisier .doc cu Microsoft Word cand dati click pe el), puteti face ca prin apasarea unei taste sa treceti de la o imagine la alta in cazul in care sunt mai multe intr-un folder, puteti sterge imaginea la apasarea unei taste, puteti scrie un algoritm pentru un zoom mai placut, ar fi o idee buna sa mutati in interiorul clasei codul care verifica daca o tasta a fost apasata.

duminică, 20 iunie 2010

Clase

Clasele sunt niste intrumente foarte folositoare si distractive care fac programarea mai simpla si mai frumoasa. Ele fac parte din limbajele orientate pe obiect.
O clasa trebuie sa contina Date Membre (instante - sunt variabile) si Metode Membre (sunt functii si proceduri). Acestea trebuie sa fie precedate de modificatori de acces.
Modificatorii de acces sunt:
  • private - nu permite accesul la membrii clasei
  • protected - permite accesul la membrii clasei numai din clasele derivate
  • public - permite accesul la membrii clasei din afara ei  
In cadrul metodelor membre trebuie sa exista un constructor si un destructor pentru fiecare clasa. Dupa cum numele le spune, este usor de inteles ce fac fiecare.
In randurile urmatoare aveti trei exemple de clase scrise in 3 limbaje de programare: C++, PHP si Python.


C++
In exemplul urmator veti vedea ca nu am specificat un modificator de acces pentru datele membre. Am facut asta pentru ca in C++ faptul ca nu exista un modificator de acces inaintea unui grup de membrii se considera implicit modificatorul private. Astfel, datele membre au modificatorul protected, iar metodele au modificatorul public.

O alta particularitate este faptul ca nici constructorul si nici destructorul nu returneaza un tip.

#include "stdafx.h"
#include <iostream> 
using namespace std;

 //clasa Eroare folosita pentru exceptie
class Eroare
{
     char* mesaj;
public:
     //constructorul clasei: pune mesajul mesaj_e
     //in data membra mesaj
     Eroare(char* mesaj_e):mesaj(mesaj_e){}
     char* eroare()
    {
          return this->mesaj;
    }
};


//clasa Produse
class Produse
{
     //datele membre
     char* nume;
     int cantitate, pret;
     //metodele membre
public:
     //consructorul clasei
     Produse(char* nume_n, int cantitate_n, int pret_n)
     {
           this->nume = nume_n;
           this->cantitate = cantitate_n;
           this->pret = pret_n;
     }
     //metoda Vinde
     void Vinde(int cantitate_v)
    {
          //aruncarea exceptiei daca cantitatea din stoc e prea mica
          if(this->cantitate < cantitate_v)
          {
                 throw Eroare("Nu aveti produse suficiente.");
          }
          this->cantitate = this->cantitate - cantitate_v;
     }

     //destructorul clasei
    ~Produse();
};

//partea de test
  int main()
{
     //initializarea clasei si a numarului de produse pe care le vindem
     Produse *instrument;
     instrument = new Produse("chitara", 5, 320);
     int nrProduseDeVazare = 7;


    //incercam sa vindem, iar daca nu reusim, returnam mesajul
    //pe care l-am aruncat in metoda Vinde() prin intermediul exceptiei
    try {
         instrument->Vinde(nrProduseDeVazare);
    } catch(Eroare& e) {

          cout<<e.eroare()<<endl;
    } 


   return 0;
}



PHP
In PHP toti membrii trebuie sa aiba inaintea lor un modificator de acces. Dar, dupa cum se vede in exemplu, lucrurile sunt un pic mai simple si mai rapide decat la C++.

//clasa Produse
class Produse
{
    //datele membre ale clasei, nu pot fi accesate din afara clasei
    protected $nume, $cantitate, $pret;
    //metodele clase, pot (public) sau nu pot(protected) fi accesate din afara clasei
    //constructorul clasei
    public function __construct($nume_n, $cantitate_n, $pret_n)
    {
          $this->nume = $nume_n;
          $this->cantitate = $cantitate_n;
          $this->pret = $pret_n;
    }
    //metoda Vinde
    public function vinde($cantitate_v)
   {
          //aruncarea exceptiei daca cantitatea din stoc este prea mica
          if($this->cantitate < $cantitate_v)
          {
                  throw new Exception('Nu aveti produse suficiente.');
          }
          $this->cantitate = $this->cantitate - $cantitate_v;
    }
    //destructorul clasei
    public function __destruct() {}
}

//partea de test
//initializarea clasei si a numarului de produse pe care dorim sa le vindem
$instrument = new Produse("chitara", 5, 320);
$nr_produse_de_vanzare = 7;

//incercam sa vindem, iar, daca nu reusim, returnam mesajul pe care l-am aruncat in metoda vinde
try {
      $instrument->vinde($nr_produse_de_vanzare);
} catch (Exception $e) {
      echo 'Eroare: ', $e->getMessage(), "\n";
}



Python

Python prin natura lui e "altfel". Are si el un constructor, __init__, respectiv un destructor, __del__, dar ceea ce ii lipseste sunt modificatorii de acces. In Python toti membrii unei clase sunt public implicit si nu se poate schimba asta. Totusi, o regula intre programatorii Python spune ca in cazul in care un membru apare de forma _nume acesta sa fie considerat protected, chiar daca in realitate e tot public.

#clasa Eroare care va fi o exceptie
class Eroare(Exception):
      def __init__(self, mesaj_e):
           self.mesaj = mesaj_e

#clasa Produse
class Produse:
      #constructorul clasei in cadrul caruia se definesc datele membre
      def __init__(self, nume_n, cantitate_n, pret_n):
          self.nume = nume_n
          self.cantitate = cantitate_n
          self.pret = pret_n
      #metoda Vinde
      def vinde(self, cantitate_v):
          #aruncarea exceptiei daca cantitatea din stoc e prea mica
          if(self.cantitate < cantitate_v):
                raise Eroare('Nu sunt produse suficiente.')
          self.cantitate = self.cantitate - cantitate_v

#partea de test
#initializarea clasei si a numarului de produse pe care le vindem
instrument = Produse('chitara', 5, 320)
nrProduseDeVanzare = 7

#incercam sa vindem, iar, daca nu reusim, afisam mesajul pe care l-am
#trimis prin clasa Eroare.
try:
      instrument.vinde(nrProduseDeVanzare)
except Eroare as e:
       print 'Eroare: ', e.mesaj
       raise

marți, 15 iunie 2010

Python 2.6, Django si Wamp pe Windows

Cu cateva zile in urma am incercat ore intregi sa configurez Python in asa fel incat sa pot scrie aplicatii web. Ar fi fost foarte rapid si usor daca as fi stiut exact ce trebuie de la inceput.


Python 2.6 si programarea pe web

Daca pentru aplicatiile ce ruleaza printr-un simplu dublu-click e usor de instalat si configurat Python, pentru aplicatiile web lucrurile devin un pic mai complicate. In primul rand, pentru a programa rapid si eficient, e nevoie de un framework. Eu am ales Django pentru ca are o documentatie foarte buna pe site. Imediat dupa asta e nevoie de o baza de date cu care Python sa interactioneze. Eu am ales MySQL datorita obisnuintei de a folosi PHP si MySQL. Problema e ca Python nu stie sa interactioneze cu bazelele de date, deci e nevoie de un modul care sa ii explice ce si cum. Apoi apare problema rularii si testarii aplicatiilor. Pentru asta Django ofera un server care e foarte simplu de folosit, insa nu poate fi folosit intr-un proiect adevarat. Drept urmare, trebuie folosit un server pentru productie. Apache e potrivit. Pentru a nu imi bate capul cu mai multe instalari si configurari, m-am gandit ca ar fi bine sa folosesc tot Wamp si pentru Python la fel cum il folosesc pentru PHP.


Cea mai buna combinatie pe care am gasit-o intre versiuni a fost: Python 2.6, MySQL-Python 1.2.3c,  Django 1.2 si versiunea de Wamp care are Apache 2.2.10 si MySQL 5.1.


Python si Environment variables (primele setari)

Pentru a putea parcurge mai usor Quick Start-ul din cadrul documentatiei de pe site-ul Django, trebuie sa puteti accesa intr-un mod cat mai simplu Python IDLE. In ajutor vine Windows-ul cu asa numitele variabile de mediu (Environment variables).

Ceea ce trebuie sa se intample e ca atunci cand se scrie python in terminalul de comenzi MS-DOS (adica in Command Prompt) sa se deschida interpretorul Python. In caz contrar, de fiecare data cand apare in exemple ceva de genul python django-admin.py va trebui scris de genul c:/Python26/python.exe django-admin.py si e destul de incomod.

Deci, dupa ce s-a instalat Python, dati click-dreapta pe My Computer, apoi urmati calea Properties->Advanced->Environment Variables

Aici trebuie sa apara o fereastra cu doua liste: User variables si System variables.

User variables 1: Dati click pe New, apoi in casuta Variable name scrieti python cu litere mici, iar in casuta Variable value scrieti calea catre python.exe . In cazul meu, D:\Python26\python.exe. 

User variables 2: Tot la User Variables, adaugati o noua variabila. Deci, click pe New, apoi la Variable name scrieti PYTHONPATH cu litere mari, iar la Variable value scrieti ceva de forma asta D:\Python26;D:\Python26\DLLs;D:\Python26\LIB;D:\Python26\LIB\LIB-TK

System variables: Aici cautati Path in lista, daca nu o gasiti, atunci creati variabila. Daca o gasiti, atunci click pe Edit, iar la Variable value la sfarsit adaugati calea catre directorul Python. In cazul meu calea e D:\Python26; .

In unele cazuri, pentru a duce la bun sfarsit configurarea, e nevoie de un restart.

In timp ce setati variabilele de mediu, trebuie sa fiti foarte atenti la partitie si numele directorului.

Dupa ce ati terminat, pentru a testa, deschideti consola de comenzi MS-DOS (ori de la Start->Programs->Accessories->Command Prompt ori de la Start->Run->cmd) si scrieti python apoi dati enter. Daca variabilele de mediu au fost create corect, atunci se va deschide interpretorul Python si puteti scrie ceva de genul print "salut", altfel va da eroarea 'python' is not recognized as an internal or external command, operable program or batch file. Deci, fiti foarte atenti la setarea variabilelor de mediu pentru a nu va da batai de cap.


Django - instalare

Django trebuie sa se instaleze foarte usor fara niciun fel de probleme. Aveti grija doar sa se dezarhiveze corect.

Sa presupunem ca ati dezarhivat Django in folderul C:/Django-1.2.1. Deschideti terminalul de comenzi MS-DOS (command prompts). In mod normal pe ultima linie scrie ceva de forma C:/Documents and Settings/Administrator . Scrieti cd \ pentru a merge in directorul radacina (adica in C:/) sau d: ori e: in cazul in care ati dezarhivat Django in D:/Django-1.2.1, respectiv E:/Django-1.2.1. Apoi scrieti cd django-1.2.1 pentru a intra in directorul Django-1.2.1.  Acum dati comanda python setup.py install pentru a instala Django. Daca ati instalat corect Python si ati setat bine variabilele de mediu, nu trebuie sa dea nicio eroare.


Wamp - instalare

Wamp se instaleaza foarte usor, cu Next, Next, Next si Finish. Trebuie instalat inainte de a trece la pasul urmator pentru ca modulul MySQL va avea nevoie de MySQL 5.1 care se instaleaza odata cu WAMP.


MySQL-Python 1.2.3c - instalare

Deoarece Python nu stie sa interactioneze cu bazele de date aveti nevoie de un modul care sa ii spuna cum sa faca asta.  Eu am ales MySQL-Python 1.2.3c pentru ca e singurul modul care mi-a mers. Desi acum exista MySQL 5.2, eu nu am gasit un modul pentru python functional pentru versiunea 5.2. Nu incercati sa instalati modulul din linia de comanda, o sa dea multe erori pentru ca are nevoie de tot felul de lucruri instalate in sistem si nu merita. In schimb, cautati pachetul de instalare, care e un fisier .exe, si instalati-l simplu dand Next, Next, Next si Finish.

Pentru a testa daca functioneaza dupa instalare, deschideti python din terminalul de comenzi si tastati import MySQLdb exact asa cum am scris eu cu litere mari si mici. Daca nu da nicio eroare, inseamna ca totul e bine.


Din acest moment puteti parcurge documentatia Django fara nicio problema. Mai departe voi explica ce trebuie facut ca Apache sa invete sa foloseasca Python la fel ca PHP.


Wamp si mod WSGI - configurare Apache

Desi Apache vine cu o serie de module folositoare, nu aduce si un modul dedicat lui Python. Din fericire Google e un mare fan Python dupa cum se vede in lista cu sponsori. Drept urmare, daca dati o cautare dupa mod wsgi veti gasi modulul chiar pe unul din site-urilor Google. Descarcati ultima versiune a modului care se potriveste cu Apache 2.2 si Python 2.6. O data descarcat fisierul .so, redenumiti-l in mod_wsgi.so si mutati-l in ...\wamp\bin\apache\Apache2.2\modules , in cazul meu locatia exacta e C:\wamp\bin\apache\Apache2.2.10\modules. 

Dati click pe iconita Wamp de langa ceas si parcurgeti meniul astfel: Apache->httpd.conf. Apare in fisier text deschis cu Notepad. Cautati o lista in care liniile incep cu LoadModule, iar la sfarsitul ei, pe linie noua, adaugati: LoadModule wsgi_module modules/mod_wsgi.so .

Atentie: in codul care urmeaza stergeti liniutele de dupa si dinaintea semnelor mai mic, respectiv mai mare.

Apoi cautati mai jos:

<-Directory "cgi-bin"->
     AllowOverride None
     Options None
     Order allow,deny
     Allow from all
<-/Directory->

Odata gasit, adaugati sub el:

#PYTHON
<-Directory "calea_catre_directorul_cu_proiecte"->
     AllowOverride None
     Options None
     Order allow,deny
     Allow from all
<-/Directory->

In cazul meu calea_catre_directorul_cu_proiecte este: d:/Python26/web/ .

Mai ramane un singur lucru de adaugat in httpd.conf. La sfarsitul textului pe linie noua scrieti: WSGIScriptAlias / "calea_catre_directorul_cu_proiecte/proiect/django.wsgi" . In cazul meu arata asa: WSGIScriptAlias / "D:/Python26/web/mysite/django.wsgi" . Daca proiectul pe care l-ati creat cu django-admin.py se numeste site_despre_prajituri atunci in loc de proiect (deci mysite in cazul meu) o sa scrieti site_despre_prajituri .

Dupa cum ati vazut, calea duce catre un fisier cu numele django.wsgi. Trebuie sa creati fisierul asta. Mergeti in folderul proiectului, in cazul meu D:/Python26/web/mysite/ , si creati fisierul django.wsgi. Deschideti-l cu un editor (poate fi Notepad sau un editor pentru limbaje de programare, in niciun caz nu puteti folosi Word sau Writer) si puneti urmatorul text in el apoi salvati:

import os, sys
sys.path.append('calea_catre_directorul_cu_proiecte')
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

In loc de mysite puneti numele proiectului pe care l-ati creat. Dupa cum am spus, poate fi site_despre_prajituri in loc de mysite. Sa fiti atenti doar sa pastrati .settings . Iar calea_catre_directorul_cu_proiecte in cazul meu, dupa cum am mai spus, este d:/Python26/web/ .


Gata

Tot ce mai trebuie sa faceti e sa restartati serverul Apache. Puteti face asta dand click pe iconita Wamp de langa ceas si apoi click pe Restart All Services sau Apache->Service->Restart Service.

Primul mesaj

Salut!
  Sunt Nicu si am creat pagina asta pentru a usura instalarea unor programe sau module. De altfel o sa pun si exemple de programe sau o sa explic unele concepte.
  De ce Ninigomi? Pentru ca Minimo este deja folosit de Mozilla.