[PYTHON] L'histoire de Django créant une bibliothèque qui pourrait être un peu plus utile

Dans le dernier avril de Heisei (27 avril 2019), Django a publié une bibliothèque qui peut être un peu utile, et l'autre jour, elle a dépassé 10000 DL, j'aimerais donc écrire un article.

Django-Boost

GitHub https://github.com/ChanTsune/django-boost

Pourquoi l'avez-vous fait en premier lieu?

À l'INIAD, j'ai eu l'occasion d'apprendre le framework d'application web Python Django dans la conférence, j'ai donc décidé de rendre le Django que j'utilisais à l'époque utile.

Que puis-je faire?

Il est un peu plus facile de faire ce que vous voulez faire lorsque vous développez avec Django. En particulier,

Il existe de nombreuses autres petites fonctions, mais je les omettrai cette fois car elles sont détaillées et sobres. Pour plus d'informations, consultez la documentation (https://django-boost.readthedocs.io/).

introduction

$ pip install django_boost

Entrez avec pip.

Réglage

Ajoutez des paramètres pour activer django_boost dans votre projet Django.

settings.py




INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_boost', #Postscript
]

Introduction pour chaque fonction

Connexion utilisateur avec une adresse e-mail

Ajoutez le contenu suivant au fichier de paramètres.

settings.py


AUTH_USER_MODEL = 'django_boost.EmailUser'

Remplacez le modèle utilisateur standard de Django par un utilisateur qui se connecte avec une adresse e-mail au lieu d'un nom d'utilisateur. Il a les mêmes champs que le modèle utilisateur standard de Django.

Utilisez les fonctions intégrées de Python dans Django Temptate

En ajoutant la description suivante au fichier modèle, les fonctions intégrées de Python peuvent être utilisées comme filtres et balises dans le modèle Django.

template.html


{% load boost %}

Liste des fonctions intégrées de Python https://docs.python.org/ja/3/library/functions.html

Personnellement, j'utilise souvent la fonction format lors du formatage des chaînes.

{% load boost %}

