Ist Django für mein Projekt geeignet?

Django, Flask, Bottle, WSGI, CGI…
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: Wenn Du es installiert hast, dann ``from num2words import num2words`` und einfach die Funktion verwenden so wie in der Dokumentation.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Das habe ich auch schon probiert, da mache ich aber irgendwas falsch.
Ich wollte das ganze mal ausprobieren und habe zunächst den Code von github runtergeladen und ihn in einem neuen Visual Studio Code Projekt geöffnet und dort "pip install num2 words" ausgeführt und das auch bestätigt bekommen. Da wusste ich aber nicht weiter. Von der Shell konnte ich nicht drauf zugreifen (wahrscheinlich weil ich dazu zu blöd bin)
Dann habe ich mein Rechentrainerprojekt geöffnet und dort "from num2words import num2words" ergänzt. Das erste "num2words" wird als Fehler unterstrichen.
Also habe ich sicherheitshalber in diesem Projekt nochmals den "pip install num2words" Befehl ausgeführt und bekomme die Meldung:
"Requirement already satisfied: num2words in ..."
"num2words" ist immer aber noch mit Wellenlinie unterstrichen - irgendwas fehlt also noch.
Nochmals eine Verständnisfrage: Diese Paket "num2word" ist jetzt in meinem App-Ordner (von Python) und Python kann aus allen Projekten drauf zugreifen (bei mir noch nicht)? Aber wo hat der pip Befehl diese Paket her - ich musste ja keinen Pfad angeben?

Nachtrag: Ich will immer noch wissen, wie man mit so einem externen Code umgeht. Der ist für mich aber eigentlich viel zu umfangreich, weder brauche ich Kommazahlen, noch Kardinazahlen noch Währungen (- und auch nicht in dänisch und koreanisch). Ich habe also zwischenzeitlich meinen Code selbst zusammengebastelt und muss nur noch ein paar Formatierungen ergänzen (Großschreibung und Tausendertrennfelder). ... Aber ich wäre trotzdem dankbar, wenn ich lernen könnte was ich bei diesem num2words falsch gemacht habe.
Und noch was: Wenn ich in ferner Zukunft meinen Rechentrainer irgendwann ins Netz stelle, muss ich ja wahrscheinlich solche externen Pakete mitbedenken?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: `pip` holt sich das aus dem Internet vom Python Package Index. Da hättest Du nichts vorher manuell von Github herunterladen müssen.

Wird als Fehler unterstrichen ist keine so sinnvolle Aussage, denn selbst wenn man PyCharm benutzt, weiss man ja noch nicht was das Problem ist. PyCharm unterstreicht nicht nur, sondern gibt auch detailliertere Informationen zum Grund warum etwas unterstrichen ist. Je nach Farbe hat das auch eine andere Bedeutung. Das geht bis hin zu Namen die unterstrichen werden wenn sie Tippfehler enthalten. Also ”natürlichsprachige” Fehler. Also wenn man ``ressource = ...`` schreibt, kann einem das wegen dem doppelten "s" unterstrichen werden, weil es im Englischen nur mit einem "s" geschrieben wird.

Abhängigkeiten von Projekten gibt man mindestens als `requirements.txt` an, in einem Format das `pip` versteht. Wenn man nicht was umfangreicheres/mächtigeres wie Pipenv oder Poetry benutzt.

Wo `pip` installiert hängt auch ein bisschen davon ab wo/wie das ausgeführt wird. PyCharm legt venvs für Projekte an, und wenn man das darin installiert, dann gilt das nur für dieses venv. Und üblicherweise schliesst man in venvs beim anlegen auch die ganzen systemweit installierten Packages jenseits der Standardbibliothek aus, damit man wirklich in einer sauberen Umgebung startet.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

