open1024.fr

Libérez vos octets !

Outils pour utilisateurs

Outils du site


Panneau latéral

developpement:django:memo

2017-09-10: Création

MEMO DJANGO

Rappel Python & installation

Installer l'environnement virtuelle de python: virtualenv

$ pip install virtualenv

Utilisation de virtualenv:

$ cd /home/Cyberdyne_partage/Dev/django/
$ virtualenv -p /usr/bin/python3.4 gpio
$ source bin/activate
$ python --version
-> Python 3.4.2 
Depuis la version Python 3.4 il n'est plus nécessaire d'installer virtualenv :
$ python3 -m venv py34

Installer Django:

$ pip install django
$ python -m django --version
-> 1.10.3

Mettre à jour django: exemple en py3.4 django 1.10.5 vers 1.11.7

$ python -m django --version
1.10.5
$ pip install django --upgrade
Collecting django
  Downloading Django-1.11.7-py2.py3-none-any.whl (6.9MB)
    100% |████████████████████████████████| 7.0MB 217kB/s 
Collecting pytz (from django)
  Downloading pytz-2017.3-py2.py3-none-any.whl (511kB)
    100% |████████████████████████████████| 512kB 593kB/s 
Installing collected packages: pytz, django
  Found existing installation: Django 1.10.5
    Uninstalling Django-1.10.5:
      Successfully uninstalled Django-1.10.5
Successfully installed django-1.11.7 pytz-2017.3
$ python -m django --version
1.11.7

Autre méthode pour connaître la version:

$ python
>>> import django
>>> django.get_version()
'1.11.7'
>>>

Création du projet et appli Django:

Préparation du projet:

$ cd /home/Cyberdyne_partage/Dev/django/gpio/
$ source bin/activate
$ python --version
-> Python 3.4.2

Création du projet:

$ django-admin startproject webgpio
$ tree
.
├── db.sqlite3
├── manage.py
└── webgpio
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-34.pyc
    │   ├── settings.cpython-34.pyc
    │   ├── urls.cpython-34.pyc
    │   └── wsgi.cpython-34.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Test du serveur Django:

$ python manage.py runserver

Autre IP (ex: publique) et modif du port:

$ python manage.py runserver 0.0.0.0:8000

Création de l'application home:

$ python manage.py startapp home
$ tree
.
├── db.sqlite3
├── home
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── webgpio
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-34.pyc
    │   ├── settings.cpython-34.pyc
    │   ├── urls.cpython-34.pyc
    │   └── wsgi.cpython-34.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

setting.py de Django:

ALLOWED_HOSTS = ['127.0.0.1']
LANGUAGE_CODE = 'fr-fr'
 
#2016-12-14 Add static url for css and img
STATIC_URL = '/static/'
 
#2017-01-08 Add static root for tornado install (python manage.py collectstatic)
#STATIC_ROOT = "/home/Cyberdyne_partage/Dev/django/gpio/webgpio/home/static/"
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
 
#2017-01-08 Add tornado setting
TORNADO = {
    'port': 1337,    # 8000 by default
    'handlers': [],  # [] by default
    'settings': {},  # {} by default
    'handlers': [
        (r'%s(.*)' % STATIC_URL, tornado.web.StaticFileHandler, {'path': STATIC_ROOT}),
    ]
    'settings': {
        'debug': True,
    }
}

Création d'une page:

views.py

views.py
from django.shortcuts import render
 
$ Create your views here.
from django.http import HttpResponse
 
 
def index(request):
    return HttpResponse("Bonjour, vous êtes sur la page d'accueil de webgpio.")

urls.py de l'appli

Dans dossier de l'appli, créer urls.py

appli/urls.py
from django.conf.urls import url
 
from . import views
 
urlpatterns = [
    url(r'^$', views.index, name='index'),
]

urls.py du projet

projet/urls.py
from django.conf.urls import url, include
from django.contrib import admin
 
