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.
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
Récent
- Masquer les clés primaires de la base de données UUID de votre application web
- Don't Repeat Yourself (DRY) avec Jinja2
- SQLAlchemy, PostgreSQL, nombre maximal de lignes par user
- Afficher les valeurs des filtres dynamiques SQLAlchemy
- Transfert de données sécurisé grâce au cryptage à Public Key et à pyNaCl
- rqlite : une alternative à haute disponibilité et dist distribuée SQLite
Les plus consultés
- Utilisation des Python's pyOpenSSL pour vérifier les certificats SSL téléchargés d'un hôte
- Utiliser UUIDs au lieu de Integer Autoincrement Primary Keys avec SQLAlchemy et MariaDb
- Utiliser PyInstaller et Cython pour créer un exécutable Python
- Connexion à un service sur un hôte Docker à partir d'un conteneur Docker
- SQLAlchemy : Utilisation de Cascade Deletes pour supprimer des objets connexes
- Flask RESTful API validation des paramètres de la requête avec les schémas Marshmallow