[PYTHON] Djangos persönliche Tipps

Dieser Artikel ist der letzte Tagesartikel von Django Adventskalender 2019.

Einführung

Freut mich, dich kennenzulernen. Vielen Dank.

Normalerweise benutze ich Djnago, um Web-Apps zu entwickeln.

Ich habe es genossen, jeden Tag den diesjährigen Django Adventskalender 2019 zu sehen. Alle Artikel waren interessant und lehrreich. In diesem Artikel, dem letzten Tag dieses Kalenders, möchte ich einige grundlegende und persönliche Tipps für Django organisieren. Wir hoffen, dass dieser Artikel zur weiteren Verbreitung von Django beiträgt.

Inhaltsverzeichnis

Formularvalidierung

Wenn Sie einen Wert vom Eingabebildschirm des Webs erhalten und in Modell festlegen, können Sie überprüfen, ob kein ungültiger Wert vorhanden ist. Bei Verwendung der Djnago-Standardfunktion is_valid kann beispielsweise ein Fehler gesendet werden, wenn ein nicht numerisches Element in das IntegerField-Element eingegeben wird oder wenn ein erforderliches Element leer ist.

if form.is_valid():  #Formularvalidierung
    #wird bearbeitet
    # ...

Senden Sie Http404

Wenn Sie den Prozess verzweigen möchten, indem Sie für jede URL, auf die zugegriffen werden soll, ein Argument erhalten, ist es besser, "erhöhe Http404" in "else" zu setzen. Sie können "Server Error (500)" vermeiden, wenn in dieser Funktion ein Argument in einer unerwarteten URL übergeben wird, indem Sie die folgenden Schritte ausführen.

views.py


from django.http import Http404

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

Führen Sie eine Instanzerfassung durch und senden Sie Http404, wenn das Objekt nicht vorhanden ist

Möglicherweise möchten Sie get_object_or_404 verwenden, wenn Sie eine Abfrage ausgeben, um eine Instanz von Model abzurufen. Im folgenden Beispiel erhalten wir ein Objekt mit dem Primärschlüssel 1 von "MyModel". Wenn dieses Objekt jedoch nicht vorhanden ist, senden wir Http404. Dies sollte verhindern, dass versehentlich ein "Serverfehler (500)" verursacht wird.

views.py


from django.shortcuts import get_object_or_404

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

Zeitaufwändige Verarbeitung mit Pickle vorab durchführen

Wenn Sie in View viel verarbeiten, dauert dies lange und kann zu einer Verlängerung der Antwortzeit führen. In solchen Fällen möchten Sie möglicherweise "pickle.dump" und "pickle.load" verwenden. Verarbeiten Sie als Vorprozess die Hälfte, machen Sie das resultierende Python-Objekt zu einem Pickle und laden Sie es zur Verwendung in diesem Prozess. Dadurch wird die Reaktionszeit erheblich verbessert.

python


#Pyhton-Objekt durch eine solche Funktion->Essiggurke
def pickle_dump(obj, path):
    with open(path, mode='wb') as f:
        pickle.dump(obj,f)

#Bei Verwendung aus diesem Prozess einlegen->Kehren Sie zum Python-Objekt zurück
def pickle_load(path):
   with open(path, mode='rb') as f:
       data = pickle.load(f)
       return data

Danach ist es eine gute Idee, die Vorverarbeitung regelmäßig mit dem Job Scheduler aufzurufen und zu automatisieren.

Führen Sie im Voraus eine zeitaufwändige Verarbeitung mit Model durch

Wenn Sie Heroku verwenden und ein Djnago-Projekt in Produktion haben, funktionieren die oben genannten Methoden möglicherweise nicht. Aufgrund der Spezifikation ist das Dateisystem von Heroku temporär. Selbst wenn Sie pickle.dump das Ergebnis des Prozesses, wird die pickle nicht in Ihrem Djnago-Projekt gespeichert.

In einem solchen Fall möchten Sie möglicherweise das Python-Objekt in Model speichern.

Um das Python-Objekt unverändert in Model zu speichern, müssen Sie Custom Model Fields vorbereiten. Wenn es sich jedoch um ein Python-Objekt vom Listentyp handelt, können Sie den Django-Standard CharField verwenden, indem Sie es in das JSON-Format konvertieren.

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)

Bereiten Sie die Modellklassenmethode wie oben beschrieben vor und bedienen Sie das Modell über den Setter oder Getter. Wenn Sie json und CharField so verwenden, sollten Sie in der Lage sein, viele Fälle zu behandeln. Zum Beispiel kann pandas.DataFrame auch in Modell nach Typkonvertierung mit pandas.DataFrame-> numpy.ndarray-> list-> json gespeichert werden.

Verwenden Sie die Anmeldeauthentifizierungsfunktion

Sie verwenden häufig die Anmeldeauthentifizierungsfunktion, wenn Sie eine Webanwendung erstellen.