__blackjack__ hat geschrieben: Samstag 25. Juni 2022, 17:41 @Pitwheazle: `pip` holt sich das aus dem Internet vom Python Package Index. Da hättest Du nichts vorher manuell von Github herunterladen müssen.
Das heißt, der Ersteller hat das irgendwo im Internet hochgeladen wo es dann auch ohne Github von pip gefunden wird - oder greift pip sogar auf github zu?
__blackjack__ hat geschrieben: Samstag 25. Juni 2022, 17:41 Wird als Fehler unterstrichen ist keine so sinnvolle Aussage,
... wieder was gelernt. Also mit etwas suchen kommt "Import "num2words" could not be resolved"
__blackjack__ hat geschrieben: Samstag 25. Juni 2022, 17:41 Abhängigkeiten von Projekten gibt man mindestens als `requirements.txt` an, in einem Format das `pip` versteht. Wenn man nicht was umfangreicheres/mächtigeres wie Pipenv oder Poetry benutzt.
... PyCharm legt venvs für Projekte an, und wenn man das darin installiert, dann gilt das nur für dieses venv. Und üblicherweise schliesst man in venvs beim anlegen auch die ganzen systemweit installierten Packages jenseits der Standardbibliothek aus, damit man wirklich in einer sauberen Umgebung startet.
... das verstehe ich sicher auch irgenwann.
Danke soweit
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: Das irgendwo im Internet ist: https://pypi.org/

Da holt `pip` die Packages her, wenn man nichts anderes angibt.

Die Meldung deutet darauf hin, dass `num2words` nicht in das venv von dem Projekt installiert wurde.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

__blackjack__ hat geschrieben: Samstag 25. Juni 2022, 18:52 Die Meldung deutet darauf hin, dass `num2words` nicht in das venv von dem Projekt installiert wurde.
Und wie macht man das im Zweifelsfall?
Übrigens mein "Zahlen schreiben" ist fertig.
paddie
User
Beiträge: 101
Registriert: Donnerstag 11. Oktober 2018, 18:09

Wenn du schon PyCharm hast, mach es am Besten direkt darin.

Entweder unten auf Terminal (der ist im Normalfall dann direkt im venv) dann mit

Code: Alles auswählen

pip install num2words


Oder in den Einstellungen (Tastenkombination in der englischen Version ist <CTRL><ALT><S>).
Dann findest du unter Project: DeinProjectName den Punkt Python Interpreter.
Dort hast du dann eine Liste aller installierten Packages. Da dann einfach auf das + über der Liste und du kannst im nächsten Fenster nach dem gewünschten Paket suchen.
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Prima! Danke für die Geduld.
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

So, jetzt wird es wirklich schwierig! Könnt ihr mir auch mit svg helfen?
Ich bin ganz stolz! Mir ist es (ohne eure Hilfe) gelungen, eine Grafik zum Zahlenstarhl zu erstellen:
Bild
Hier ist der svg-Code:

Code: Alles auswählen

{% if grafik  %}
<svg viewbox="0 0 400 100">
    <defs>
        <pattern id="grid" patternUnits="userSpaceOnUse" width="10" height="10" x="0" y="0">
            <path d="M0,0 v10 h10" stroke="#57c4ff" fill="none" />
        </pattern>
        
        <pattern id="duenn" x="10" y="0" width="20" height="20" patternUnits="userSpaceOnUse">
            <rect width="1" height="20">
        </pattern>
        
        <pattern id="dick" x="10" y="0" width="100" height="20" patternUnits="userSpaceOnUse">
            <rect width="2" height="30">
        </pattern>

        <symbol id="duenn" >
            <line x1="10" y1="65" x2="10" y2="75" style="stroke:black;stroke-width:1;" />	
        </symbol>
        
        <symbol id="text" style="font-size:10px;font-family:Sans Serif, Verdana; stroke:black;stroke-width:5;fill:black">
            <text x="10" y="110"/> 
        </symbol>
    </defs>		
    <!-- Karo-Muster -->
    <rect x="0" y="0" width="700" height="400" fill="url(#grid)"></rect>
    <!--x-Achse-->
    <line x1="10" y1="70" x2="400" y2="70" style="stroke:black;stroke-width:1;" />
        <!--Pfeil-->
    <line x1="380" y1="70" x2="400" y2="70" style="stroke:black;stroke-width:1;" />	
    <line x1="390" y1="65" x2="400" y2="70" style="stroke:black;stroke-width:2;" />	
    <line x1="390" y1="75" x2="400" y2="70" style="stroke:black;stroke-width:2;" />			
    <!--dünne Linien-->
    <rect x="0" y="65" width="400" height="10" fill="url(#duenn)" />
    <!--dicke Linien-->
    <rect x="0" y="60" width="400" height="20" fill="url(#dick)" />	
    <!--Beschriftung-->	
    <text x="7" y="92" style="url(#text)">0</text>
    <text x="90" y="92" style="url(#text)">10 000</text>
    <text x="190" y="92" style="url(#text)">20 000</text>
    <text x="290" y="92" style="url(#text)">30 000</text>

    <!--x-Pfeil-->
    <line x1="380" y1="70" x2="400" y2="70" style="stroke:black;stroke-width:1;" />	
    <line x1="390" y1="65" x2="400" y2="70" style="stroke:black;stroke-width:2;" />	
    <line x1="390" y1="75" x2="400" y2="70" style="stroke:black;stroke-width:2;" />	

        <!--Aufg-Pfeil-->
    <line x1="100" y1="20" x2="100" y2="70" style="stroke:red;stroke-width:2;" />	
    <line x1="90" y1="60" x2="100" y2="70" style="stroke:red;stroke-width:2;" />	
    <line x1="110" y1="60" x2="100" y2="70" style="stroke:red;stroke-width:2;" />
