angle-uparrow-clockwisearrow-counterclockwisearrow-down-uparrow-leftatcalendarcard-listchatcheckenvelopefolderhouseinfo-circlepencilpeoplepersonperson-fillperson-plusphoneplusquestion-circlesearchtagtrashx

Verwendung von Python kwargs (keyword arguments) in Flask url_for() für die Seitennavigation

Python kwargs ist eine einfache Möglichkeit, Daten an eine Funktion zu übergeben. Mit dem doppelten Sternchen zum Entpacken können wir diese Daten an eine andere Funktion übergeben.

24 November 2019
post main image
https://unsplash.com/@josephtpearson

Für diese Website verwende ich Flask und SQLAlchemy ohne die Erweiterung Flask-SQLAlchemy . Ich brauche eine Seitennummerierung für mehrere Seiten. Zum Beispiel enthält die Homepage die Liste der Blogs und sollte maximal 12 Elemente pro Seite anzeigen. Die Umsetzung ist nicht so schwierig. Die Funktion zum Anzeigen von Homepages erfordert eine Seitennummer, die standardmäßig auf 1 gesetzt ist, wenn sie nicht angegeben ist:

@pages_blueprint.route('/', defaults={'page_number': 1})
@pages_blueprint.route('/<int:page_number>')
def homepage(page_number):

    # get total items for the selected language
    total_items = content_item_query.total_items_count()

    pagination = Pagination(items_per_page=12)
    pagination.set_params(page_number, total_items, 'pages.homepage')
    ...
    return =  render_template(
        'pages/index.html', 
        page_title=page_title,
        ...
        pagination=pagination)

und Teil der Pagination-Klasse:

class Pagination:
    ...
    def set_params(self, page_number, total_items, endpoint):
        ...
        # previous page
        if page_number > 1:
            previous_page_number = page_number - 1
            self.previous_page = {
                'page_number': previous_page_number,
                'url': url_for(endpoint, page_number=str(previous_page_number)),
            }

Nichts Besonderes, funktioniert gut, einige URLs, die von url_for() erzeugt werden, wenn die Sprache'en' ist:

http:127.0.0.1:8000/en/

http:127.0.0.1:8000/en/2

Beachten Sie, dass Flask den Endpunkt sucht und den Wert des angegebenen Arguments verwendet.

Mehrstufige URL-Parameter

Im Admin-Bereich der Anwendung gibt es einen Eintrag, wo ich die Sprachen bearbeiten kann. Sprachsätze werden zu einer Sprachversion zusammengefasst. Sprachversionen können aufgelistet werden, eine neue Sprachversion kann aus einer bestehenden Sprachversion erstellt, bearbeitet und aktiviert werden. Dieses Schema ermöglicht auch den schnellen Sprachwechsel, d.h. ohne Neustart der Anwendung.

Der erste Schritt ist die Auswahl der Sprachversion. Es wird eine Liste der Sprachen angezeigt, die bearbeitet werden können. Wie alle Listen ist auch die Liste der Sprachen paginiert.
Wie die obige Homepageansicht wird auch die Listenansicht der Sprachen mit einer Seitennummer aufgerufen. Um die Sprachversion anzugeben, wird die Funktion languages list auch mit der language_version_id aufgerufen:

@admin_language_blueprint.route('/languages/list/<int:language_version_id>/<int:page_number>')
@admin_language_blueprint.route('/languages/list/<int:language_version_id>', defaults={'page_number': 1})
@login_required
@requires_user_roles('language_admin')
def languages_list(language_version_id, page_number):

    # get total items
    total_items = len(all_languages)

    pagination = Pagination(items_per_page=6)
    pagination.set_params(page_number, total_languages, 'admin_language.languages_list', language_version_id=language_version_id)
    ...

Beachten Sie, dass die Funktion pagination.set_params() nun einen zusätzlichen (Namens-)Parameter hat: language_version_id. Dies muss der Seitenumbruch-URL hinzugefügt werden, damit sie so aussieht:

http://127.0.0.1:8000/admin/en/language/languages/list/5

http://127.0.0.1:8000/admin/en/language/languages/list/5/1

http://127.0.0.1:8000/admin/en/language/languages/list/5/2

Hier ist 5 die language_version_id und die nächste Zahl ist die Seitenzahl.

Kwargs (keyword arguments) zur Rettung

Ich habe bisher nicht viel Besonderes mit kwargs gemacht, aber in diesem Fall erweist es sich als äußerst nützlich. Mit kwargs können wir eine unbegrenzte Anzahl von keyword arguments haben. Hier brauche ich nur zwei, aber mit kwargs ist alles vorhanden, um drei oder mehr zu haben. Unten ist wieder Teil der Pagination-Klasse, aber jetzt mit kwargs hinzugefügt:

class Pagination:
    ...
    def set_params(self, page_number, total_items, endpoint, **endpoint_kwargs):
        ...
        # previous page
        if page_number > 1:
            previous_page_number = page_number - 1
            self.previous_page = {
                'page_number': previous_page_number,
                'url': url_for(endpoint, **endpoint_kwargs, page_number=str(previous_page_number)),
            }

In der Zeile def set_params(....) habe ich **endpoint_kwargs hinzugefügt. Wir müssen es nicht verwenden, aber es ist da, wenn wir es brauchen. Dann habe ich in der Funktion url_for() auch **endpoint_kwargs hinzugefügt. Die Notation "**" vor dem Endpunkt_kwargs bedeutet, dass die keyword arguments ausgepackt werden muss. Wenn es nichts zu entpacken gibt, dann kein Problem. Die Reihenfolge von keyword arguments ist hier nicht wichtig, da sie benannt sind.

Zusammenfassung

Was anfangs noch viel Arbeit schien, erschien mit Python keyword arguments sehr einfach. Zum ersten Mal habe ich kwargs mit dem doppelten Sternchen zum Entpacken verwendet. Sehr schön.

Links / Impressum

What is the purpose and use of **kwargs?
https://stackoverflow.com/questions/1769403/what-is-the-purpose-and-use-of-kwargs

Mehr erfahren

Flask

Einen Kommentar hinterlassen

Kommentieren Sie anonym oder melden Sie sich zum Kommentieren an.

Kommentare

Eine Antwort hinterlassen

Antworten Sie anonym oder melden Sie sich an, um zu antworten.