Die Anmeldeauthentifizierung wird in Django als Standardfunktion bereitgestellt. Mit diesen können Sie die Anmeldeauthentifizierung schnell implementieren. Dies wird auch in den offiziellen Dokumenten erläutert.

Die Implementierung der Authentifizierungsfunktion erfolgt in drei Schritten.

  1. Erstellen Sie eine App in Django Project mit dem folgenden Befehl, um die Authentifizierungsfunktion zu verwenden.
$ django-admin startapp accounts
  1. Fügen Sie die in settings.py erstellte App hinzu.
INSTALLED_APPS = [
    ...
    'accounts.apps.AccountsConfig', #hinzufügen
]
  1. Die URL, die nach erfolgreicher Anmeldung übertragen werden soll, wird auch in settings.py definiert.
#Nach dem Login zur obersten Seite umleiten
LOGIN_REDIRECT_URL = '/hoge/'

Damit ist die Implementierung der Login-Authentifizierungsfunktion abgeschlossen.

Durch Hinzufügen von `` @ login_required``` zur Ansichtsfunktion kann der Zugriff dann durch die Anmeldeauthentifizierung eingeschränkt werden.

@login_required
def sample(request):
    pass

Die Benutzerregistrierungsfunktion wird übrigens nicht als Standardfunktion von Djnago bereitgestellt, aber Sie können sie selbst erstellen. Sie können auch den Anmeldebildschirm und den Abmeldebildschirm anpassen.

Als Referenz wird der Code zum Implementieren der Benutzerregistrierungsfunktion unten gezeigt.

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'

Holen Sie sich die in Model gespeicherten Daten für jeden angemeldeten Benutzer

Wenn Sie die Anmeldeauthentifizierung implementieren, müssen Sie mit Sicherheit ein Objekt für jeden angemeldeten Benutzer aus allen in Model gespeicherten Objekten extrahieren. In einem solchen Fall können Sie nur das Objekt des angemeldeten Benutzers extrahieren, indem Sie die folgenden Bedingungen mit der Filterfunktion festlegen.

views.py


from models import Content

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

Objekte mit ODER-Bedingungen extrahieren

Beim Extrahieren eines Objekts aus einem Modell mit Django sollte die UND-Bedingung mit der Filterfunktion überlappen, die ODER-Bedingung sollte jedoch die Q-Bibliothek verwenden. Beispielsweise können Sie nur Objekte mit den Daten "2019-12-24", "2019-12-25" oder "2019-12-26" extrahieren, indem Sie Folgendes schreiben.

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

Holen Sie sich Schleifenzähler mit Vorlage

Wenn Sie die von Ansicht mit für in Vorlage übergebene Liste umdrehen, Sie können den Schleifenzähler im for erhalten, indem Sie ihn wie folgt implementieren.

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

Darüber hinaus können Sie verschiedene Schleifenzähler erhalten, indem Sie den Teil "counter" durch "counter0" (in der Reihenfolge von 0) oder "revcounter" (in umgekehrter Reihenfolge) ersetzen.

Geben Sie die Listenarraynummer in der Vorlage an

Für die Liste, die aus der Ansicht auch in der Vorlage übergeben wurde Sie können Elemente abrufen, indem Sie die Sequenznummer auf dieselbe Weise wie in Python angeben.

{{ objects.0 }}

(Extra Edition) Verwenden Sie Cloudinary als Bildspeicher

Dies ist kein Tipp, aber ich verwende normalerweise Cloudinary als Bildspeicher.

Wie unter [Zeitaufwändige Verarbeitung mit Modell vorab ausführen](# Zeitaufwändige Verarbeitung mit Modell vorab ausführen) können Dateien nicht im Django-Projekt gespeichert werden, das auf Heroku ausgeführt wird. Wenn Sie Bilder mit der Django-Anwendung auf Heroku hochladen oder die hochgeladenen Bilder verwalten möchten, müssen Sie daher den Speicher für Bilder vorbereiten.

Mit Cloudinary können Sie Bilddaten mit der Django-Anwendung verarbeiten.

Offizielles Cloudinary-Dokument

Es gibt drei Dinge, die Sie tun müssen, um Cloudinary zu verwenden:

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'

Wenn Sie es wie oben einstellen, können Sie es auf die gleiche Weise wie "ImageField" verwenden.

schließlich

Vielen Dank für das Lesen bis zum Ende. Wie war das. Wenn es andere Möglichkeiten gibt, würde ich mich freuen, wenn Sie einen Kommentar abgeben könnten.

Hab ein gutes Django-Leben!

Recommended Posts

Djangos persönliche Tipps
Tensorflow meine eigenen Tipps
Python-Tipps
numpy tipps
Jupyters Trick 5
Scapy-Tipps
Jupyters Trick 3
Persönliche Tipps zu Python (Zeichenfolgen, Protokolle)
Jupyters Trick 2
Djangos ImageField
Python-Tipps
Python-Tipps
Persönliche Tipps, wenn Sie verschiedene Dinge mit Python 3 tun