</svg>
{% endif  %}
Aber jetzt fangen die Probleme erset an:
1. Der svg Code steht noch auf meiner HTML-Seite "Aufgaben.html". Da ich da jede Menge Grafiken unterbringen muss wird das viel zu unübersichtlich. Ich muss den Code auslagern. Ich habe jetzt in meinem App Verzeichnis einen neuen Ordner "svg" angelegt und den Code dort in eine Datei "Zahlenstrahl" reinkopiert. Wie aber greife ich jetzt darauf zu?
2. Ich brauche ja jede Menge ziemlich unterschiedlicher Grafiken. Hier ist es ein Zahlenstrahl, ich benötige aber auch z.B. eine Koordinatensystem, geometrische Figuren und Körper und vieles mehr. Ich hoffe, ich kann auf diese innerhalb des HTML Codes auch mit if, elif und else zugreifen. Immerhin ist es mir schon gelungen mit "if grafik" die Grafik ein- und auszuschalten.
3. Mein Zahlenstrahl braucht immer mal wieder andere Einteilungen. Für die jüngeren Schüler z.B. nur den positiven Teil. Ich habe ihn aber auch mal in 5er in 10er oder auch in 4er Teile unterteilt (4er für die Benennung von Brüchen). Ich dachte ich könnte diese als x-Achse separat abspeichern und auch mal die eine, mal die andere einblenden.
4. Den roten Pfeil muss ich natürlich verscheiben können, die Lage wird in der Entsprechenden Funktion "Zahlenstrahl" als Zufallszahl erzeugt. Da muss ich wohl mir JavaScript dran - oder? Aber dazu der Pfeil besteht ja aus drei Teilen und die Koordinaten muss ich anscheinend alle einzeln ändern. Ich habe keine möglichkeit gefunden, sie relativ zueieinander zu definieren (x, x+5, x-5), habe ich da was übersehen? Auch den Pfeil, dachte ich, als dritte svg Datei zusätzlich zum Gitter und der x-Achse hinzuzufügen.
5. Noch blöder ist das mit der Einteilung (hier 0, 10000, 20000, 30000) auch die soll (genauso wie die Einteilung der Achse) mit Zufallszahlen passieren. Ich nehme an, auch da müsste ich mit JavaScript drauf zugreifen. Ich erzeuge die zugehörigen Zufallszahlen in meiner Funktion "Zahlenstrahl" - aber wo kommt die JavaScript Datei hin und wie greift sie auf die erzeugten Zufallszahlen zu.
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Hast du diese svg-Datei von Hand erstellt?
Du könntest ja für diese Aufgabe auch einen Python Code schreiben und ihm beibringen, eine solche Datei zu erstellen.
Dabei kann er dann die Zufallszahlen berücksichtigen und ggf. weitere Parameter wie Alter/Fortschritt der Nutzer, usw.
Diese Datei kannst du dann auf HTML-Seite als ganz normale Grafik verwenden und braucht erstmal kein Javascript.
Habe das noch nicht durchgeführt, aber scheint mir recht naheliegend. Vielleicht bietet Django dafür auch etwas an.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Ich habe da nochmal drüber nachgedacht. Ich finde die Idee klasse! Ich habe überlegt, die Textbausteine in einer Datenbank zu speichern und dann einen Text daraus zu generieren ... aber dann habe ich keine Ahnung, wie man dies als svg Datei abspeichert, eine Grafik daraus erzeugt, wo man diese wiederum abspeichert und dann darauf zugreift. Kann da jemand helfen?
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Ein SVG kann letztendlich aus einem ganz normalen Template generiert werden. Du musst nur deine Zufallszahlen an das Template übergeben und im SVG entsprechend einsetzen. Der Ordner svg muss dann unterhalb des templates Ordners sein, oder in den Suchpfad der Template-Engine aufgenommen werden.

