[PYTHON] Conseils personnels de Django

Cet article est le dernier article du Calendrier de l'Avent Django 2019.

introduction

Ravi de vous rencontrer. Je vous remercie.

J'utilise généralement Djnago pour développer des applications Web.

J'ai aimé regarder le [Calendrier de l'Avent Django 2019] de cette année (https://qiita.com/advent-calendar/2019/django) tous les jours. Tous les articles étaient intéressants et éducatifs. Donc, dans cet article, le dernier jour de ce calendrier, j'aimerais organiser quelques conseils basiques et personnels pour Django. Nous espérons que cet article contribuera à la propagation de Django.

table des matières

Validation du formulaire

Lorsque vous recevez une valeur de l'écran de saisie du Web et que vous la définissez dans Modèle, vous pouvez vérifier qu'il n'y a pas de valeur non valide. En utilisant la fonction is_valid standard de Djnago, par exemple, une erreur peut être envoyée lorsqu'un élément non numérique est saisi dans l'élément IntegerField ou lorsqu'un élément requis est vide.

if form.is_valid():  #Validation du formulaire
    #En traitement
    # ...

Envoyer Http404

Si vous souhaitez brancher le processus en recevant un argument pour chaque URL à accéder, il est préférable de définir rise Http404 dans else. Vous pouvez éviter «Erreur de serveur (500)» lorsqu'un argument est passé dans une URL inattendue dans cette fonction en procédant comme suit.

views.py


from django.http import Http404

def sample(request, mode):
    if mode == 'hoge':
        #Processus 1
    elif mode == 'fuga':
        #Processus 2
    else:
        raise Http404("No User matches the given query.")

Effectuer l'acquisition d'instance et envoyer Http404 si l'objet n'existe pas

Vous pouvez utiliser get_object_or_404 lors de l'émission d'une requête pour obtenir une instance de Model. Dans l'exemple ci-dessous, nous obtenons un objet avec une clé primaire de 1 à partir de MyModel, mais si cet objet n'existe pas, nous enverrons Http404. Cela devrait éviter de provoquer par inadvertance une Erreur de serveur (500).

views.py


from django.shortcuts import get_object_or_404

def my_view(request):
    my_object = get_object_or_404(MyModel, pk=1)

Pré-faire un traitement fastidieux avec Pickle

Lorsque vous effectuez beaucoup de traitements dans View, cela prend du temps et peut entraîner une augmentation du temps de réponse. Dans de tels cas, vous pouvez utiliser «pickle.dump» et «pickle.load». En tant que pré-processus, procédez à mi-chemin, transformez l'objet Python obtenu en pickle et chargez-le pour l'utiliser dans ce processus. Cela améliorera considérablement le temps de réponse.

python


#Objet Pyhton à travers une telle fonction->Cornichon
def pickle_dump(obj, path):
    with open(path, mode='wb') as f:
        pickle.dump(obj,f)

#Lors de l'utilisation de ce processus, pickle->Retour à l'objet python
def pickle_load(path):
   with open(path, mode='rb') as f:
       data = pickle.load(f)
       return data

Après cela, il est judicieux d'appeler régulièrement le prétraitement avec le planificateur de travaux et de l'automatiser.

Effectuez un traitement chronophage à l'avance à l'aide de Model

Si vous utilisez Heroku et avez un projet Djnago en production, essayer les méthodes ci-dessus peut ne pas fonctionner. C'est en raison de la spécification que le système de fichiers d'Heroku est temporaire. Même si vous pickle.dump le résultat du processus, le pickle ne sera pas enregistré sur votre projet Djnago.

Dans un tel cas, vous souhaiterez peut-être stocker l'objet Python dans Model.

Pour stocker l'objet Python dans Model tel quel, vous devez préparer des Champs de modèle personnalisés. Cependant, s'il s'agit d'un objet Python de type liste, vous pouvez utiliser le standard CharField de Django en le convertissant au format json.

models.py


class Pickle(models.Model):
    sample = models.CharField(max_length=255, null=True)

    def set_sample(self, x):
        self.sample = json.dumps(x)

    def get_sample(self):
        return json.loads(self.sample)

Préparez la méthode de classe Model comme décrit ci-dessus et utilisez le Model via le setter ou le getter. En utilisant correctement json et CharField de cette manière, vous devriez être capable de gérer de nombreux cas. Par exemple, pandas.DataFrame peut également être stocké dans la conversion Modèle par type avec pandas.DataFrame-> numpy.ndarray-> list-> json.

Utiliser la fonction d'authentification de connexion

Vous utiliserez souvent la fonction d'authentification de connexion lors de la création d'une application Web.

L'authentification de connexion est fournie en tant que fonction standard dans Django. Vous pouvez les utiliser pour implémenter rapidement l'authentification de connexion. Il est également expliqué dans le Document officiel.

La mise en œuvre de la fonction d'authentification est un processus en trois étapes.

  1. Créez une application dans Django Project avec la commande suivante pour utiliser la fonction d'authentification.
$ django-admin startapp accounts
  1. Ajoutez l'application créée dans settings.py.
INSTALLED_APPS = [
    ...
    'accounts.apps.AccountsConfig', #ajouter à
]
  1. L'URL à transférer après une connexion réussie est également définie dans settings.py.
#Rediriger vers la première page après la connexion
LOGIN_REDIRECT_URL = '/hoge/'

Ceci termine la mise en œuvre de la fonction d'authentification de connexion.

Ensuite, en ajoutant `` @ login_required '' à la fonction Afficher, l'accès peut être restreint par authentification de connexion.

@login_required
def sample(request):
    pass

À propos, la fonction d'enregistrement des utilisateurs n'est pas fournie en tant que fonction standard de Djnago, mais vous pouvez la créer vous-même. Vous pouvez également personnaliser l'écran de connexion et l'écran de déconnexion.

Pour référence, le code de mise en œuvre de la fonction d'enregistrement des utilisateurs est indiqué ci-dessous.

accounts/urls.py


urlpatterns = [
    path('signup/', views.SignUpView.as_view(), name='signup'),
]

accounts/views.py


from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
from django.views import generic


class SignUpView(generic.CreateView):
    form_class = UserCreationForm
    success_url = reverse_lazy('login')
    template_name = 'accounts/signup.html'

Récupérez les données stockées dans Model pour chaque utilisateur connecté

Si vous implémentez l'authentification de connexion, vous devrez sûrement extraire un objet pour chaque utilisateur connecté de tous les objets stockés dans Model. Dans ce cas, vous pouvez extraire uniquement l'objet de l'utilisateur connecté en définissant les conditions suivantes avec la fonction de filtre.

views.py


from models import Content

@login_required
def sample(repuests):
    contents = Content.objects.all().filter(user_id=request.user.id)

Extraire des objets avec des conditions OR

Lors de l'extraction d'un objet de Model avec Django, la condition AND doit être superposée à la fonction de filtre, mais la condition OR doit utiliser la bibliothèque Q. Par exemple, vous pouvez extraire uniquement les objets avec des dates 2019-12-24, 2019-12-25 ou 2019-12-26 en écrivant ce qui suit.

views.py


from django.db.models import Q
from models import Content

def sample(request):
    contents = Content.objects.filter(
                Q(date='2019-12-24') | Q(date='2019-12-25') | Q(date='2019-12-26')
                )

Obtenir le compteur de boucles avec le modèle

Lorsque vous tournez la liste passée de View avec for in Template, Vous pouvez obtenir le compteur de boucle dans le for en implémentant comme suit.

{% for list in lists %}
    {{ forloop.counter }}
{% endfor %}

De plus, vous pouvez obtenir divers compteurs de boucle en remplaçant la partie counter par counter0 (dans l'ordre à partir de 0) ou revcounter (dans l'ordre inverse).

Spécifiez le numéro de tableau de liste dans le modèle

Pour la liste passée de View même dans Template Vous pouvez récupérer des éléments en spécifiant le numéro de séquence de la même manière qu'en Python.

{{ objects.0 }}

(Edition supplémentaire) Utiliser Cloudinary comme stockage d'images

Ce n'est pas une astuce, mais j'utilise généralement Cloudinary comme stockage d'images.

Comme mentionné dans [Pré-traitement fastidieux avec Model](# Pré-traitement fastidieux à l'aide de model), les fichiers ne peuvent pas être enregistrés dans le projet Django exécuté sur Heroku. Par conséquent, si vous souhaitez télécharger des images avec l'application Django sur Heroku ou gérer les images téléchargées, vous devez préparer le stockage des images.

En utilisant Cloudinary, vous pouvez gérer les données d'image dans l'application Django.

Document Officiel Cloudinary

Il y a trois choses que vous devez faire pour utiliser Cloudinary:

--Définition du modèle --settings.py paramètres

models.py


from cloudinary.models import CloudinaryField

class Image(models.Model):
    picture = CloudinaryField('picture')

settings.py


# Add
CLOUDINARY_STORAGE = {
    'CLOUD_NAME': '*****',
    'API_KEY': '*****',
    'API_SECRET': '*****'
}

# ...

# Add
DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'

Si vous le définissez comme ci-dessus, vous pouvez l'utiliser de la même manière que ʻImageField`.

à la fin

Merci d'avoir lu jusqu'au bout. Comment était-ce. S'il existe d'autres moyens comme celui-ci, je vous serais reconnaissant de bien vouloir commenter.

Bonne vie Django!

Recommended Posts

Conseils personnels de Django
Tensorflow mes propres conseils
astuces python
astuces numpy
Astuce de Jupyter 5
Astuces Scapy
Astuce de Jupyter 3
Conseils personnels sur Python (chaînes, autour des journaux)
Le tour de Jupyter 2
ImageField de Django
Astuces Python
Astuces Python
Conseils personnels lorsque vous faites diverses choses avec Python 3