Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
Següent revisió | Revisió prèvia Següent revisió Ambdós costats nova versio | ||
playground:prova [2022/12/13 18:42] enric_mieza_sanchez creat |
playground:prova [2022/12/14 19:02] enric_mieza_sanchez |
||
---|---|---|---|
Línia 1: | Línia 1: | ||
- | ====== | + | ====== |
- | Python | + | Apache Cordova (inicialment PhoneGap) son unes llibreries per al desenvolupament d'apps mòbils utilitzant [[JavaScript]], |
- | Aquest article resumeix | + | El seu funcionament es basa en tenir una aplicació nadiua amb una simple WebView que ocupa tota la pantalla sencera. Implementant codi JavaScript dins la WebView ens permetrà controlar la interfície gràfica. Per accedir a les funcionalitats pròpies del dispositiu mòbil disposarem de certes llibreries (càmera, filesystem, acceleròmetre, |
- | Python disposa de molts frameworks i microframeworks per web. Alguns dels més coneguts: | + | {{ cordova.png?400 }} |
- | - **Flask** : essencial, però amb tot el necessari i ben mantingut | + | |
- | - **Django** : //the framework for perfectionists with deadlines// , permet el desenvolupament molt ràpid, amb eines com el ORM i un admin panel molt potent. | + | |
- | - **CherryPy** : microframework | + | |
- | - **Bottle** : microframework | + | |
- | Referències: | + | {{tag> #Dam #DamMp08 #DamMpDual #DawMpDual Android iOS Cordova HTML JavaScript }} |
- | * Per desenvolupar en Python necessitarem [[Python venv]] | + | |
- | * L' | + | |
- | {{tag> #Daw #DawMpDual #DawMp07Uf1 # | ||
- | \\ | + | ===== Introducció i requisits ===== |
+ | Per poder seguir aquest article se suposa que has de tenir coneixements de [[JavaScript]], | ||
- | ===== Videotutorials ===== | + | Si tens coneixements molt bàsics també t' |
- | Aquest article també el tens en [[https:// | + | |
- | {{youtube> | + | Abans de començar a treballar amb Cordova caldrà que tinguem instal·lats els entorns de desenvolupament: |
- | {{youtube> | + | Per instal·lar Cordova necessites un bon plegat d' |
+ | - **Android Studio** que ens facilitarà les eines de l' | ||
+ | - **Java 8 JDK** no ens servirà cap altra versió. | ||
+ | - **NodeJS** que ens facilitarà el gestor de paquets NPM amb el què podrem instal·lar Cordova | ||
+ | - **Gradle** en la darrera versió. | ||
- | \\ | ||
- | ===== Instal·lació ===== | + | En cas de que puguis treballar en un Mac, hauràs d'instal·lar |
- | Necessitem Python 3, que ja sol venir instal·lat. Si no fos així, pots instal·lar-ho amb: | + | XCode -> Preferences -> Locations -> Command Line Tools |
- | $ sudo apt install | + | MacOS: [[https:// |
- | Necessitem crear un [[python_venv|entorn virtual de Python]]. La manera més senzilla és: | + | Tens algun material per [[https:// |
- | $ python -m venv env | + | \\ |
- | I podem activar el nostre entorn amb: | + | ===== Instal·lació en Ubuntu ===== |
- | $ source env/bin/activate | + | |
+ | - Prova de crear un projecte dins d' | ||
+ | - Cal **instal·lar Java 8 JDK, només funcionarà amb aquesta versió** de Java. | ||
+ | - Vigila que no tens cap altra versió instal·lada. Si la tens, desinstal·la-la. Comprova si la tens amb (ha de sortir-te openjdk version 1.8):< | ||
+ | - Instal·la Java 8 JDK:< | ||
+ | - Ajusta la variable d' | ||
+ | - Millor que afegeixis aquest export a l' | ||
+ | - Necessitarem **instal·lar NodeJS**, no pel servidor web, sinó perquè necessitem el gestor de paquets '' | ||
+ | - Canviem repos per [[https:// | ||
+ | - Instal·lar nodejs:< | ||
+ | - Instal·lar **Cordova**: | ||
+ | - També ens caldrà **Gradle**: | ||
+ | - Ajustem [[https:// | ||
+ | $ sudo apt install gradle</ | ||
+ | - Comprova que és una versió recent (7.x durant l'any 2022) amb:< | ||
- | Per saber més sobre els entorns virtuals | + | \\ |
+ | |||
+ | ===== Quickstart ====== | ||
+ | La seqüência típica per iniciar un projecte és com s' | ||
+ | - Crear projecte: < | ||
+ | - Entrar al directori del projecte: < | ||
+ | - Afegir plataformes (android/ | ||
+ | - Compilar per Android: < | ||
+ | - Arrencar el projecte a l' | ||
+ | |||
+ | De vegades no arrenca bé l' | ||
+ | |||
+ | També pots provar d' | ||
+ | $ emulator -avd < | ||
+ | Per exemple: | ||
+ | $ emulator -avd Pixel_2_API_28 | ||
+ | |||
+ | ==== Devices ==== | ||
+ | Per córrer l' | ||
+ | $ cordova run android --device | ||
+ | |||
+ | Abans, però, caldrà que **configureu el vostre dispositiu en mode developer** buscant les dades del dispositiu i clicant 7 cops seguits al nº de compilació. Després **activeu la Depuració USB**. | ||
\\ | \\ | ||
- | ===== Creant el primer projecte | + | ===== Troubleshooting |
- | Iniciarem el nostre projecte web creant una simple carpeta: | + | |
- | $ mkdir pyweb1 | + | ==== Emulador KVM (Android Studio) ==== |
- | $ cd pyweb1 | + | Si no et deixa crear una màquina virtual al Android Studio pq li falten permisos d' |
+ | $ sudo chmod 777 /dev/kvm | ||
- | Dins el nostre projecte crearem un virtualenv on posarem | + | ==== Variables d' |
+ | Si al llançar | ||
+ | export ANDROID_SDK_ROOT=~/ | ||
- | $ python | + | El millor és que incloguis aquestes darreres instruccions a l' |
- | $ source env/bin/activate | + | $ source ~/.profile |
- | | + | |
- | Ara ja podem mirar [[https:// | ||
- | (env) $ gedit web.py & | + | ==== Variables d' |
+ | Alguna comanda no et funciona, és perquè necessita estar al PATH per poder ser trobada. | ||
- | I ara podrem arrencar la aplicació //Hello World// | + | Cerca " |
+ | \Users\usuari\AppData\Local\Android\Sdk | ||
- | (env) $ flask --app web run | + | Però cerca abans per assegurar-te d'on son exactament les eines. |
- | Podeu visitar la web //Hello World// apuntant el vostre navegador a '' | + | ==== Altres ==== |
+ | Si es queixa de: | ||
+ | No usable Android build tools found. Highest 30.x installed version is 30.0.2; minimum version required is 30.0.3 | ||
+ | [[https://stackoverflow.com/questions/70002327/ionic-cordova-android-no-usable-android-build-tools-found-highest-30-x-install|aquest post explica com corregir-ho, | ||
+ | Android Studio -> Tools -> SDK Manager -> Android SDK -> SDK Tools | ||
+ | i **activant '' | ||
- | \\ | + | ==== Java version ==== |
+ | Si tenim el Java 11 no serveix, ha de ser Java 8. Això ho pots saber amb | ||
+ | $ java -version | ||
- | ===== Avançant | + | Si tenim la 11, podem instal·lar en paral·lel la 8 amb: |
+ | $ sudo apt install openjdk-8-jdk | ||
- | ==== Routing ==== | + | I posar la 8 com a versió per defecte amb: |
- | Si arribeu a la secció [[https:// | + | $ sudo update-alternatives --config java |
+ | $ sudo update-alternatives --config javac | ||
+ | | ||
+ | Si es queixa de que no troba JAVA_HOME, l' | ||
+ | export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ | ||
- | Com podeu veure a l' | + | Si aquest |
+ | $ ll `which javac` | ||
+ | $ ll / | ||
- | <file python web.py> | + | ==== Gradle ==== |
- | #... codi previ... | + | Si es queixa de que li falta //gradle//, l' |
- | @app.route(' | + | Instal·lar |
- | def hello(): | + | $ sudo add-apt-repository ppa:cwchien/ |
- | | + | $ sudo apt install gradle |
- | #...mes codi... | + | Instal·lar //gradle// per a Windows: |
- | </file> | + | - Descarrega [[https:// |
+ | - Descomprimeix Gradle a una carpeta tipus C:\Gradle | ||
+ | - Ajusta la variable d' | ||
- | ==== Mètodes [GET, | + | Instal·lar //gradle// per a MacOS: |
- | A més, cal tenir en compte que cada URL a la que accedim, ho podem fer amb diferents mètodes. A la pràctica ho tractem com si fossin URLs independents. L' | + | |
- | | + | |
- | * POST: un cop omplert | + | I ja pots tornar a provar |
- | Per accedir a les dades que se'ns envia via POST, hem d'accedir mitjançant l'[[https://flask.palletsprojects.com/quickstart/#the-request-object|objecte request de la pròpia llibreria de Flask]], tal i com es pot veure en el següent exemple, utilitzant '' | + | ==== Llicències ==== |
+ | Si es queixa de que li falten llicències per acceptar, entra a '' | ||
+ | $ ~/Android/Sdk/tools/bin/sdkmanager | ||
- | <file python web.py> | + | ==== Apple, ios, macos ==== |
- | # si no especifiquem res al decorator, és el mètode GET | + | Treballant amb Apple podem trobar alguns problemes una mica diferents. |
- | @app.route('/ | + | |
- | def formulari_get(): | + | |
- | # mostrem el formulari | + | |
- | return """ | + | |
- | <form method=' | + | |
- | Introdueix el teu nom: | + | |
- | <input name=' | + | |
- | < | + | |
- | <input type=' | + | |
- | </ | + | |
- | """ | + | |
- | # important importar la request per accedir a les dades adjuntes | + | Les variables d' |
- | from flask import request | + | |
+ | export ANDROID_SDK_ROOT=~/ | ||
- | @app.route('/formulari', methods=['POST']) | + | També hi ha un [[https:// |
- | def formulari_post(): | + | |
- | # processem les dades del formulari | + | [[https:// |
- | | + | $ cordova build ios --buildFlag=' |
- | | + | $ cordova run ios --buildFlag=' |
- | </file> | + | |
+ | Sembla que a partir de Xcode 11 ja no apareix aquest problema. | ||
+ | |||
+ | Si falla amb el missatge < | ||
+ | |||
+ | [[https:// | ||
+ | $ sudo xcode-select -s / | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ====== Construint una App amb JavaScript ====== | ||
+ | Ara que tenim l' | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ===== Primera App ===== | ||
- | ==== Exercici ==== | ||
<WRAP todo> | <WRAP todo> | ||
- | * Crea un formulari que demani usuari i contrasenya. El formulari s' | + | Mira l'article [[Introducció Javascript]] |
- | * Crea una pàgina (per POST) que respongui al formulari d'usuari | + | |
- | * Assegura' | + | |
</ | </ | ||
\\ | \\ | ||
- | ===== Variables globals (shhht! q no ho senti ningú!) | + | ===== Afegint jQuery |
- | En un entorn web no és recomanable utilitzar variables globals. O més aviat, no podem utilitzar-les com solem fer-ho en aplicacions d' | + | jQuery ens pot ajudar molt a agilitzar el desenvolupament. |
- | De fet, sí que es poden fer servir, però no es pot confiar en què en la següent execució la variable global es mantingui. El servidor web, depenent | + | - **Instal·lació "a mà"**. Cal incloure els arxius |
+ | - Descarregar els arxius | ||
+ | - Utilitzar els repositoris online (CDN). Pots veure com fer-ho en aquest tutorial: | ||
+ | - https:// | ||
+ | - Instal·lació amb el **// | ||
+ | - Està força obsolet, però té alguns // | ||
+ | - https:// | ||
+ | - Instal·la-ho | ||
+ | - Configura el template. | ||
+ | * En Linux executa:< | ||
+ | * En Windows fes des del CMD:< | ||
+ | - Mira com queda la plantilla fent de nou:< | ||
+ | - Prova diversos // | ||
+ | - Ens quedarem amb el '' | ||
+ | * La [[https:// | ||
- | A més, també hi ha una qüestió de concurrència: | + | <WRAP important> |
- | + | Hi ha un petit error a les plantilles. Quan arrenquis l' | |
- | Conclusió: si volem **persistència** en un entorn web, estem obligats | + | </ |
\\ | \\ | ||
- | ===== Utilitzant plantilles (templates) | + | ===== Cordova no vol inlines |
+ | Típicament podríem fer una aplicació en JavaScript en una pàgina HTML i podríem posar botons que cridin a funcions del nostre codi amb un //onclick// (el què coneixem per crida // | ||
- | Necessitem un mecanisme més sofisticat per crear contingut HTML i que no sigui fent un return d'un string. **Una de les bones pràctiques | + | Forma de solventar-ho: |
+ | <button id=" | ||
+ | |||
+ | I després, en el nostre ''index.js'', | ||
+ | $('# | ||
- | Per això, separarem les pàgines HTML en les plantilles o // | + | En aquest |
- | * L'apartat [[https:// | + | |
- | * La [[https:// | + | |
+ | I un darrer apunt, la crida a aquesta funció no pot anar al principi del document, pq en el //head// encara no existeix el nostre //button//. Tenim 2 solucions: | ||
+ | - Posar el tag ''< | ||
+ | - Posar el codi d' | ||
+ | $(document).ready( function () { | ||
+ | // initialize | ||
+ | $('# | ||
+ | $('# | ||
+ | }); | ||
+ | </ | ||
- | {{youtube> | + | ===== Exercici Tasklist v1 ===== |
- | ==== Exemple | + | <WRAP todo> |
- | Com a exemple d'ús de les plantilles agafarem | + | Tasklist: |
+ | - Inicia | ||
+ | - Implementa una plantilla amb el [[https:// | ||
+ | * Es recomana utilitzar | ||
+ | | ||
+ | * Afegir elements (el text l' | ||
+ | * Tingues en compte la [[https:// | ||
+ | </ | ||
- | Farem 2 rutes: | + | \\ |
- | * /compra GET : ens mostrarà el formulari. | + | |
- | * /compra POST : processarem les dades enviades al formulari. | + | |
- | Crea una aplicació mínima com la de l' | ||
- | <sxh python> | ||
- | @app.route('/ | ||
- | def compra_get(): | ||
- | return render_template(' | ||
- | @app.route('/ | + | ===== Local Storage ===== |
- | def compra_post(): | + | '' |
- | return render_template('compra_post.html') | + | |
- | </sxh> | + | |
- | Com podeu veure, ara ja no creem el HTML dins el codi de l' | + | Les aplicacions web no estaven pensades per emmagatzemar dades, només per ser visualitzades, |
- | <file html compra_form.html> | + | És molt senzill d' |
- | <form method=" | + | * localStorage.getItem |
- | <select name=" | + | * localStorage.setItem |
- | < | + | |
- | < | + | |
- | < | + | |
- | </select> | + | |
- | < | + | |
- | < | + | |
- | <input type=" | + | |
- | </ | + | |
- | </ | + | |
- | <file html compra_post.html> | + | Mira' |
- | < | + | |
- | </file> | + | |
- | ==== Renderitzar dades a una plantilla amb {{ ... }} ==== | + | ==== Objectes |
- | Per millorar l'exemple primer | + | <WRAP tip> |
+ | '' | ||
+ | - [[https:// | ||
+ | - [[https:// | ||
+ | </ | ||
- | <sxh python> | + | \\ |
- | from flask import request | + | |
- | @app.route('/ | ||
- | def compra_post(): | ||
- | prod = request.form[' | ||
- | quant = request.form[' | ||
- | return render_template(' | ||
- | producte=prod, | ||
- | </ | ||
- | <file html compra_post.html> | + | ===== Exercici Tasklist v2 ===== |
- | < | + | Aplicarem tot l' |
- | < | + | |
- | </ | + | |
- | Ara pots provar | + | <WRAP todo> |
+ | Continua de l'anterior exercici Tasklist v1: | ||
+ | - Implementa un **botó Elimina** dins de cada element de la llista | ||
+ | * Per saber més [[https:// | ||
+ | - Implementa un **botó Edita** dins de cada element de la llista | ||
+ | * Mireu l'exemple inicial on cada element de la llista ens porta a una pàgina. En tenim prou amb tenir dues pàgines: la //home// (on hi ha la '' | ||
+ | | ||
+ | </ | ||
+ | \\ | ||
- | ==== Utilitzar codi dins de les plantilles amb {% ... %} ==== | ||
- | Pot semblar una contradicció que hi hagi codi dins d'una plantilla, però en realitat és necessari per renderitzar amb facilitat. No és codi de processament, | + | ===== Utilitzant APIs amb AJAX ===== |
+ | Treballar aplicacions | ||
- | Per seguir, convé fer-li un cop d' | + | Una API web, també conegut com a //web service// és una interfície via web per demanar dades, així que es podria considerar una crida remota, d'aquí que en diguem API, com les llibreries de programació. |
- | Pel nostre exemple de la botiga, farem una simulació | + | Explorarem |
- | <sxh python> | + | Exploreu els següents recursos: |
- | productes = ['Cogombres',' | + | - API (respon en XML): https:// |
+ | - Crides en JSON: https:// | ||
+ | * Per obtenir les dades en JSON cal que adjunteu el //header// de curl " | ||
+ | - Per fer //pretty print// d'un JSON va molt bé " | ||
- | @app.route('/compra') | + | Exemple: |
- | def compra_get(): | + | $ curl -H 'Accept: |
- | return render_template(' | + | |
- | </sxh> | + | |
- | I renderitzarem la llista de productes en les diferents | + | ==== AJAX amb jQuery ==== |
+ | Aquestes mateixes | ||
- | <file html compra_form.html> | + | <code javascript> |
- | < | + | $.ajax({ |
- | < | + | |
- | {% for prod in prods %} | + | url: " |
- | < | + | dataType: |
- | | + | }).done(function (msg) { |
- | | + | |
- | | + | |
- | < | + | // aquí caldría fer mes coses, of course... |
- | < | + | |
- | </ | + | }; |
- | </file> | + | }).fail(function () { |
+ | alert("ERROR"); | ||
+ | }); | ||
+ | </code> | ||
- | Comprova que, en efecte funciona | + | Cal tenir en compte que les URLs a les que cridis amb AJAX han de tenir habilitada |
+ | Pots veure una demo i explicació de com funciona a http:// | ||
- | ==== Plantilles like a PRO ==== | + | [[https://ahorasomos.izertis.com/solidgear/lidiando-con-el-cors/|Aquí s' |
- | Les plantilles Jinja2 ofereixen moltes possibilitats tal i com s' | + | |
- | * [[https:// | + | <WRAP important> |
- | * [[https:// | + | Dins la nostra aplicació cal autoritzar l'accés |
- | \\ | + | <WRAP prewrap> |
+ | Content Security Policy: Els paràmetres de la pàgina han blocat la càrrega d'un recurs a https:// | ||
+ | </ | ||
- | ===== Per a saber-ne més ===== | + | Per tal d' |
- | Hem fet un repàs | + | |
- | * Persistència en base de dades | + | <WRAP prewrap> |
- | * Sessions | + | <code html> |
+ | <meta http-equiv=" | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
- | També hi ha aquest cursos que poden ser interessants: | + | ==== Public APIs a go-go ==== |
- | | + | <WRAP tip> |
- | * [[https://platzi.com/cursos/flask/|Aquest curs de Flask de Plazi.com]] pinta molt bé, amb videotutorials | + | [[https://github.com/public-apis/public-apis|En aquest repositori hi ha un llistat |
+ | |||
+ | Fes-li | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Queries | ||
+ | Documentació de musicbrainz: | ||
+ | * [[https://musicbrainz.org/doc/Development/XML_Web_Service/ | ||
+ | * [[https:// | ||
+ | |||
+ | === Exemples === | ||
+ | Obtenir els resultats (en XML) dels grups amb " | ||
+ | $ curl https:// | ||
+ | |||
+ | Per obtenir els resultats | ||
+ | $ curl https:// | ||
+ | |||
+ | Si volem mostrar els resultats de forma mes clara en la //shell//, podem utilitzar una eina per indentar correctament: | ||
+ | $ curl ...url_query... | python -m json.tool | ||
\\ | \\ | ||
+ | ===== Materialize CSS ===== | ||
+ | <WRAP tip> | ||
+ | MaterializeCSS és un // | ||
+ | </ | ||
- | ===== Exercici : login ===== | ||
<WRAP todo> | <WRAP todo> | ||
- | Pàgina de login de l'app: | + | Rock band searcher: |
- | + | | |
- | | + | |
- | | + | |
- | | + | - Primer prova-ho amb '' |
- | | + | - Després implementa-ho en el HTML del projecte Cordova |
+ | | ||
</ | </ | ||
\\ | \\ | ||
- | ===== Testing | + | ===== Plugins |
- | + | ... | |
- | Aquest article continua a [[Python Web Test]]. | + | |
\\ | \\ | ||
+ | |||
+ | ====== Depuració (debug) ====== | ||
+ | Per depurar el més fàcil és utilitzar al nostre codi missatges amb | ||
+ | console.log(" | ||
+ | Per poder mostrar aquests missatges dependrà de la plataforma que utilitzem: | ||
+ | |||
+ | ===== Browser ===== | ||
+ | Premem F12 per veure el Inspector de Chrome, i anem a la pestanya " | ||
+ | |||
+ | ===== Android ===== | ||
+ | Un cop llançada la app, executem: | ||
+ | $ ./ | ||
+ | |||
+ | Com que surten chorrocientos missatges, és més clar si filtrem només els què ens interessa (tot i que en determinats moments ens pot interessar treure el filtre per veure-ho tot). En aquest cas filtrem amb '' | ||
+ | $ ./ | ||
+ | |||
+ | Potser la manera més còmoda seria posar-ho tot a la mateixa comanda: | ||
+ | $ cordova run android ; ./ | ||