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

Utilisation de Python kwargs (keyword arguments) dans Flask url_for() pour pagination

Python kwargs est un moyen facile de transmettre des données à une fonction. En utilisant le double astérisque pour le déballage, nous pouvons passer ces données à une autre fonction.

24 novembre 2019
Dans Flask, Python
post main image
https://unsplash.com/@josephtpearson

Pour ce site j'utilise Flask et SQLAlchemy sans l'extension Flask-SQLAlchemy . J'ai besoin de pagination pour plusieurs pages. Par exemple, la page d'accueil contient la liste des blogs et devrait afficher un maximum de 12 éléments par page. Ce n'est pas si difficile à mettre en œuvre. La fonction d'affichage de la page d'accueil nécessite un numéro de page qui prend la valeur par défaut 1 s'il n'est pas spécifié :

@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)

et une partie de la classe de pagination :

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)),
            }

Rien de spécial, ça marche bien, certaines urls générées par url_for(), quand le langage est'en' :

http:127.0.0.1:8000/en/

http:127.0.0.1:8000/en/2

Notez que Flask recherche le terminal et utilise la valeur de l'argument nommé.

Paramètres d'url multi-niveaux

Dans la partie admin de l'application il y a une entrée où je peux éditer les langues. Les enregistrements de langue sont regroupés dans une version linguistique. Les versions linguistiques peuvent être listées, une nouvelle version linguistique peut être créée à partir d'une version linguistique existante, modifiée et activée. Ce schéma permet également de changer de langue à la volée, c'est-à-dire sans redémarrer l'application.

La première étape consiste à sélectionner la version linguistique. Ceci affichera une liste des langues qui peuvent être modifiées. Comme toutes les listes, la liste des langues est paginée.
Comme la fonction d'affichage de la page d'accueil ci-dessus, la fonction d'affichage de la liste des langues est appelée avec un numéro de page. Pour indiquer la version de la langue, la fonction de liste des langues est également appelée avec le language_version_id :

@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)
    ...

Notez que la fonction pagination.set_params() a maintenant un paramètre supplémentaire (nom) : language_version_id. Ceci doit être ajouté à l'url de pagination, pour qu'ils ressemblent à :

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

Ici 5 est la langue_version_id et le numéro suivant est le numéro de page.

Kwargs (keyword arguments) au sauvetage

Je n'ai pas fait grand chose de spécial avec kwargs jusqu'à présent, mais dans ce cas, cela s'avère extrêmement utile. En utilisant kwargs nous pouvons avoir un nombre illimité de keyword arguments. Ici, je n'en ai besoin que de deux, mais avec kwargs tout est en place pour en avoir trois ou plus. Ci-dessous se trouve à nouveau une partie de la classe Pagination mais maintenant avec kwargs ajouté :

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)),
            }

Dans la ligne def set_params(...) j'ai ajouté **endpoint_Q4_kwargs. Nous ne sommes pas obligés de l'utiliser, mais il est là quand nous en avons besoin. Puis dans la fonction url_for() j'ai aussi ajouté **endpoint_Q4_kwargs. La notation'**' avant endpoint_kwargs signifie que la notation keyword arguments doit être décompressée. S'il n'y a rien à déballer, pas de problème. L'ordre de keyword arguments n'est pas important ici car ils sont nommés.

Résumé

Ce qui semblait beaucoup de travail au début semblait être très facile avec Python keyword arguments. Pour la première fois, j'ai utilisé kwargs avec le double astérisque pour le déballage. Très joli.

Liens / crédits

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

En savoir plus...

Flask

Laissez un commentaire

Commentez anonymement ou connectez-vous pour commenter.

Commentaires

Laissez une réponse

Répondez de manière anonyme ou connectez-vous pour répondre.