Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Web app vers standalone app

+5 votes

J'ai codé il y a quelques temps une appli en PyQt4 avec le framework Camelot qui génère des vues automatiquement basées sur des modèles (sqlalchemy) depuis une base de données, très pratique surtout pour éditer les relations et gérer facilement toute la partie CRUD. Cependant, il y a des limitations dans l'extensibilité du bousin et j'avais idée de recoder tout ça avec un autre framework mais j'ai certaines contraintes :

  • l'app devra être standalone, les utilisateurs n'ayant pas forcément accès au web,
  • pour l'instant ça tourne sur windows (packagé via PyInstaller), Linux et certainement Mac vu que c'est du PyQt. Il faudrait que ça puisse tourner aussi sur Android et iOS,
  • il y a beaucoup de tables (une trentaine) avec toutes un mode création/édition/suppression des données, et des contraintes d'intégrités dans tous les sens. Si le nouveau framework pouvait gérer ça automatiquement (formulaires, contrôles, ...), c'est autant de temps de gagné, mais je rêve peut-être,
  • une évolution de l'app sera de pouvoir dialoguer avec d'autres appareils en bluetooth en envoyant des fichiers, pour l'instant tout se fait en écrivant les fichiers sur une carte SD.

Est-ce que je fais fausse route ou existe-t'il un moyen propre de faire ça? J'avais pensé faire l'app avec Django et l'interface de rendu avec Qt et une webview, mais est-ce packageable et surtout est-ce que ça marchera sur les tablettes/smartphones?

demandé 3-Jan-2015 par joshuafr
edité 3-Jan-2015 par Sam

Sans connexion internet c'est mort, faut peut etre qu'on nous en dise plus sur qui sont les potentiels utilisateurs. Si on parle de gens partageant un reseau local, ça reste possible.

Hmm, effectivement, suis allé trop vite en cliquant sur le gros bouton "Répondre" tout en bas au lieu de le faire sur les commentaires.
Sinon si je reste sur un "client lourd", est-ce que vous avez des retours d'expérience sur Kivy pour le côté multi-plateforme, voir même avec Qt Quick?

Non pas de réseau local, l'appli est utilisée par des artisans, elle permet de gérer leurs clients ainsi qu'un calendrier d'actions à réaliser chez ces clients. L'appli doit en plus pouvoir communiquer avec des appareils de contrôle, pour l'instant en partageant des infos sur carte SD, dans le futur via Bluetooth. Ils sont en mode nomades, avec pas forcément de connexion 3G, et souvent seuls. Je recherche une solution pour qu'ils puissent faire la même chose sans être obligé de se trimbaler un ordi portable, tout en leur laissant cette possibilité.

c'est compliqué - il y a plusieurs aspects - il faut savoir quel est le budget d'un "tel" artisan et comment il s'en sert (sur l'avant bras comme une tablette, dans la main ; sur un bureau etc...) - parce que pour le coup (et coût du coup ;)), il faut savoir comment ils utilisent l'application pour ensuite les orienter sur le matos qui sera la "toise" (la reference) - par exemple une tablette - et s'en "contenter" - parce que si c'est pour faire du multi-format ca peut te prendre plus de temps et être plus cher. Bon apres si un artisan un peu plus argenté veut absolument un format qui est différent de celui choisi comme référence, faut lui faire payer le dev pour l'adaptation, normal hein.

Côté DB local il y a CouchDB (DB NOSQL avec API REST) et ses outils couchbase pour android et ios, avec tous les bénéfices: replication de la DB en local, API Rest, module GEO, etc. Du coup le CRUD c'est du 100% browser. Après côté packaging pour Win/Linux/Mac je ne peux pas dire, j'ai jamais fait, peut-être comme application chrome ou firefox ?

1 Réponse

+6 votes

Pour disposer d'une interface simlaire sur toutes ces plateformes, l'approche de l'app web affichée via une WebView me semble la plus pertinente. Cela permet en effet de n'avoir qu'une version à maintenir qui réalise la logique d'affichage et d'interaction via des pages HTML et du code javascript. Un petit coup d'angular pour pouvoir faire ça proprement, et un bon vieux bootstrap des familles pour être responsive et gérer d'un coup toutes les tailles d'écran, et voilà ton interface. Rien de très neuf, tu l'avais suggéré.

En ce qui concerne le packaging, c'est un peu plus tendu déjà. Je ne connais pas de conteneur unique qui fasse tout ça pour toi, mais tu peux regarder du côté de PhoneGap et Cordova pour le mobile, ce qui te permet de supporter Android, iOS, FirefoxOS et une floppée d'autres sans trop se prendre la tête. Il existe aussi des équivalents pour desktop, comme node-webkit ou atom-shell. J'ai jamais vraiment joué avec ceux-là, mais ça marche (même si il paraît que les packages sont un peu lourds du fait de shipper avec un chromium). Encore une fois, on est plutôt cross-platform, puisque c'est sensé tourner sous Windows, OSX et Linux.

La partie chiante, c'est les API non web-natives, comme les accès aux fichiers ou la DB. Il y a un peu de travail là dessus pour fournir une API indépendante de la plateforme, mais les outils cités permettent tous deux d'accéder à un SQLite et au système de fichiers. Il s'agit juste de faire des wrappers pour appeler les bonnes méthodes selon que l'app tourne dans un conteneur cordova ou desktop.

Le lecteur attentif remarquera qu'on ne parle point de Python (c'est con sur un QA axé python quand même), puisqu'on est sur une stack quasiment full-web du point de vue du développeur, avec toute la logique en JavaScript (à moins d'un peu de code natif pour écrire des plugins Cordova par exemple, mais t'auras certainement pas besoin d'en arriver là) et l'affichage en HTML+CSS. Au vu des technos dispos aujourd'hui, j'ai pas mieux à proposer.

répondu 6-Jan-2015 par swordofp

C'est bien ce qui me faisait peur, mais effectivement Python n'a pas grand intérêt dans ce cas donc, du moins ça sera plus coton. Dommage...

Il y a aussi Thrust ( Chromium-based cross-platform + bindings python) :
https://github.com/breach/thrust

...