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.
[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?
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
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'
}
}
Je suis japonais donc je vais le changer.
settings.py
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'ja'
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Tokyo'
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. ..
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.
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()
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 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
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 ().
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()
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