Viele Grüße
Whitie
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Danke, da muss ich drüber nachdenken bzw. ich muss das ausprobieren.
Mir ist es gerade gelungen, mithilfe dieser Seite https://pypi.org/project/django-inline-svg/ meine svg Datei auszulagern - bin aber nicht sicher, ob dass dann auch immer funktioniert.
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Pitwheazle hat geschrieben: Dienstag 28. Juni 2022, 17:28 keine Ahnung, wie man dies als svg Datei abspeichert, eine Grafik daraus erzeugt,
Der Witz bei SVG ist, dass dieser Text bereits als Grafik umgesetzt wird. Es wird keine zweite Datei erzeugt.

Ich habe deinen Text von oben minimal angepasst:
- if und endif aus dem Template herausgeworfen
- Einige Tags richtig geschlosen (rect in Zeilen 9 und 13)
- Namensraumangabe im SVG-Tag ergänzt, siehe https://wiki.selfhtml.org/wiki/SVG/Tuto ... raumangabe

Anschließend wird einfach nur dieser Text als Datei namens bspw. test.svg gespeichert.

Wenn du diese Datei in deinen Browser ziehst, wird der Browser die Grafik anzeigen.

test.svg

Code: Alles auswählen

<svg version="2"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     viewbox="0 0 400 100">

    <defs>
        <pattern id="grid" patternUnits="userSpaceOnUse" width="10" height="10" x="0" y="0">
            <path d="M0,0 v10 h10" stroke="#57c4ff" fill="none" />
        </pattern>
        
        <pattern id="duenn" x="10" y="0" width="20" height="20" patternUnits="userSpaceOnUse">
            <rect width="1" height="20" />
        </pattern>
        
        <pattern id="dick" x="10" y="0" width="100" height="20" patternUnits="userSpaceOnUse">
            <rect width="2" height="30" />
        </pattern>

        <symbol id="duenn" >
            <line x1="10" y1="65" x2="10" y2="75" style="stroke:black;stroke-width:1;" />	
        </symbol>
        
        <symbol id="text" style="font-size:10px;font-family:Sans Serif, Verdana; stroke:black;stroke-width:5;fill:black">
            <text x="10" y="110"/> 
        </symbol>
    </defs>		
    <!-- Karo-Muster -->
    <rect x="0" y="0" width="700" height="400" fill="url(#grid)"></rect>
    <!--x-Achse-->
    <line x1="10" y1="70" x2="400" y2="70" style="stroke:black;stroke-width:1;" />
        <!--Pfeil-->
    <line x1="380" y1="70" x2="400" y2="70" style="stroke:black;stroke-width:1;" />	
    <line x1="390" y1="65" x2="400" y2="70" style="stroke:black;stroke-width:2;" />	
    <line x1="390" y1="75" x2="400" y2="70" style="stroke:black;stroke-width:2;" />			
    <!--dünne Linien-->
    <rect x="0" y="65" width="400" height="10" fill="url(#duenn)" />
    <!--dicke Linien-->
    <rect x="0" y="60" width="400" height="20" fill="url(#dick)" />	
    <!--Beschriftung-->	
    <text x="7" y="92" style="url(#text)">0</text>
    <text x="90" y="92" style="url(#text)">10 000</text>
    <text x="190" y="92" style="url(#text)">20 000</text>
    <text x="290" y="92" style="url(#text)">30 000</text>

    <!--x-Pfeil-->
    <line x1="380" y1="70" x2="400" y2="70" style="stroke:black;stroke-width:1;" />	
    <line x1="390" y1="65" x2="400" y2="70" style="stroke:black;stroke-width:2;" />	
    <line x1="390" y1="75" x2="400" y2="70" style="stroke:black;stroke-width:2;" />	

        <!--Aufg-Pfeil-->
    <line x1="100" y1="20" x2="100" y2="70" style="stroke:red;stroke-width:2;" />	
    <line x1="90" y1="60" x2="100" y2="70" style="stroke:red;stroke-width:2;" />	
    <line x1="110" y1="60" x2="100" y2="70" style="stroke:red;stroke-width:2;" />
