Projekt Dateihochlader

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

Hallo,
in meinem Studium sollen wir anhand eines Projektes Python lernen. In C/C++ habe ich schon 2 Jahre Erfahrung.

Das Projekt lautet wie folgt:

""Datenhochlader"

* Generieren eines individuellen Logins + Passwords beim ersten Einloggen
* Hochladen von Daten in zu definierende Strukturen, die dann auch nur von dem Hochladenden eingesehen werden können
* Export über eine XML-Datei, die aus einer Kombination von Struktur + Datei (oder Link auf Datei) besteht
* Es muss möglich sein, hochgeladene Dateien durch neue Versionen zu ersetzen, wobei die alten Versionen über eine History-Funktion zuänglich bleiben sollen

Kommentar: Eventuell könnte hier eine Kombination mit svn + Apache Authentication sinnvoll sein. Wäre zu prüfen"

Ich bräuchte ein Paar Ansätze wie man hier beginnen könnte, welche Bibliotheken / Techniken man braucht um das tun zu können.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Django + SVN-Bindings.


Das sollte eigentlich reichen ;)

Alternativ:
Plone und das dann ein `wenig` abspecken ;)
Oder, sogar ernst gemeint:
Zumindest die ZODB nutzen, die hat ne Versionierung und ist hierarisch aufgebaut, das würde ganz ordentlich passen.

Alles weitere sagt Google.

btw:
C oder C++, oder jeweils 2 Jahre?
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

Ich habe an sowas wie an WebDav gedacht. In dem Wikipedia einrag steht auch "Zudem ist eine Versionskontrolle implementiert." ist damit sowas wie svn gemeint? Hat jemand Erfahrungen damit?
lunar

Man kann nicht alles in Datenbanken speichern, große Binärdateien z.B. eignen sich eher schlecht. BLOBs in Datenbanken abzulegen ist eher schlechter Stil.

Stünde ich vor der Aufgabe, sowas zu *realisieren* (nicht zu *entwicklen*), dann würde ich einfach nur Trac als SVN-Frontend aufsetzen und eventuell eine kleine Webanwendung für Commits schreiben. Zusätzlich noch ein Plugin, welches die SVN-Dateisystemstruktur als XML exportiert (was auf eine Kombination von ElementTree und os.walk in einem lokalen Checkout hinausläuft ;) ).

Das wird aber kaum das sein, was die Uni fordert... also bleibt wohl nur, ein paar existierende Bibliotheken miteinander zu verbinden. SVN bringt Python-Bindings mit, für Webprogrammierung gibt es Werkzeug, und XML verarbeite ich am liebsten mit lxml...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Laines hat geschrieben:Ich habe an sowas wie an WebDav gedacht. In dem Wikipedia einrag steht auch "Zudem ist eine Versionskontrolle implementiert." ist damit sowas wie svn gemeint? Hat jemand Erfahrungen damit?
SVN hat die Möglichkeit, über WebDAV zugriff auf Ressourcen zu bieten, das was in der Wikipedia steht meint vermutlich eher Delta-V (das ist der Modus in dem SVN unsagbar langsam sich seine Dateien herunterlädt).

Eine Alternative zu SVN könnte Git sein, wie im Artikel Using Git as a versioned data store in Python beschrieben wird. Ich glaub, SVN wäre mir für die Aufgabe auch zu langweilig :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

Geil :D ``git issues`` finde ich mal echt cool ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Letztens wurde das scheinbar durch ditz populär, ticgit ist eine weitere Software die auf Git aufbaut. Nur eben in Ruby (da ist git issues vielleicht sogar eine gute Idee).

Hmm, es gibt einfach zu viele gute DVCS als das man sich für irgendeines irgendwann entscheiden könnte. Immer wenn eines ein Killerfeature hat, dann rüstens die anderen mehr oder weniger gut nach (oder sogar auch besser).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

lunar hat geschrieben: Das wird aber kaum das sein, was die Uni fordert... also bleibt wohl nur, ein paar existierende Bibliotheken miteinander zu verbinden. SVN bringt Python-Bindings mit, für Webprogrammierung gibt es Werkzeug, und XML verarbeite ich am liebsten mit lxml...
Genau :-)
Also sehe ich das richtig das es keinen Client - Server gibt sondern das ganze als Webanwendung laufen soll... Aber wie kann ich Python als Webanwendung laufen lassen? Mit Django als Unterbau? Soweit ich weis kann aber auch Apache Python interpretieren?!?! Und ich brauch ja auch eine art Oberfläche mit der ich die Daten Hochladen kann?!