urlpatterns = [
    url(r'^home/', include('home.urls')),
    url(r'^admin/', admin.site.urls),

Test de la page

$ python manage.py runserver

Base de donnée: Modèles

Configuration

Modifier éventuellement 'nomProjet/settings.py' puis mise à jour bd:

$ python manage.py migrate

Création

Dans le fichier 'nomProjet/nomAppli/models.py' ex: 'webgpio/home/models.py' ajouter:

class Sommaire(models.Model):
    pagelist_text = models.CharField(max_length=200)

Activation

Dans le fichier 'nomProjet/nomProjet/settings.py' ex: 'webgpio/webgpio/settings.py' insérer:

INSTALLED_APPS = [
    'home.apps.HomeConfig',
    ....

Mise à jour base

$ python manage.py makemigrations home

puis

$ python manage.py migrate
Respecter l'ordre :
  1. $ python manage.py makemigrations [nom_appli] → Génère les migrations [nom_appli] permet de génèrer uniquement pour cette appli, sinon c'est tout le projet.
  2. $ python manage.py migrate → Applique les migrations de DB
Pour voir les migrations DB

$ python manage.py showmigration

Pour voir la base de données graphiquement : sqlitebrowser go sur http://sqlitebrowser.org/ pour Win et Mac
$ sudo apt-get install sqlitebrowser

suppression des données

$ python manage.py reset nom_appli

API sous shell

$ python manage.py shell
>>> from home.models import Sommaire
>>> Sommaire.objets.all()
 
>>> s = Sommaire(pagelist_text = "Lecture des entrées")
>>> s.save()
>>> s.id
1
>>> s.pagelist_text
'Lecture des entrées'
>>> s.pagelist_text = "Affichage status E/S"
>>> s.save()
>>> Sommaire.objects.all()

Pour avoir une meilleur réponse à “objects.all' ajouter dans la class Sommaire:

class Sommaire(models.Model):
    # ...
    def __str__(self):
        return self.pagelist_text

Note: Il faut redémarrer l'API shell

Pour effacer une donnée:

>>> s = Sommaire.objects.filter("Affichage status E/S")
>>> s.delete()

Mots clé base de données

  • JOINTURE: select_related()

Exemple appli webgpio/home:

  <file python>
      hwconfig_list = PinConfiguration.objects.all().order_by('pin_num_int').select_related('pin_used_text')
  </file>
  Doc: [[https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related]]

Création administrateur

Définir login/pwd

$ python manage.py createsuperuser

Pour accéder à l'admin:

http://127.0.0.1:8000/admin/

Modèles dans Admin

Modifier home/admin.py

from django.contrib import admin
 
# Register your models here.
from .models import Sommaire
admin.site.register(Sommaire)

Extensions Django

Installations :

$ pip install django-extensions

Dans settings du projet :

INSTALLED_APPS = (
    ...
    'django_extensions',
    ...
)

Exemple d'utilisation :

# Generate (and view) a graphviz graph of app models:
# need pygraphviz
$ python manage.py graph_models -a -o myapp_models.png
 
# Produce a tab-separated list of (url_pattern, view_function, name) tuples for a project:
$ python manage.py show_urls
 
# Check templates for rendering errors:
$ python manage.py validate_templates
 
# Run the enhanced django shell:
$ python manage.py shell_plus
 
# Run the enhanced django runserver, (requires Werkzeug install):
$ python manage.py runserver_plus
shell_plus

Permet d'importer les modèles Django en ligne de co

$ python manage.py shell_plus

Testé sur l'appli polls du site Django

$ python manage.py show_urls
/	django.views.generic.base.RedirectView	
/admin/	django.contrib.admin.sites.index	admin:index
/admin/<app_label>/	django.contrib.admin.sites.app_index	admin:app_list
/admin/auth/group/	django.contrib.admin.options.changelist_view	admin:auth_group_changelist
/admin/auth/group/<var>/	django.views.generic.base.RedirectView	
/admin/auth/group/<var>/change/	django.contrib.admin.options.change_view	admin:auth_group_change
/admin/auth/group/<var>/delete/	django.contrib.admin.options.delete_view	admin:auth_group_delete
/admin/auth/group/<var>/history/	django.contrib.admin.options.history_view	admin:auth_group_history
/admin/auth/group/add/	django.contrib.admin.options.add_view	admin:auth_group_add
/admin/auth/user/	django.contrib.admin.options.changelist_view	admin:auth_user_changelist
/admin/auth/user/<var>/	django.views.generic.base.RedirectView	
/admin/auth/user/<var>/change/	django.contrib.admin.options.change_view	admin:auth_user_change
/admin/auth/user/<var>/delete/	django.contrib.admin.options.delete_view	admin:auth_user_delete
/admin/auth/user/<var>/history/	django.contrib.admin.options.history_view	admin:auth_user_history
/admin/auth/user/<var>/password/	django.contrib.auth.admin.user_change_password	admin:auth_user_password_change
/admin/auth/user/add/	django.contrib.auth.admin.add_view	admin:auth_user_add
/admin/jsi18n/	django.contrib.admin.sites.i18n_javascript	admin:jsi18n
/admin/login/	django.contrib.admin.sites.login	admin:login
/admin/logout/	django.contrib.admin.sites.logout	admin:logout
/admin/password_change/	django.contrib.admin.sites.password_change	admin:password_change
/admin/password_change/done/	django.contrib.admin.sites.password_change_done	admin:password_change_done
/admin/polls/choice/	django.contrib.admin.options.changelist_view	admin:polls_choice_changelist
/admin/polls/choice/<var>/	django.views.generic.base.RedirectView	
/admin/polls/choice/<var>/change/	django.contrib.admin.options.change_view	admin:polls_choice_change
/admin/polls/choice/<var>/delete/	django.contrib.admin.options.delete_view	admin:polls_choice_delete
/admin/polls/choice/<var>/history/	django.contrib.admin.options.history_view	admin:polls_choice_history
/admin/polls/choice/add/	django.contrib.admin.options.add_view	admin:polls_choice_add
/admin/polls/question/	django.contrib.admin.options.changelist_view	admin:polls_question_changelist
/admin/polls/question/<var>/	django.views.generic.base.RedirectView	
/admin/polls/question/<var>/change/	django.contrib.admin.options.change_view	admin:polls_question_change
/admin/polls/question/<var>/delete/	django.contrib.admin.options.delete_view	admin:polls_question_delete
/admin/polls/question/<var>/history/	django.contrib.admin.options.history_view	admin:polls_question_history
/admin/polls/question/add/	django.contrib.admin.options.add_view	admin:polls_question_add
/admin/r/<content_type_id>/<object_id>/	django.contrib.contenttypes.views.shortcut	admin:view_on_site
/polls/	polls.views.IndexView	polls:index
/polls/<pk>/	polls.views.DetailView	polls:detail
/polls/<pk>/results/	polls.views.ResultsView	polls:results
/polls/<question_id>/vote/	polls.views.vote	polls:vote

django debug toolbar

Installations

$ pip install django-debug-toolbar

Dans le settins du projet :

INSTALLED_APPS = [
    # ...
    'django.contrib.staticfiles',
    # ...
    'debug_toolbar',
]
 
STATIC_URL = '/static/'
 
MIDDLEWARE = [
    # ...
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    # ...
]
 
INTERNAL_IPS = ['127.0.0.1']

Dans le fichier url.py du projet :

from django.conf import settings
from django.conf.urls import include, url
 
if settings.DEBUG:
    import debug_toolbar
    urlpatterns = [
        url(r'^__debug__/', include(debug_toolbar.urls)),
    ] + urlpatterns

Notes divers

timezone

timezone récupère date+heure du système en fonction du fuseau horaire de 'settings'.

import django.utils.timezone
django.utils.timezone.now

BASE_DIR

from django.conf import settings
print('BASE_DIR:', settings.BASE_DIR)
 
BASE_DIR: /home/jc/dev/py/py35/django/open1024

get_object_or_404

Permet de retourner une erreur 404 si l'id (pk) n'éxiste pas dans la DB

from django.http import render, get_object_or_404
from .models import Post
 
def show(request, id):
    post = get_object_or_404(Post, pk=id)
    return render(request, 'blog/show.html', {'post': post})

minutes 42

Héritage de Models

Cette technique permet de factoriser le code d'horodatage de models.Models. \ Chaque tables de la base héritent de l'horodatage de création et de modifications. \ La class Meta / abstract = True permet de stipuler à Django que TimestamptedModel c'est pas une table mais permet juste un héritage depuis models.Model :

# models.py
from django.db import models
 
class TimestamptedModele(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
 
    class Meta:
        abstract = True
 
# Create your models here.
class Post(TimestamptedModele):
    title = models.CharField(max_lenght=255)
    body = models.TextField()
 
        def __str__(self):
            return self.title
developpement/django/memo.txt · Dernière modification: 2021/07/02 10:39 de jc_online