</svg>
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Kebap hat geschrieben: Mittwoch 29. Juni 2022, 13:38 Der Witz bei SVG ist, dass dieser Text bereits als Grafik umgesetzt wird. Es wird keine zweite Datei erzeugt.
...
Wenn du diese Datei in deinen Browser ziehst, wird der Browser die Grafik anzeigen.
Vielen Dank. "Meine" svg Datei wurde auch so schon als Grafik im Browser angezeigt. Das wusste ich schon. Aber jeder Nutzer würde mit Auswahl einer Kategorie mit Aufgaben, die eine Grafik erfordern, einen individuellen Code erzeugen. Aber was mache ich innerhalb von Django damit? Den Code müsste ich ja individuell für jede aufgerufene Aufgabe in meine "aufgabe.html-Seite" einfügen - und wahrscheinlich vorher irgendwo abspeichern.
Aber ich habe jetzt Whities Vorschlag ausprobiert und wenn ich das richtig sehe, löst das meine Probleme erstmal perfekt.
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Whitie hat geschrieben: Dienstag 28. Juni 2022, 18:18 Ein SVG kann letztendlich aus einem ganz normalen Template generiert werden. Du musst nur deine Zufallszahlen an das Template übergeben und im SVG entsprechend einsetzen. Der Ordner svg muss dann unterhalb des templates Ordners sein, oder in den Suchpfad der Template-Engine aufgenommen werden.

Viele Grüße
Whitie
Das ist ja genial! Damit kann ich (hoffentlich) erstmal alle Aufgaben umsetzen. Da bin ich nicht drauf gekommen, dass ich meine Parameter auch an den svg Text weitergeben kann (Hätte ich eigentlich schon :? ). Allerdings habe ich doch noch ein grundsätzliches Problem: Ich muss mit diesen Werten innerhalb des svg Codes auch rechnen können. So sind z.B. die Koordinaten des Pfeiles voneinader abhängig. Mit {{p1}} wird ja aber ein String übergeben und {{p1}}+5 funktioniert natürlich nicht. Ich hoffe aber, dass das schon machbar ist - aber wie?

Und nochwas: Aufgaben, die eine Grafik erzeugen müssen einige Parameter übergeben, mal mehr, mal weniger. Könnte ich die auch in einer Liste übergeben. Z.B. meine Funktion "zahlenstrahl"

Code: Alles auswählen

                parameter=[1, 23, 77, "x1", "x2", 107] #oder so ähnlich
        return typ, text, text, str(erg), hilfe, erg, parameter
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Hurra! Es ist mir auch gelungen ein Dictionary zu übergeben und auf dessen Elemente zuzugreifen. (Das löst auch mein Problem weiter oben, ob ich verschiedene Mengen von Werten aus meinen Funktionen zurückgeben kann (Ich hoffe, ich freue mich nicht zu früh)).
Allerdings kann ich immer noch nicht mit ihnen rechnen.

Nachtrag: Addieren (und subtrahieren) geht auch mit z.B. "{{grafik.x1|add:99}". Auf dieser Seite https://pypi.org/project/django-mathfilters/ wird ein Paket angeboten, mit dem angeblich auch multipliziert und dividiert werden kann, das klappt bei mir allerdings (noch) nicht :( .
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Noch ein Nachtrag: "|mul", "|div" ... funktioniert auch. Man muss "{% load mathfilters %}" nicht in der html-Datei voranstellen, sondern in der svg-Datei.
Pitwheazle
User
Beiträge: 869
Registriert: Sonntag 19. September 2021, 09:40

Es wird!
Bild

Code: Alles auswählen

<p>{{grafik.name}}</p>
{% if grafik.name %}
    {% include "svg/zahlenstrahl.svg" %}
{% endif %}
Ich übergebe im Dictonary "grafik" den Wert "name":"zahlenstrahl.svg". Der wird ja auch mit

Code: Alles auswählen

<p>{{grafik.name}}</p> 
angezeigt.
Jetzt wäre es perfekt, wenn ich statt

Code: Alles auswählen

 {% include "svg/zahlenstrahl.svg" %}
hier den Namen übergeben könnte

Code: Alles auswählen

 {% include "svg/{{grafik.name}}" %}
geht nicht.
Antworten