{{ value|format:"," }} {#Afficher les nombres tous les 3 chiffres séparés par des virgules#}

«zip» est également très pratique. De plus, pendant le développement, je pense qu'il est pratique de voir une liste de types de variables et d'attributs dans le modèle, tels que type et dir.

Bien qu'il ne s'agisse pas d'une fonction intégrée, il existe également des balises qui vous permettent de créer des objets à partir de chaînes littérales.

Dans l'exemple ci-dessous, une liste est créée.

template.html


{%load boost %}

{% literal "[1,2,3]" as lst %}

{% for i in lst %}
  <p>{{ i }}</p>
{% endfor %}

Écrivez la définition d'URL de manière facile à lire

Si vous créez plusieurs modèles pour une application, les «motifs d'url» deviendront plus difficiles à voir. Cependant, il peut être utilisé lorsqu'il est difficile de diviser le fichier.

urls.py


from django_boost.urls import UrlSet

class YourModelUrlSet(UrlSet):
    app_name = "YourModel"
    urlpatterns = [
        path('xxx/', ..., name="XXX")
        path('yyy/', ..., name="YYY")
        path('zzz/', ..., name="ZZZ")
    ]

urlpatterns = [
    path('path/to/model/', include(YourModelUrlSet))
]

Il sera plus facile de voir si vous divisez chaque modèle en vues CRUD. Je pense qu'il est également pratique de pouvoir séparer l'espace de noms pour chaque modèle.

Lancer une exception autre que Http404

Je pense que c'est une bonne idée d'émettre un 404 lorsque vous ne remplissez pas les conditions d'autorisation de visualisation. D'autres exceptions peuvent également être levées.

Pour l'utiliser, vous devez en ajouter un peu au fichier de configuration.

settings.py


MIDDLEWARE = [
    'django_boost.middleware.HttpStatusCodeExceptionMiddleware',  #Postscript
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

J'ai ajouté un middleware.

Dans cet état, si vous lancez une exception dans le processus d'affichage, le code d'état sera retourné. Dans l'exemple ci-dessous, une exception Http302 est lancée pour rediriger.

views.py


from django.shortcuts import render
from django_boost.http.response import Http302

def my_view(request):
  if request.user.email == "":
     raise Http302("/register/email/")
  return render(request, "mypage.html")

En plus du 302, il couvre la plupart des codes d'état.

Si vous souhaitez utiliser un modèle personnalisé, placez [code d'état] .html directement sous le répertoire des modèles et il sera utilisé.

Page demandant une ré-authentification à intervalles réguliers

Si vous créez une vue sur une base de classe, vous pouvez créer une page qui nécessite une authentification à intervalles réguliers en héritant de la classe de mixage comme indiqué ci-dessous.

view.py


from datetime import timedelta
from django_boost.views.mixins import ReAuthenticationRequiredMixin

class MyView(ReAuthenticationRequiredMixin,TemplateView):
    template_name = '...'
    auth_unnecessary = timedelta(hours=1)

Variable de classe ʻauth_unnecessaire` En définissant l'intervalle de ré-authentification, la ré-authentification sera demandée quand il y a une période plus longue que l'intervalle défini depuis la dernière connexion.

Pour ʻauth_unnecessaire, vous pouvez spécifier le nombre de secondes avec ʻint, ou vous pouvez le spécifier avec timedelta.

Appuyez sur les informations de l'utilisateur connecté dans la classe Form

Lors de la validation d'un formulaire, vous souhaitez souvent modifier les conditions de validation pour chaque utilisateur.

Dans un tel cas, en héritant des classes mix-in suivantes respectivement à la classe Form et à la classe View, vous pouvez toucher les informations utilisateur avec self.user depuis la classe Form.

forms.py


from django import forms
from django_boost.forms.mixins import FormUserKwargsMixin

class MyForm(FormUserKwargsMixin,Form):
   email = forms.EmailField()

   def email_clean(self):
      if self.user.email: #Adresse e-mail de l'utilisateur connecté
          ...
      ...

views.py


form django_boost.views.mixins import ViewUserKwargsMixin
from .forms import MyForm

class MyView(ViewUserKwargsMixin,FormView):
   form_class = MyForm
   ...

Un peu plus facile de déployer votre application sur heroku

Vous pouvez utiliser la commande pour générer automatiquement le fichier de paramètres requis lors du déploiement de l'application Django sur heroku.

$ python manage.py support_heroku
Generated : /Users/username/project/Procfile
Generated : /Users/username/project/runtime.txt
Generated : /Users/username/project/requirements.txt

Procfile, runtime.txt, requirements.txt sont générés automatiquement.

Si un fichier avec le même nom existe, il ne sera pas généré, donc si vous voulez l'écraser et le générer, ajoutez l'option --overwrite.

$ python manage.py support_heroku --overwrite

finalement

Comme je l'ai mentionné au début, il existe de nombreuses autres fonctionnalités petites et sobres, donc si vous êtes intéressé, veuillez consulter Documentation. S'il te plait donne moi.

Les développeurs seront ravis de recevoir les étoiles! https://github.com/ChanTsune/django-boost

Recommended Posts

L'histoire de Django créant une bibliothèque qui pourrait être un peu plus utile
L'histoire de la création d'un site qui répertorie les dates de sortie des livres
L'histoire de la création d'une application Web qui enregistre des lectures approfondies avec Django
Une collection de ressources qui peuvent être utiles pour créer et développer des fichiers dotfiles
Une histoire qui réduit l'effort de fonctionnement / maintenance
Une histoire qui a analysé la livraison de Nico Nama.
4 boîtes qui pourraient être utiles pour les hackers de Pepper
L'histoire de la création d'un canal VIP dans le chatwork en interne
L'histoire du champ de modèle Django disparaissant de la classe
L'histoire de la création d'une base de données à l'aide de l'API Google Analytics
L'histoire de l'exportation d'un programme
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
L'histoire de la création d'un module qui ignore le courrier avec python
Voici un résumé des choses qui pourraient être utiles pour traiter des nombres complexes en Python
Une petite histoire addictive avec les permissions du répertoire spécifié par expdp (pour les débutants)
L'histoire de la création d'un Bot qui affiche les membres actifs dans un canal spécifique de Slack avec Python
[Python] Un programme qui calcule le nombre de chaussettes jumelées
L'histoire du développement d'une application WEB qui génère automatiquement des copies de capture [MeCab]
Une note sur les fonctions de la bibliothèque Linux standard qui gère le temps
L'histoire de la création d'un package qui accélère le fonctionnement de Juman (Juman ++) & KNP
L'histoire du traitement A du blackjack (python)
L'histoire de l'utilisation de mysqlclient car PyMySQL ne peut pas être utilisé avec Django 2.2
Une histoire sur la création d'un programme qui augmentera le nombre d'abonnés Instagram de 0 à 700 en une semaine
L'histoire de la création de Botonyan qui renvoie le contenu de Google Docs en réponse à un mot-clé spécifique sur Slack
L'histoire de la création d'une compétence (probablement) minimale qui implémente la personnalisation et la facturation des compétences
L'histoire de l'adresse IPv6 que je souhaite conserver au minimum
L'histoire de la fabrication d'une boîte qui interconnecte la mémoire AL de Pepper et MQTT
Une histoire qui pourrait améliorer les performances simplement en changeant le type de numpy
L'histoire de la création d'un Line Bot qui nous raconte le calendrier de la programmation du concours
DJango Memo: depuis le début (création d'une vue)
Framework Django REST Un peu utile à savoir.
L'histoire de l'affichage des fichiers multimédias dans Django
L'histoire de la création d'un générateur d'icônes mel
Une expression régulière qui trouve une sous-chaîne contenant N caractères consécutifs ou plus
Article qui vous aidera à comprendre un peu l'algorithme de collision de sphères rigides
[Attention] Lors de la création d'une image binaire (1 bit / pixel), faites attention au format de fichier!
L'histoire du lancement d'un serveur Minecraft depuis Discord
[Python] Un programme qui compte le nombre de vallées
Soyez prudent lors de la différenciation des vecteurs propres d'une matrice
Ajouter une liste de fonctions de bibliothèque numpy petit à petit --a
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
L'histoire de la création d'un réseau neuronal de génération musicale
Une histoire qui a eu du mal avec l'ensemble commun HTTP_PROXY = ~
Remarque DJango: depuis le début (création d'une vue à partir d'un modèle)
Générer cette forme du fond d'une bouteille pour animaux de compagnie
Une histoire sur le changement du nom principal de BlueZ
L'histoire selon laquelle la valeur de retour de tape.gradient () était None
Le problème Zip 4 Gbyte est une histoire du passé
L'histoire de la confusion entre la production japonaise et Django
[Python] Un programme qui compare les positions des kangourous.
Je suis à Singapour en ce moment Une histoire sur la création d'un LineBot et la volonté de faire un travail mémorable
L'histoire de la création d'un «espace de discussion sur l'esprit et le temps» exclusivement pour les ingénieurs de l'entreprise
Une bibliothèque qui surveille la vie et la mort d'autres machines en envoyant un ping à partir de Python
Une histoire qui rend le débogage de modèle plus facile à voir dans l'environnement Django + SQLAlchemy
[Python] Un programme pour trouver le nombre de pommes et d'oranges qui peuvent être récoltées
L'histoire de sys.path.append ()
Un outil qui transforme automatiquement le gacha de Soshage
Ajouter une liste de fonctions de la bibliothèque numpy petit à petit --- b