Ich glaube Django + svn währe hier die schnellste Lösung, oder irre ich mich?
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Aber wie kann ich Python als Webanwendung laufen lassen?
Das stichwort hier ist WSGI. Programmiere dein Programm gemäß WSGI (oder in einem der Frameworks, die WSGI können), und du kannst es per cgi, fcgi, scgi, mod_python, mod_wsgi etc im Web verfügbar machen.
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

Gibt es in Django ein fertiges Modul/Widget welches ein Fenster öffnet und man eine Datei auswählen kann welche dann Hoch geladen wird?
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

Hi,
ich habe jetzt versucht es hin zu bekommen, aber es funktioniert nicht so wie ich will.
Könnte mir bitte Jemand ein Beispiel Zeigen?
Hier mal meine Ansätze:

models.py

Code: Alles auswählen

from django.db import models

class File(models.Model):
	filename = models.FileField(upload_to='django/%Y/%m/%d')

	class Admin:
		pass
views.py

Code: Alles auswählen

from hochlader.models import *
from settings import MEDIA_ROOT
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response, HttpResponse
from datetime import datetime
import os
import string
import re

def upload(request):
	if request.method == "POST":
		file = None
		filename = None
		filename = request.FILES['filename']['filename']
		file = request.FILES
		return HttpResponse('Hallo!')
		return HttpResponse(request.FILES['filename'])
		''' file.save_FOO_file(filename, raw_contents) '''
	else:
		return render_to_response('upload.html')
upload.html

Code: Alles auswählen

<html>
<html>
<head>
<title>Files Upload</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
<p>Browse file: <br />
<input type="file" name="filename" size="40" maxlength="500"/></p>

{% if nofile %}
<p class="error">* You have to choose a file to upload!</p>
{% endif%}

<p><input type="submit" value="Upload file"/></p>
</form>
</body>
</html>
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Laines hat geschrieben:ich habe jetzt versucht es hin zu bekommen, aber es funktioniert nicht so wie ich will.
Die Frage ist was passiert und was du erwartest. In deinem Beispiel legst du ja nur Referenzen zu den Files an, die dann verschwinden wenn die Funktion beendet. Was das geplant? Namen mit ``None`` zu initialisieren ist völlig unnötig und zwei ``return`` hintereinander bringen auch nichts.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

Auf der HTML Seite soll die Datei die hochgeladen werden soll, ausgewählt werden. Durch drücken auf den Button soll sie schließlich hochgeladen werden.

Das war es schon :)

Ich habe einfach den letzten stand von meinen Versuchen hier gepostet... Hätte ihn etwas "bereinigen" müssen... :wink:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Laines hat geschrieben:Auf der HTML Seite soll die Datei die hochgeladen werden soll, ausgewählt werden. Durch drücken auf den Button soll sie schließlich hochgeladen werden.
Ich denke dass passiert jetzt auch. Wird hochgeladen und der Server verwirft die Datei.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

Der nächste schritt währe jetzt natürlich das er die Datei nicht verwirft.
Wie würde das aussehen?

Ich hatte das mal mit

Code: Alles auswählen

file.save_FOO_file(filename, raw_contents)
versucht...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Code: Alles auswählen

deinmodel_instanz.save_datenbankfeld_file(dateiname, inhalt)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

Hallo,
das Uploaden klapt jetzt. Danke! :D Ich würde gerne die Ordner -struktur in der ich die Daten Speichern will auf der HTML Seite abbilden, gibt es das was vorgefertigtes oder hat jemand eine Idee so etwas zu realisieren? Im simpelsten Fall ein Pull Down menue... In dem ich die Ordner Auswählen kann und alle enthaltenen Dateien werden mir angezeigt...

Des weiteren möchte ich über die HTML seite Unterordner in der Ordner Struktur erstellen können.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das sind gleich ein paar Haufen Dinge zu Implementieren. Du kannst evtl. die ein paar Sachen vom PyLucid Dateimanager abschauen:
http://pylucid.net:8080/pylucid/browser ... manager.py

Screenshot: http://www.flickr.com/photos/jensdiemer ... 9/sizes/o/

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Laines
User
Beiträge: 39
Registriert: Donnerstag 15. Mai 2008, 18:42

Danke für den Link... Das Läuft jetzt auch alles soweit :D

Auf der html Seite kann man jetzt natürlich verschiedenen Aktionen ausführen. Jede Aktion hat ihren eigenen Button. Wie finde ich heraus Welcher Button gedrückt wurde? Namen haben sie ja alle.
Wenn es geht bitte mit einem kurzen Beispiel Code.

Idela währe natürlich wenn so etwa sgehen würde, nur damit ich verstehe was ich meine:

Code: Alles auswählen

if 'ButtonName' in request.input:
     Mache das was der Button tun soll
Antworten