SSL, py2exe für Linux und statische Variablen und mehr

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
d0d0
User
Beiträge: 2
Registriert: Donnerstag 23. Februar 2006, 19:23

Hallo Freunde,

ich kann bislang nur wenig Python. Ich will mich aber jetzt daran machen, ein kleines Webprojekt auf pythonbasis zu bauen - sofern Python die folgenden Kriterien erfüllt.
Ich habe breits ein wenig im Forum herumgelesen, aber keine klare Antwort auf meine Fragen(Kriterien) gefunden. Vielleicht habe ich auch nicht lange genug herumgelesen.
Wie auch immer.

K1)
Bei Python ist ja ein HTTP-Server mit dabei. Kann der auch SSL, so dass Verschlüsselung der Seiten, die dadrauf laufen, möglich ist?

K2)
Kann man durch diesen HTTP-Server auch Dateien hochladen über den Webbrowser?

K3)
Nehmen wir an, auf dem HTTP-Server befindet sich eine Datei, die Werte beinhaltet. Diese Werte können von Usern interaktiv über ein Webinterface verändert werden. Dabei ist wichtig, dass Änderungen, die durch User A gemacht worden sind, User B auch sofort sehen kann.
Beispiel: Es gibt eine Int Variable mit Wert 0. User A und User B sind auf dem Server und sehen beide die 0. User A drückt den Button, der die Variable inkrementiert (also 0+1=1). Die Null wird zur 1 und bruchteile einer Sekunde später drückt User B auf den inkrementierenden Button und aus der 1 wird eine 2.
Kann man das realisieren, oder muß ich dazu eine Datenbank verwenden?
Wenn ich dazu eine Datenbank verwenden muß, ist es dann möglich, dass ich das PythonSkript, dass die Brücke zwischen Userinterface und der Datenbank bildet, in eine selbstausführbare Datei für Linux (oder auch Windows) packe und diese selbstausführbare Datei über den mitgelieferten Webserver ausführen lasse?

Ganz allgemeine Frage:
Kann man selbstgeschriebene Skripte, die man dann logischerweise in eine EXE kodiert auch verkaufen?

Viele liebe Grüße an alle!
d0d0
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi d0d0!
d0d0 hat geschrieben:Bei Python ist ja ein HTTP-Server mit dabei. Kann der auch SSL, so dass Verschlüsselung der Seiten, die dadrauf laufen, möglich ist?
Bei Python ist KEIN HTTP-Server mit dabei. Aber du kannst dir mit Python einen HTTP-Server programmieren.

Siehe http://www.python-forum.de/viewtopic.php?t=5253

Bei größeren Websites empfehle ich dir aber eher den Apache als Webserver zu verwenden. Dieser ist ziemlich ausgereift und kann auch Python-Skripte ausführen. Als CGI oder wenn es schneller sein soll als mod_python, FastCGI oder WSGI.
d0d0 hat geschrieben:Kann man durch diesen HTTP-Server auch Dateien hochladen über den Webbrowser?
Natürlich.
d0d0 hat geschrieben:Dabei ist wichtig, dass Änderungen, die durch User A gemacht worden sind, User B auch sofort sehen kann.
So etwas ähnliches habe ich kürzlich für einen Freund programmiert. Es ist zwar kein Meisterstück, aber es funktioniert. Nimm dafür das Webserver-Skript von diesem Thread Siehe http://www.python-forum.de/viewtopic.php?t=5253. Speichere folgendes Skript in den Ordner in dem auch das Server-Skript liegt. Starte den Server und öffne im Browser die im Serverfenster angegebene URL....

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1

print "Content-Type: text/plain"
print

import cgi
import cgitb; cgitb.enable()
import os
import os.path
import sys
import time
import random
import string
import glob
from pprint import pprint

BESTLIST_MAX_ENTRIES = 20
LOCKFILE_MAX_ATTEMPTS = 50
LOCKFILE_MAX_AGE_SECONDS = 20


