Diferència entre revisions de la pàgina «Django»

De Cacauet Wiki
Salta a la navegació Salta a la cerca
(Hi ha 48 revisions intermèdies del mateix usuari que no es mostren)
Línia 1: Línia 1:
Django és un ''framework'' per sites web basat en Python.
+
Django és un ''framework web'' basat en Python molt popular. Està orientat a la rapidesa de desenvolupament.
 +
Django or "The web framework for perfectionists with deadlines".
  
OJU amb les versions. Per GAE 1.8.7 cal Django <= 1.5 , és a dir <strike>no Django 1.6</strike> (Nov 2013).
+
<nowiki>#FpInfor #DawMp07 #DawMp07Uf2 #DawMp07Uf02 #DawMpDual</nowiki>
  
  
== Referències vàries ==
+
== Introducció ==
Algunes referències:
+
Pàgina oficial:
* http://www.djangoproject.com
+
https://www.djangoproject.com/
* Tutorial estupendu: https://docs.djangoproject.com/en/1.6/intro/tutorial01/
+
 
* Extendre els camps del User: http://stackoverflow.com/questions/44109/extending-the-user-model-with-custom-fields-in-django
+
Articles relacionats:
* Model camps (fields) en Django:
+
* [[Django en producció]]
** 1.5 https://docs.djangoproject.com/en/1.5/topics/db/models/
+
* [[Virtualenv]]
** DEV https://docs.djangoproject.com/en/dev/ref/models/fields/
+
 
* Enllaçar pàgines del front i back end (admin):
+
Es basa en un '''paradigma MTV o Model-Template-View'''. És similar al arxiconegut MVC o Model-View-Controller, però la terminologia pot induir a confusions. En el cas de MVC, la ''view'' és la part visual o GUI, mentre que en el MTV, la ''view'' és el codi amb la lògica de negoci (equivaldria al ''controller'' del MVC).
** http://stackoverflow.com/questions/9873582/adding-link-to-django-admin-page
+
 
* Projecte exemple GAE+Django (amb django-nonrel): https://github.com/ecoopro/ecoop
+
ULL doncs amb els noms!
* Forms:
+
Model -   '''View'''  - Controller
** https://docs.djangoproject.com/en/dev/topics/forms/
+
Model - Template -   '''View'''
** https://docs.djangoproject.com/en/dev/topics/forms/modelforms/
+
 
* Singletons en Django (útil per la config): http://goodcode.io/blog/django-singleton-models/
+
Django està molt implantat a tot el món web, disposa de gran prestigi i té un creixement ràpid de desenvolupadors i ofertes de feina relacionades.
* Uploading files: https://docs.djangoproject.com/en/dev/topics/http/file-uploads/
+
 
