[PYTHON] Mémorandum Django

J'ai écrit une petite application sur Django il y a environ un an, mais je l'ai oubliée, donc je m'en souviendrai en la laissant sous forme de mémorandum. J'ai comparé les derniers tutoriels de la documentation officielle car la traduction japonaise du tutoriel n'est que de 1.4, qui est une version assez ancienne, mais l'article ici Je me souviens que c'était très utile.

1.8 est déjà sorti, mais comme je l'ai fait la dernière fois en 1.7, il viendra en 1.7.

Environnement dans cet article

[sayamada@~]$cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.5 LTS"
[sayamada@~]$uname -a
Linux XXXXXX 3.13.0-65-generic #106~precise1-Ubuntu SMP Fri Oct 2 22:07:14 UTC 2015 i686 i686 i386 GNU/Linux
[sayamada@~]$python -V
Python 2.7.9 :: Anaconda 2.0.1 (32-bit)
[sayamada@~]$pip list |grep -i django
Django (1.7.1)
django-bootstrap-form (3.1)

Je ne peux pas me rooter sur un PC d'entreprise, j'utilise donc Anaconda pour rendre le thé boueux. Des gens ordinaires

$ pip install django==1.7.1

N'est-ce pas correct?

Créer un projet

Un site Web équivaut-il à un projet? Tout d'abord, j'ai fait un projet.

[sayamada@git]$django-admin.py startproject demoPrj
[sayamada@git]$tree demoPrj/
demoPrj/
├── demoPrj
│   ├── __init__.py
│   ├── settings.py --Le gars qui écrit les paramètres
│   ├── urls.py  --Le gars qui écrit le top routage
│   └── wsgi.py
└── manage.py --Script d'exécution pour les commandes de gestion

Modifications de la base de données backend

Il semble fonctionner avec sqlite par défaut, mais j'aime le modèle professionnel PostgreSQL, donc je vais le changer. ** pyscopg2 ** J'ai l'impression que je devais l'ajouter. Si vous n'aimez pas PostgreSQL, vous pouvez simplement utiliser sqlite.

settings.py


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'Nom de la base de données',
        'USER': 'Nom d'utilisateur',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '5432'
    }
}

Changer de langue

Je suis japonais donc je vais le changer.

settings.py


# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'ja'

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Tokyo'

Créer une application

Il semble que le site (projet) se compose de plusieurs ** applications **. Envie de créer une application pour chaque fonction et de l'ajouter? Qu'Est-ce que c'est?

[sayamada@git]$cd demoPrj/
[sayamada@demoPrj]$python manage.py startapp demoApp
[sayamada@demoPrj]$tree 
.
├── demoApp --Ce répertoire a augmenté
│   ├── __init__.py
│   ├── admin.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py --Celui qui définit le modèle
│   ├── tests.py 
│   └── views.py --Un gars qui écrit VIEW ou des points d'entrée logiques?
├── demoPrj
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   └── wsgi.py
└── manage.py

3 directories, 13 files

Au fait, bien qu'il ne soit pas créé par défaut, il semble qu'un grand routage soit défini dans demoPrj / urls.py et que le routage pour chaque application soit défini individuellement, alors créez ** demoApp / urls.py ** manuellement. ..

Authentification d'utilisateur

django définit à l'avance un modèle (** User **) de gestion de compte. Un middleware pour l'authentification est également disponible. Cette fois, j'ai créé le processus d'authentification dans une application appelée ** Auth **, donc je l'ajouterai également à INSTALLED_APPS.

settings.py


INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',★ Avec ça
    'django.contrib.contenttypes',★ J'ai besoin de ça
:
    'Authctl',★ Cela a été fait avec startapp
:
LOGIN_URL = '/auth/login'
LOGIN_REDIRECT_URL = '/auth/home'
:
AUTHENTICATION_BACKENDS = (
    'Authctl.AuthLogic.AuthBackEnd',
    'django.contrib.auth.backends.ModelBackend',
)

Il est inclus lors de la création du projet. Après cela, spécifiez la logique d'authentification dans AUTHENTICATION_BACKENDS. Ci-dessus se trouve la logique d'authentification que j'ai créée. J'ai oublié pourquoi il y en a deux. Le côté d'affichage de la page qui nécessite une authentification est le suivant. Cette fois, j'ai créé AuthLogic.py sous Auth et j'ai décidé d'y définir une fonction appelée AuthBackend.

demoApp/views.py


# coding:utf-8
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required

@login_required
def index(request):
    return HttpResponse(u'indice')

La méthode avec le décorateur login_required est vérifiée à l'avance pour voir si elle a été connectée. Si vous n'êtes pas connecté, vous serez redirigé vers ** LOGIN_URL ** dans settings.py. Cette fois, il s'agit de / authctl / login, vous devez donc configurer le routage pour le résoudre.