#----------------------------------------------------------------------
def bestenliste(
    stunden_neu, 
    minuten_neu, 
    sekunden_neu, 
    email_neu, 
    name_neu, 
    max = BESTLIST_MAX_ENTRIES
):
    """
    Liest die Bestenliste aus, setzt den neuen Wert und gibt die
    Bestenliste zurueck.
    """
    
    # Bestenliste einlesen
    if os.path.exists("bestenliste.txt"):
        f = file("bestenliste.txt", "rU")
        lines = f.read().strip().split("\n")
        f.close()
    else:
        lines = []
    
    # Bestenliste in Liste schreiben
    blist = []
    if lines:
        for line in lines:
            if line:
                blist.append(
                    line.split(";", 4)
                )
    
    # Neuen Wert zu Bestenliste hinzufügen
    blist.append(
        [
            "%02i" % stunden_neu, 
            "%02i" % minuten_neu, 
            "%02i" % sekunden_neu, 
            email_neu, 
            name_neu,
        ]
    )
    
    # Bestenliste sortieren
    blist.sort()
    
    # Bestenliste neu schreiben
    f = file("bestenliste.txt", "w")
    for item in blist[:BESTLIST_MAX_ENTRIES]:
        f.write(
            "%s;%s;%s;%s;%s\n" % (
                item[0], item[1], item[2], item[3], item[4]
            )
        )
    f.close()
    
    # Rückgabe
    return blist[:BESTLIST_MAX_ENTRIES]
    

# Werte entgegennehmen
fs = cgi.FieldStorage()

stunden = fs.getvalue("stunden")
minuten = fs.getvalue("minuten")
sekunden = fs.getvalue("sekunden")
email = fs.getvalue("email")
name = fs.getvalue("name")

# Werte auswerten
if stunden and minuten and sekunden and email and name:
    try:
        # Lockfile schreiben
        lockfile_name = "%s_%s.lock" % (
            time.time(), 
            random.choice(string.ascii_lowercase)
        )
        f = file(lockfile_name, "w")
        f.write(str(os.getpid()))
        f.close()
        
        # Pruefen ob andere Lockfiles existieren
        for i in range(LOCKFILE_MAX_ATTEMPTS):
            # Alle Lockfiles auslesen
            lockfiles = glob.glob("*.lock")
            lockfiles.remove(lockfile_name)
            
            if len(lockfiles) == 0:
                # Es existieren keine anderen Lockfiles >> los geht's.
                # Logfile befuellen und auslesen
                blist = bestenliste(
                    int(stunden), int(minuten), int(sekunden), email, name
                )
                
                # Ergebnis anzeigen
                pprint(blist)
                
                # Schleife abbrechen
                break
            
            else:
                # Alle Lockfiles durchlaufen und die, die älter als 
                # LOCKFILE_MAX_AGE_SECONDS Min. sind
                # löschen.
                #os.path.getctime(filename)
                for lockfile in lockfiles:
                    ctime = os.path.getctime(lockfile)
                    if (ctime + LOCKFILE_MAX_AGE_SECONDS) < time.time():
                        try:
                            os.remove(lockfile)
                        except:
                            pass
            time.sleep(0.5)
    
    finally:
        # Lockfile loeschen
        try:
            os.remove(lockfile_name)
        except:
            pass

else:
    # Es wurden nicht alle benoetigten Daten uebergeben
    print (
        "Es muessen die Parameter 'stunden', 'minuten', 'sekunden', \n"
        "'email', 'name' und 'zeit' uebergeben werden. \n"
        "\n"
        "Das sieht z.B. so aus: \n"
        "http://localhost:8081/bestenliste.py?"
        "stunden=55&minuten=55&sekunden=55&email=email@hostname.at&name=Name \n"
    )
d0d0 hat geschrieben:Kann man selbstgeschriebene Skripte, die man dann logischerweise in eine EXE kodiert auch verkaufen?
Ja natürlich.

Wenn du mehr mit Internet machen möchtest und auch die Möglichkeit hast, einen eigenen Server zu betreiben oder Root-Zugang zu einem Internet-Server hast, dann empfehle ich dir Zope als Web-Framework. Es dauert zwar ein paar Tage, sich in Zope einzuarbeiten, dafür kann Zope aber auch alles was du je brauchen könntest. Siehe auch http://gerold.bcom.at/zope_plone/zope_a ... n_windows/

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
d0d0
User
Beiträge: 2
Registriert: Donnerstag 23. Februar 2006, 19:23

Hi Gerold,

ich danke Dir recht herzlich!!! Ich setze mich mal hin und geh' das mal durch.

Viele Grüße
d0d0
Antworten