* Static files: https://docs.djangoproject.com/en/dev/howto/static-files/
+
Plug-ins interessants:
* Deployment amb buildout: https://pypi.python.org/pypi/djangorecipe/1.7
+
* [https://django-admin-sortable2.readthedocs.io/en/latest/usage.html django-admin-sortable2]: per poder fer llistes ordenables per JS
* ...
+
* Oauth2
 +
* RIchTextField
 +
* Easy Select2 : per incrustar cercadors amb autocmpletar en els camps de FK o ManyToMany
 +
 
 +
 
 +
<br>
 +
 
 +
== Preparatius i instal·lació ==
 +
Per desenvolupar amb Django ens serà molt útil (per no dir imprescindible) utilitzar [[Virtualenv]].
 +
 
 +
Abans de començar, [[Virtualenv|configura el teu entorn com s'explica en aquest article]].
 +
 
 +
<br>
 +
 
 +
== Exemple: botiga ==
 +
Podeu agafar aquest projecte d'exemple per clarificar les funcions bàsiques de Django:
 +
https://github.com/emieza/django-botiga
 +
 
 +
<br>
 +
 
 +
== Backend ==
 +
El ''backend'' de Django o panell d'administració.
 +
 
 +
Per treballar el ''backend'' podem fer ús del TUTORIAL oficial de Django, que està molt ben documentat:
 +
https://www.djangoproject.com/start/
 +
 
 +
Per poder dominar mínimament les possibilitats del ''backend'' segueix al menys aquestes parts del tutorial:
 +
* Part 1: creació de projecte i primera ''view''
 +
* Part 2: model, BD, admin backend
 +
* Part 7: customize admin i ''inlines''
 +
* Investiga la propietat '''list_editable''' del ModelAdmin. Per a què serveix?
 +
 
 +
A partir d'aquí podrem plantejar un projecte que implementi tot el CRUD en el ''backend''.
 +
# Planteja el projecte al professor. Que et doni el vist-i-plau abans de començar. El projecte hauria d'incloure usuaris i permisos diversos.
 +
# Implementa el model amb Django. Imprescindible posar adequadament les FK (Foreign Keys).
 +
# Mira si pots incloure ''inlines'' en alguna de les entitats del model (Ref. tutorial 7)
 +
# Planteja't si la interfície que tens ara mateix et serveix com a ''backend'' o si necessita alguna restricció.
 +
#* Per restringir i personalitzar les dades visualitzades en el backend pots personalitzar-ho a admin.py seguint la [https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_queryset doc oficial de Django Admin Site].
 +
#* Si vols [https://stackoverflow.com/questions/45393989/django-queryset-filter-foreignkey filtrar per FKs mira't aquest post] o bé la [https://docs.djangoproject.com/en/2.0/ref/models/querysets/ doc oficial del Queryset].
 +
#* Mira si algun dels camps dels formularis de detall convé posar-los en read-only.
 +
# Planteja la lògica de negoci.
 +
# Implementa restriccions del backend perquè s'adapti a la lògica de negoci.
  
 
<br>
 
<br>
  
== Django ==
+
== Django Auth i User model ==
 +
Per utilitzar el model ''User'' de Django dins del teu projecte (per exemple, per fer una Foreign Key) només cal importar-lo i utilitzar ForeignKey.
 +
 
 +
Per Django 1.x:
 +
from django.contrib.auth import User
 +
class MyModel(models.Model):
 +
    ...
 +
    usuari = models.ForeignKey(User)
 +
    ...
 +
 
 +
Per [https://docs.djangoproject.com/en/2.0/topics/auth/customizing/#referencing-the-user-model referenciar el User] en Django 2.x:
 +
from django.conf import settings
 +
from django.db import models
 +
 +
class Article(models.Model):
 +
    author = models.ForeignKey(
 +
        settings.AUTH_USER_MODEL,
 +
        on_delete=models.CASCADE,
 +
    )
  
Setup:
+
Per ampliar el mòdul de ''Auth'' de Django i afegir camps al User, es pot fer de diverses maneres. Aquest article n'explica molt bé 4 d'elles:
* Virtualenv
+
https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#onetoone
* Iniciar projecte <pre>$ django-admin.py startproject myproj</pre>
 
* Iniciar app: <pre>$ python manage.py startapp myapp</pre>
 
* settings.py:
 
** Ajustar DB
 
** Afegir app
 
** Activar admin
 
* myapp/admin.py
 
** registrar models a administrar (admin forms) <pre>admin.site.register( Soci )</pre>
 
* Crear myapp/models.py
 
* Crear taules: <pre>$ python manage.py syncdb</pre>
 
* Engegar site: <pre>$ python manage.py runserver</pre>
 
  
 
<br>
 
<br>
  
== Google App Engine ==
+
== Bases de dades ==
GAE:
+
 
* Tutorial Python: https://developers.google.com/appengine/docs/python/gettingstartedpython27/introduction
+
=== Migracions ===
* Darreres versions: https://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Python
+
Hauràs vist que en el moment de fer "migration" Django crea la base de dades. Si canviem el nostre model (a models.py), per exemple afegint camps nous, està clar que el contingut de la BD hauria de canviar també. A aquest procés en diem migració, tot i que el context de migració està més associat a traslladar les dades d'un SGBD a un altre.
* ...
+
 
 +
En versions anteriors de Django teniem el problema que si canviàvem el model havíem de refer tota la base de dades de nou. La eina "South" va permetre migrar les dades, i finalment s'ha integrat dins de Django.
 +
 
 +
Un cop fet un canvi en el model, caldrà executar:
 +
$ python manage makemigrations <opcional:nom_app>
 +
$ python manage migrate
 +
 
 +
=== SQLite vs MySQL ===
 +
Per defecte Django utilitza SQLite ja que és més senzilla de configurar i guarda les dades en un arxiu db.sqlite a l'arrel del projecte.
 +
 
 +
Per diversos motius ens pot interessar canviar el motor de la BD a un de més sofisticat, com pot ser MySQL. Alguns d'aquests motius son:
 +
* Eficiència
 +
* Multithreading
 +
* Ús de tipus de dades més sofisticats com la Geolocalització
 +
 
 +
'''Per canviar a MySQL hem de fer les següents passes:'''
 +
 
 +
Instal·lar els següents paquets del sistema:
 +
$ sudo apt-get install libmysqlclient-dev python-dev python-gdal python-mysql.connector python-mysqldb python-mysqldb libssl-dev
 +
 
 +
Instal·lar els següents paquets del [[Virtualenv]]:
 +
* Per python 2.x:<pre>(env) $ pip install mysql-python</pre>
 +
* Per python 3.x:<pre>(env) $ pip install mysql-connector-python mysqlclient</pre>
 +
 
 +
Canviar el ''backend'' de BD de ''settings.py'':
 +
DATABASES = {
 +
    'default': {
 +
        'ENGINE': 'django.db.backends.mysql',
 +
        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 +
        'PASSWORD': 'lalalaxxx',
 +
        'HOST': 'localhost',
 +
        'PORT': '3306',
 +
        'NAME': 'twitter',
 +
        'USER': 'projectex',
 +
    }
 +
}
  
Per instal·lar la darrera versió de GAE per Python:
+
Per [https://ruddra.com/posts/install-mysqlclient-macos/#step-four-install-xcode-select instal·lar MySQL connector en Mac OS] és un pèl mes complicat que en Linux.
# Descarrega-la del link indicat més amunt. Per exemple, en aquests moments la darrera versió és:<pre>$ wget http://googleappengine.googlecode.com/files/google_appengine_1.8.7.zip</pre>
 
# Descomprimir l'arxiu al vostre ''home'' directory.
 
# Afegir al PATH la ruta del SDK:<pre>$ export PATH=$PATH:~/google_appengine</pre>
 
# Si voleu deixar aquesta configuració permanent per no haver de fer-la cada cop que engegues la màquina, afegeix la darrera línia al teu '''.bashrc'''
 
  
 
<br>
 
<br>
  
== Django i GAE ==
+
== Frontend ==
Unint Django i GAE:
+
 
* Django i GAE: https://developers.google.com/appengine/articles/django-nonrel
+
Pots practicar alguns [https://bytes.cat/doku.php/django_frontend elements previs al tutorial de frontend en aquest mini tutorial].
* http://www.allbuttonspressed.com/projects/djangoappengine
+
 
* Per [https://django-nonrel.readthedocs.org/en/latest/content/All%20Buttons%20Pressed%20-%20CMS%20&%20blog%20for%20Django-nonrel.html provar un CMS fet amb Django-nonrel] i per GAE.
+
Tutorials:
* Projecte GAE+Django (cooperativa):
+
* https://www.tutorialspoint.com/django/index.htm
** https://github.com/ecoopro/ecoop
+
* Oficials de Django:
* ...
+
** [https://docs.djangoproject.com/en/1.11/intro/tutorial03/ Django Tutorial Part 3: views, templates]
 +
** [https://docs.djangoproject.com/en/1.11/intro/tutorial04/ Django Tutorial Part 4: forms]
 +
** [https://docs.djangoproject.com/en/1.11/intro/tutorial06/ Django Tutorial Part 6: fitxers estàtics i CSS]
 +
 
 +
Documentació rellevant:
 +
* Class-based views i generic views:
 +
** https://docs.djangoproject.com/en/1.11/topics/class-based-views/
 +
** https://docs.djangoproject.com/en/1.11/ref/class-based-views/generic-display/
 +
** https://docs.djangoproject.com/en/1.11/ref/class-based-views/generic-editing/
 +
 
 +
Plug-ins:
 +
* django-money
 +
* django-richtextfield
 +
* django-oauth-toolkit
 +
 
 +
=== Autenticació en el frontend ===
 +
Per fer la autenticació en el front-end podriem fer-nos la nostra pròpia ''view'' seguint les indicacions de la doc oficial:
 +
https://docs.djangoproject.com/en/1.11/topics/auth/default/
 +
 
 +
...però és més pràctic utiltizar un seguit de views predefinides que son típiques i ens serviran prou bé:
 +
https://docs.djangoproject.com/en/1.11/topics/auth/default/#using-the-views
 +
 
 +
Un cop fet el sistema de login/logout, serà fàcil consultar en tot moment quin user tenim logat mitjançant la ''request'':
 +
def view_tal(request):
 +
    usuari = request.user
 +
 
 +
Per augmentar les possibilitats d'autorització, és interessant tenir en compte els següents plugins i hacks:
 +
* [https://stackoverflow.com/questions/37332190/django-login-with-email Canviar el username per l'email]
 +
* Gestionar accessos a les views amb Decorators:
 +
** [https://docs.djangoproject.com/en/1.11/topics/auth/default/#the-permission-required-decorator @permission_required]
 +
** @login_required
 +
** [https://docs.djangoproject.com/en/1.11/topics/auth/default/#the-loginrequired-mixin LoginRequiredMixin]
 +
** ...
 +
 
 +
=== Ampliar el model del User ===
 +
Sovint ens fa falta ampliar els atributs o comportament del User de Django. Hi ha diverses de fer-ho. Aquest article ens dona diverses opcions i ens explica quan utiltizar-les:
 +
https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html
 +
 
 +
Resumint:
 +
* Utilitzant un Proxy Model
 +
* Creant un Profile relacionat amb el User amb un One-to-One relationship
 +
* Derivant un CustomUser de AbstractBaseUser
 +
* Derivant un CustomUser de AbstractUser
 +
 
 +
 
 +
=== OAuth ===
 +
OAuth es mereix comentaris a part, ja que és molt útil per les xarxes socials i cada dia esdevé més important:
 +
* Primer, una mica d'[http://www.thegameofcode.com/2012/07/conceptos-basicos-de-oauth2.html explicacions sobre OAuth] : imprescindible lectura!!
 +
* [https://fosstack.com/how-to-add-google-authentication-in-django/ Tutorial per utilitzar social-auth-app-django] : el típic plugin per poder logar-nos a la nostra app via Facebook o Google.
 +
** Si et dona algun error quan et loguis, pensa a activar Google+ a les apis de Google.
 +
* [https://django-oauth-toolkit.readthedocs.io/en/latest/index.html Django-OAuth-Toolkit]: per fer nosaltres de servidor OAuth (cas poc habitual)
 +
* Un cop t'hagis familiaritzat amb aquestes llibreries, pots ampliar com treballar amb Oauth2 per accedir als recursos de Google API com contactes, calendaris, etc. És complexe, però [https://developers.google.com/people/quickstart/python pots començar pel Google APIs Quickstart]
 +
 
 +
<br>
  
=== Tutorial ===
+
== Projecte amb Django ==
Realitzat amb Django 1.5.5 i GAE 1.8.7
+
Seguidament proposem una guia per realitzar un projecte amb Django, un cop hagis finalitzat els tutorials anteriorment esmentats.
  
 +
Comentarem les diferents passes amb aquest projecte d'exemple, es tracta d'una llista de karaoke per demanar torn, penjar el vídeo i votar els temes:
 +
https://github.com/emieza/karaokelist
  
# Instal·la GIT i Mercurial: <pre>$ apt-get install git mercurial</pre>
+
Guia:
# Descarregueu el [https://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Python GAE SDK], descomprimiu-lo (unzip) al vostre ''home directory'' i incloïu-ho al PATH amb: <pre>$ export PATH=$PATH:~/google_appengine</pre>
+
# '''Preparació''':
# Descarregar la testapp amb:<pre>$ git clone https://github.com/django-nonrel/django-testapp.git</pre>
+
## Clarificar la funcionalitat del projecte.
# Descarregar la resta de paquets. Es pot fer de 2 maneres:
+
## Crear entorn [[Virtualenv]]<pre>$ virtualenv env</pre>
## Automàtica: <pre>$ ./build.sh</pre>
+
##* Activar entorn<pre>$ source env/bin/activate</pre>
## Instal·lació manual (per diversos projectes):  
+
##* Instal·lar Django<pre>(env) $ pip3 install django</pre>
##* Descarregar els paquets indicats aquí: <pre>http://www.allbuttonspressed.com/projects/djangoappengine</pre>
+
## Crear projecte Django<pre>(env) $ django-admin startproject</pre>
##* Instal·lar-los creant ''symlinks'' a l'arrel del nostre directori (tal i com explica la web).
+
##* Crear app dintre del projecte<pre>(env) $ python manage startapp</pre>
# Crear una app amb <pre>$ python manage.py startapp app1</pre>
+
## Crear [[Git: comandes|repositori de GIT]] per gestionar l'equip de treball .
# Afegir la nova app al projecte. Modificar '''settings.py''': <pre>INSTALLED_APPS = ( ... ,'app1', ...)</pre>
+
# '''Model i backend''':
# Afegir el mòdul messages (no ve per defecte) a '''settings.py''':
+
## Clarificar els objectes i taules de la BD, en particular les FK. Les implementarem al [https://github.com/emieza/karaokelist/blob/master/karaoke/models.py '''models.py''' , com podem veure a l'exemple]:
#: <pre>INSTALLED_APPS = ( ... , 'django.contrib.messages', ...)</pre>
+
##* Items: temes a cantar (nom del cantant, URL del vídeo, etc.)
#: <pre>MIDDLEWARE_CLASSES = ( ... , 'django.contrib.messages.middleware.MessageMiddleware' , ... )</pre>
+
##* Vots: (likes) vots emesos per al tema seleccionat. Es limita a un vot per IP emissora i tema (item).
# Crear usuari admin amb <pre>$ python manage.py createsuperuser</pre>
+
## Afegir la app de Django a la variable [https://docs.djangoproject.com/es/2.1/ref/settings/#std:setting-INSTALLED_APPS INSTALLED_APPS] de <code>settings.py</code> (si no ho fem, no s'inclouran els seus models a les migracions).
# Editar model de dades;
+
## Crear migració del model: <pre>(env) $ python manage.py makemigrations</pre>
#* app1/models.py <pre>class ElmeuModel1(models.Model): ...</pre>
+
## Crear DB: <pre>(env) $ python manage.py migrate</pre>
#* app1/admin.py <pre>admin.site.register(ElMeuModel1)</pre>
+
## [https://github.com/emieza/karaokelist/blob/master/karaoke/admin.py Registrar models i personalitzar interfície d'administrador a '''admin.py'''].
# Posar el server en marxa amb:<pre>$ python manage.py runserver</pre>
+
## Crear superuser (admin): <pre>(env) $ python manage.py createsuperuser</pre>
# Visitar la site a
+
## Arrencar app: <pre>(env) $ python manage.py runserver</pre>
#: http://localhost:8080/app1
+
## Testejar el ''backend'' a través de la URL<pre>http://localhost:8000/admin/</pre>
#: http://localhost:8080/app1/admin
+
# Ampliació del ''backend'':
 +
## Personalitzar els mètodes __str__ de cada model, per mostrar-los de forma més amigable.
 +
## Personalitzar la visualització dels models en <code>admin.py</code> : list_display , list_editable, list_filter
 +
## Afegir models relacionats amb ''inlines''
 +
# '''Frontend''':
 +
## Clarificar les rutes necessàries.
 +
## [https://github.com/emieza/karaokelist/blob/master/karaokelist/urls.py Implementar les rutes decidides a '''urls.py'''].
 +
## Crea les views (controladors) pertinents a [https://github.com/emieza/karaokelist/blob/master/karaoke/views.py '''views.py'''].
 +
## Crea les [https://github.com/emieza/karaokelist/tree/master/karaoke/templates/karaoke plantilles pertinents a la '''carpeta ''templates'''''].
 +
## Recorda crear una [https://github.com/emieza/karaokelist/blob/master/karaoke/templates/karaoke/base.html plantilla base] i estendre les altres plantilles ([https://github.com/emieza/karaokelist/blob/master/karaoke/templates/karaoke/create_item.html per exemple aquesta de crear_item]) utilitzant les sentències <nowiki>{% block %} i {% extends %}</nowiki>
  
 
<br>
 
<br>
  
== Projecte step by step ==
+
== Desplegament ==
Install
+
Desplegament:
 +
* En servidor web mitjançant WSGI en Apache i Nginx
 +
* En servidor d'aplicacions: Heroku, Openshift
 +
 
 +
Podeu llegir l'article [[Django en producció]] per veure diverses opcions.
 +
 
 +
<br>
  
Develop:
+
== Possibles ampliacions ==
* Model
+
* Investiga com utilitzar els Users de Django i com ampliar els camps dels què disposa.
* Admin
+
* Amplia els coneixements del ''backend'':
* Forms
+
** Funcionalitat dels usuaris i grups de Django, i permisos.
*  
+
** Filtrar els resultats de l'admin segons l'usuari registrat. Per exemple, en una botiga, els usuaris podrien veure només les seves comandes. El superadmin podria veure-les, en canvi, totes.
 +
* Cerca com recuperar contrasenya en el admin de Django.
 +
* Cerca com enviar emails amb Django.
 +
* Investiga les capacitats multillenguatge de les plantilles de Django.
 +
* Cerca com ampliar les comandes de manage.py, per exemple per importar usuaris d'un arxiu .CSV
 +
* Cerca com canviar les plantilles per defecte de l'admin de Django.
  
Deploy:
+
<br>
* Apache mod_wsgi / nginx?
 
* WSGIScriptAlias
 
** Redirect problem: http://stackoverflow.com/questions/1036186/django-apache-redirect-problem
 
** utiltizar subdominis
 
* WSGIPythonPath (libs virtualenv)
 
* Serving static/media files
 

Revisió del 11:48, 3 març 2020

Django és un framework web basat en Python molt popular. Està orientat a la rapidesa de desenvolupament.

Django or "The web framework for perfectionists with deadlines".

#FpInfor #DawMp07 #DawMp07Uf2 #DawMp07Uf02 #DawMpDual


Introducció

Pàgina oficial:

https://www.djangoproject.com/

Articles relacionats:

Es basa en un paradigma MTV o Model-Template-View. És similar al arxiconegut MVC o Model-View-Controller, però la terminologia pot induir a confusions. En el cas de MVC, la view és la part visual o GUI, mentre que en el MTV, la view és el codi amb la lògica de negoci (equivaldria al controller del MVC).

ULL doncs amb els noms!

Model -   View   - Controller
Model - Template -   View

Django està molt implantat a tot el món web, disposa de gran prestigi i té un creixement ràpid de desenvolupadors i ofertes de feina relacionades.

Plug-ins interessants:

  • django-admin-sortable2: per poder fer llistes ordenables per JS
  • Oauth2
  • RIchTextField
  • Easy Select2 : per incrustar cercadors amb autocmpletar en els camps de FK o ManyToMany



Preparatius i instal·lació

Per desenvolupar amb Django ens serà molt útil (per no dir imprescindible) utilitzar Virtualenv.

Abans de començar, configura el teu entorn com s'explica en aquest article.


Exemple: botiga

Podeu agafar aquest projecte d'exemple per clarificar les funcions bàsiques de Django:

https://github.com/emieza/django-botiga


Backend

El backend de Django o panell d'administració.

Per treballar el backend podem fer ús del TUTORIAL oficial de Django, que està molt ben documentat:

https://www.djangoproject.com/start/

Per poder dominar mínimament les possibilitats del backend segueix al menys aquestes parts del tutorial:

  • Part 1: creació de projecte i primera view
  • Part 2: model, BD, admin backend
  • Part 7: customize admin i inlines
  • Investiga la propietat list_editable del ModelAdmin. Per a què serveix?

A partir d'aquí podrem plantejar un projecte que implementi tot el CRUD en el backend.

  1. Planteja el projecte al professor. Que et doni el vist-i-plau abans de començar. El projecte hauria d'incloure usuaris i permisos diversos.
  2. Implementa el model amb Django. Imprescindible posar adequadament les FK (Foreign Keys).
  3. Mira si pots incloure inlines en alguna de les entitats del model (Ref. tutorial 7)
  4. Planteja't si la interfície que tens ara mateix et serveix com a backend o si necessita alguna restricció.
  5. Planteja la lògica de negoci.
  6. Implementa restriccions del backend perquè s'adapti a la lògica de negoci.


Django Auth i User model

Per utilitzar el model User de Django dins del teu projecte (per exemple, per fer una Foreign Key) només cal importar-lo i utilitzar ForeignKey.

Per Django 1.x:

from django.contrib.auth import User
class MyModel(models.Model):
    ...
    usuari = models.ForeignKey(User)
    ...

Per referenciar el User en Django 2.x:

from django.conf import settings
from django.db import models

class Article(models.Model):
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )

Per ampliar el mòdul de Auth de Django i afegir camps al User, es pot fer de diverses maneres. Aquest article n'explica molt bé 4 d'elles:

https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#onetoone


Bases de dades

Migracions

Hauràs vist que en el moment de fer "migration" Django crea la base de dades. Si canviem el nostre model (a models.py), per exemple afegint camps nous, està clar que el contingut de la BD hauria de canviar també. A aquest procés en diem migració, tot i que el context de migració està més associat a traslladar les dades d'un SGBD a un altre.

En versions anteriors de Django teniem el problema que si canviàvem el model havíem de refer tota la base de dades de nou. La eina "South" va permetre migrar les dades, i finalment s'ha integrat dins de Django.

Un cop fet un canvi en el model, caldrà executar:

$ python manage makemigrations <opcional:nom_app>
$ python manage migrate

SQLite vs MySQL

Per defecte Django utilitza SQLite ja que és més senzilla de configurar i guarda les dades en un arxiu db.sqlite a l'arrel del projecte.

Per diversos motius ens pot interessar canviar el motor de la BD a un de més sofisticat, com pot ser MySQL. Alguns d'aquests motius son:

  • Eficiència
  • Multithreading
  • Ús de tipus de dades més sofisticats com la Geolocalització

Per canviar a MySQL hem de fer les següents passes:

Instal·lar els següents paquets del sistema:

$ sudo apt-get install libmysqlclient-dev python-dev python-gdal python-mysql.connector python-mysqldb python-mysqldb libssl-dev

Instal·lar els següents paquets del Virtualenv:

  • Per python 2.x:
    (env) $ pip install mysql-python
  • Per python 3.x:
    (env) $ pip install mysql-connector-python mysqlclient

Canviar el backend de BD de settings.py:

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.mysql',
       #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
       'PASSWORD': 'lalalaxxx',
       'HOST': 'localhost',
       'PORT': '3306',
       'NAME': 'twitter',
       'USER': 'projectex',
   }
}

Per instal·lar MySQL connector en Mac OS és un pèl mes complicat que en Linux.


Frontend

Pots practicar alguns elements previs al tutorial de frontend en aquest mini tutorial.

Tutorials:

Documentació rellevant:

Plug-ins:

  • django-money
  • django-richtextfield
  • django-oauth-toolkit

Autenticació en el frontend

Per fer la autenticació en el front-end podriem fer-nos la nostra pròpia view seguint les indicacions de la doc oficial:

https://docs.djangoproject.com/en/1.11/topics/auth/default/

...però és més pràctic utiltizar un seguit de views predefinides que son típiques i ens serviran prou bé:

https://docs.djangoproject.com/en/1.11/topics/auth/default/#using-the-views

Un cop fet el sistema de login/logout, serà fàcil consultar en tot moment quin user tenim logat mitjançant la request:

def view_tal(request):
    usuari = request.user

Per augmentar les possibilitats d'autorització, és interessant tenir en compte els següents plugins i hacks:

Ampliar el model del User

Sovint ens fa falta ampliar els atributs o comportament del User de Django. Hi ha diverses de fer-ho. Aquest article ens dona diverses opcions i ens explica quan utiltizar-les:

https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html

Resumint:

  • Utilitzant un Proxy Model
  • Creant un Profile relacionat amb el User amb un One-to-One relationship
  • Derivant un CustomUser de AbstractBaseUser
  • Derivant un CustomUser de AbstractUser


OAuth

OAuth es mereix comentaris a part, ja que és molt útil per les xarxes socials i cada dia esdevé més important:


Projecte amb Django

Seguidament proposem una guia per realitzar un projecte amb Django, un cop hagis finalitzat els tutorials anteriorment esmentats.

Comentarem les diferents passes amb aquest projecte d'exemple, es tracta d'una llista de karaoke per demanar torn, penjar el vídeo i votar els temes:

https://github.com/emieza/karaokelist

Guia:

  1. Preparació:
    1. Clarificar la funcionalitat del projecte.
    2. Crear entorn Virtualenv
      $ virtualenv env
      • Activar entorn
        $ source env/bin/activate
      • Instal·lar Django
        (env) $ pip3 install django
    3. Crear projecte Django
      (env) $ django-admin startproject
      • Crear app dintre del projecte
        (env) $ python manage startapp
    4. Crear repositori de GIT per gestionar l'equip de treball .
  2. Model i backend:
    1. Clarificar els objectes i taules de la BD, en particular les FK. Les implementarem al models.py , com podem veure a l'exemple:
      • Items: temes a cantar (nom del cantant, URL del vídeo, etc.)
      • Vots: (likes) vots emesos per al tema seleccionat. Es limita a un vot per IP emissora i tema (item).
    2. Afegir la app de Django a la variable INSTALLED_APPS de settings.py (si no ho fem, no s'inclouran els seus models a les migracions).
    3. Crear migració del model:
      (env) $ python manage.py makemigrations
    4. Crear DB:
      (env) $ python manage.py migrate
    5. Registrar models i personalitzar interfície d'administrador a admin.py.
    6. Crear superuser (admin):
      (env) $ python manage.py createsuperuser
    7. Arrencar app:
      (env) $ python manage.py runserver
    8. Testejar el backend a través de la URL
      http://localhost:8000/admin/
  3. Ampliació del backend:
    1. Personalitzar els mètodes __str__ de cada model, per mostrar-los de forma més amigable.
    2. Personalitzar la visualització dels models en admin.py : list_display , list_editable, list_filter
    3. Afegir models relacionats amb inlines
  4. Frontend:
    1. Clarificar les rutes necessàries.
    2. Implementar les rutes decidides a urls.py.
    3. Crea les views (controladors) pertinents a views.py.
    4. Crea les plantilles pertinents a la carpeta templates.
    5. Recorda crear una plantilla base i estendre les altres plantilles (per exemple aquesta de crear_item) utilitzant les sentències {% block %} i {% extends %}


Desplegament

Desplegament:

  • En servidor web mitjançant WSGI en Apache i Nginx
  • En servidor d'aplicacions: Heroku, Openshift

Podeu llegir l'article Django en producció per veure diverses opcions.


Possibles ampliacions

  • Investiga com utilitzar els Users de Django i com ampliar els camps dels què disposa.
  • Amplia els coneixements del backend:
    • Funcionalitat dels usuaris i grups de Django, i permisos.
    • Filtrar els resultats de l'admin segons l'usuari registrat. Per exemple, en una botiga, els usuaris podrien veure només les seves comandes. El superadmin podria veure-les, en canvi, totes.
  • Cerca com recuperar contrasenya en el admin de Django.
  • Cerca com enviar emails amb Django.
  • Investiga les capacitats multillenguatge de les plantilles de Django.
  • Cerca com ampliar les comandes de manage.py, per exemple per importar usuaris d'un arxiu .CSV
  • Cerca com canviar les plantilles per defecte de l'admin de Django.