S'il y a un champ exclu dans les formulaires.

Au moment de form.save, il y a une erreur due à la contrainte NOT NULL. Vous pouvez transmettre une instance de Model avec des attributs exclus par ** instance = ** au constructeur de formulaire.

views.py


any_model_inst = AnyModel()
any_model_inst.excluded_any_ked = u"hoge"
form = AnyForm(request.POST, instance=any_model_inst)
form.save()

Afficher l'objet de demande dans le décorateur

Je ne sais pas où se trouve l'objet de la requête.

#Décorateur pour vérifier si l'accès à l'API est autorisé
def check_access_permission(func):
    import functools
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        #Le premier argument est l'objet de requête
        request = args[0]
        print request.user
        if check_any_func():
            return HttpResponseForbidden()
        # OK
        return func(*args, **kwargs)
    return wrapper

Je voulais voir l'en-tête d'autorisation

Je voulais voir l'en-tête quand j'ai lancé ce genre de chose

curl localhost:8000/api/ \
-H "Authorization: demo token" \
-X GET 

C'était comme ça

def check_access_permission(func):
    import functools
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        #Le premier argument est l'objet de requête
        request = args[0]
        #Vous pouvez l'obtenir avec ça
        print request.META.get('HTTP_AUTHORIZATION')
        if False:
            return HttpResponseForbidden()

        return func(*args, **kwargs)
    return wrapper

Je voulais faire quelque chose comme ENUM avec Form

Lorsque je voulais affiner la valeur spécifiée par REST, j'ai créé un formulaire juste pour la validation et Choice Fileld était juste

forms.py


    contact_choice = (
        ("TEL", "TEL"),
        ("Email", "Email"),
        ("FAX", "FAX"),
        ("Web", "Web"),
    )
    contact_way = forms.ChoiceField(label=u"Méthode d'enquête", choices=contact_choice,required=False, initial=None)

Avec cela, si vous entrez hoge dans contact_way, vous mourrez avec is_valid ().

Je veux savoir pourquoi valide a échoué dans le formulaire

Il a été écrit correctement dans Manual. Il semble qu'il existe plusieurs façons de l'afficher après la version 1.7.

if form.is_valid():

    something doing..
else:
        # FromClass.Il y a des erreurs dans les erreurs
        # as_json()Peut être récupéré au format JSON avec
        print  form.errors.as_json()

Le formulaire initial n'est pas récupéré avec nettoyé_data

sender_name = forms.CharField(label=u'Nom de l'expéditeur', required=False, initial=u"default sender")

Donc, si tu fais ça

sender_name = form.cleaned_data["sender_name"] # -> I expect "default sender" but None

Il est devenu.

En regardant ici, il semble que l'initiale soit les données initiales sur l'écran et ne peut pas être obtenue avec cleaning_data. Il semble que vous deviez remplacer form.clean. Il y avait une partie qui ne bougeait pas un peu, alors je l'ai finalement remplacée par la suivante.

class DisplaySharerForm(forms.Form):
...
    def clean(self):
        cleaned_data = super(DisplaySharerForm, self).clean()
        for key, value in cleaned_data.items():
            if not value:
                cleaned_data[key] = self.fields[key].initial

        return cleaned_data

Recommended Posts

Mémorandum Django
Django
Mémorandum Matplotlib
mise à jour de Django
Django Note 4
mémorandum Linux
mémorandum jinja2
Mémorandum Python
recherche django
Installation de Django
Mémorandum de commandement
Résumé de Django
Test Django
Mémorandum Python 2
[Django] Mémorandum de procédure de construction d'environnement
mémorandum complot
Mémorandum Slackbot (1)
mémorandum de multitraitement
Mémorandum MetaTrader5
Django # 2 (modèle)
Mémorandum ShellScript
Django Note 5
Django Hands On
Touchez django
Mémo Django
Résumé de Django
Les bases de Django
mémorandum pip
Django Shoho
Mémorandum Python
Paramètres initiaux de Django
mémorandum pydoc
Django + Docker
mémorandum python
Mémorandum de Pandas
mémorandum python
Mémorandum DjangoGirls
Glossaire Django
Installation de Django
Mémorandum de commandement
Django: Références
Mémorandum Python
Django Note 1
mémorandum pandas
mémorandum python
Django Note 3
Django Note 2
Mémorandum Python
Démarrage de Django
Mémo Django
Django NullCharField
Construction de l'environnement Django
Mémorandum de base Python
Mémorandum de type RAID
Django Heroku Deploy 1
Modèle HTML Django partie 2
Formulaire de demande Django 2
Django a commencé la partie 1
Mémorandum de Python Pathlib