Cet article est le dernier article du Calendrier de l'Avent Django 2019.
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.
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
# ...
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.")
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)
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.
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.
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.
$ django-admin startapp accounts
INSTALLED_APPS = [
...
'accounts.apps.AccountsConfig', #ajouter à
]
#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'
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)
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')
)
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).
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 }}
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.
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`.
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