Wie kann ich eine editierbare Tabelle in Flask erstellen und die Änderungen im Backend speichern?

Django, Flask, Bottle, WSGI, CGI…
Antworten
servus_97
User
Beiträge: 24
Registriert: Donnerstag 3. September 2020, 12:01

Hallo zusammen :)

Ich arbeite an einer Flask-Webanwendung, in der ich eine Tabelle mit NLP-Analyseergebnissen anzeigen und dem Benutzer ermöglichen möchte, die Inhalte der Tabelle zu bearbeiten.
Nachdem der Benutzer die Tabelle bearbeitet hat, möchte ich die Änderungen im Backend speichern und bei Bedarf als Excel-Datei herunterladen.

Bisher habe ich eine Tabelle mit den NLP-Ergebnissen angezeigt, aber ich habe Schwierigkeiten, sie editierbar zu machen und die Änderungen im Backend zu speichern. Hier ist der relevante Code, den ich bisher habe:

Code: Alles auswählen

@views.route('/nlp-analysis', methods=['POST'])
@login_required
def nlp_analysis():
    if request.method == 'POST':
        # Verarbeiten der JSON-Anfrage
        data = request.get_json()

        #'file_path' aus der Session 'home()' Funktion holen
        file_path = session.get('file_path')

        print(f"Dateipfad: {file_path}")
        file_extension = os.path.splitext(file_path)[-1].lower()
        print(f"Dateierweiterung: {file_extension}")

        
        # NLP-Analyse
        search_column = 'Test'
        analysis_results = analyze_esg(file_path, search_column)
        
        df_nlp = pd.DataFrame(analysis_results)
        
        session['nlp_output'] = df_nlp.to_json(orient='records')
    
        return jsonify({"nlp_output": analysis_results})
    



@views.route('/nlp-analysis-output', methods=['GET','POST'])
@login_required
def show_nlp_output():
    nlp_output = None
    nlp_output_json = None 
    nlp_output_json = session.get('nlp_output')

    user = current_user

    df_nlp = pd.read_json(nlp_output_json, orient='records')
    html_table_nlp = df_nlp.to_html(index=False,classes="table table-striped table-hover")


    return render_template('nlp_analysis_output.html', nlp_output=html_table_nlp, user=user)
    
    
    #DOWNLOAD NLP Ausgabe als Excel File
@views.route('/download-nlp-output-excel', methods=['GET'])
@login_required
def download_nlp_output_excel():
    nlp_output = session.get('nlp_output')

    # Daten in eine Excel-Datei konvertieren
    output = io.BytesIO()
    workbook = xlsxwriter.Workbook(output, {'in_memory': True})
    worksheet = workbook.add_worksheet()

    # Spaltenüberschriften hinzufügen
    worksheet.write(0, 0, 'Keyword')
    worksheet.write(0, 1, 'Category')
    worksheet.write(0, 2, 'Count')

    # Daten in die Excel-Datei schreiben
    for index, row in enumerate(nlp_output, start=1):
        keyword, category, count = row
        worksheet.write(index, 0, keyword)
        worksheet.write(index, 1, category)
        worksheet.write(index, 2, count)

    workbook.close()

    # Excel-Datei als Antwort senden
    output.seek(0)
    response = make_response(output.read())
    response.headers['Content-Disposition'] = 'attachment; filename=nlp_output.xlsx'
    response.headers['Content-Type'] = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
    return response
und mein HTML Code sieht so aus:

Code: Alles auswählen

{% extends "base.html" %}

{% block title %}NLP Ergebnis{% endblock %}

{% block content %}
  <h1 align="center">NLP Analyseergebnisse</h1>


  <pre>{{ nlp_output | safe}}</pre>

  {% if nlp_output is defined and nlp_output is not none %}
  {% if nlp_output.__class__.__name__ == 'DataFrame' %}
    <p>Die Variable nlp_output ist ein DataFrame-Objekt</p>
  {% else %}
    <p>Die Variable nlp_output hat den Typ {{ nlp_output.__class__.__name__ }}</p>
  {% endif %}
  {% else %}
    <p>Die Variable nlp_output ist nicht definiert oder ist None</p>
  {% endif %}

  <style>
    .back-button {
      position: absolute;
      top: 80px;
      left: 10px;
    }
  </style>
  
<a href="/download-nlp-output-excel" class="btn btn-primary">Excel download</a>
  <button class="back-button" onclick="location.href='/'">Zurück</button>
{% endblock %}


Könnte mir da jemand einen Ansatz geben oder eventuell weiterhelfen, ich blick da echt nicht mehr durch. Aktuell wird mir auf dem Dashboard "nlp_output" als Tabelle gezeigt.
Wenn möglich, würde ich auch gerne wissen, wie ich die geänderten Daten in eine Excel-Datei konvertieren und dem Benutzer zum Download anbieten kann.


Vielen Dank im Voraus!!!
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wie groß ist die Tabelle denn? Wenn es nur ein paar Felder sind könntest du das über ein Formular, welches ein paar input-Felder hat, die du dann für die Optik tabellarisch anordnest, realisieren.

Wenn es eine "große" Tabelle ist, wirst du wohl im JavaScript auf der Clientseite nicht umhin kommen. Ich vermute, dass es dafür vielleicht schon fertige JavaScript Frameworks gibt, die sowas können. Wobei du die Daten dann höchstwahrscheinlich in Form von JSON oder CSV zurück bekommst, d.h. du musst das auf der Serverseite noch parsen und entsprechend in deine Excel-Datei schreiben.

Gruß, noisefloor
Benutzeravatar
grubenfox
User
Beiträge: 431
Registriert: Freitag 2. Dezember 2022, 15:49

ich suche ja immer noch einen eleganten Weg um den Kontakt mit JavaScript zu vermeiden. Aus gegebenem Anlass hatte ich eben mal wieder gesucht und bin jetzt bei Transcrypt gelandet...

Hier ein Vortrag aus Paris: PyParis 2018 - Big forms with JSON schemas and transcrypt https://www.youtube.com/watch?v=RUfKgdfn6pI
Die haben offenbar auch große Tabellen bzw. Formulare mit mehr als genügend Eingabefelder (>1000 Eingabefelder nehme ich mal als "groß")

Und Transcrypt selbst ist hier zu finden: https://www.transcrypt.org
Könnte mir da jemand einen Ansatz geben oder eventuell weiterhelfen, ich blick da echt nicht mehr durch.
Ich lese von Transcrypt gerade zum ersten Mal, habe also noch keine Erfahrungswerte, aber vielleicht ist das ja ein möglicher Ansatz...
paddie
User
Beiträge: 101
Registriert: Donnerstag 11. Oktober 2018, 18:09

@grubenfox Ich benutz im Moment gerne htmx (htmx.org) damit lässt sich auch einiges machen OHNE javascript oder ähnliches anzupacken 8).

Für das Editieren einer Tabelle wäre dann vielleicht das hier nicht schlecht https://htmx.org/examples/edit-row/.
servus_97
User
Beiträge: 24
Registriert: Donnerstag 3. September 2020, 12:01

Hallo zusammen,

ich habe eure Beiträge eben erst gesehen. Ich schaue mir die Links an, danke. Die Tabelle ist 4x Spalten und n x Zeilen groß.

LG
Antworten