Po Brythonu pokukuji mnoho let, ale zatím jsem stále zdrženlivý.
Jeden z důvodů je, že v mém hlavním prohlížeči se stránka brython.info, kromě zeleného pozadí a baneru, vůbec nezobrazí.
Aktuálně:
Ubuntu 18.04.3 LTS
FF 70.0 (64 bitů)
AdBlock 0
NoScript 0 blokovaných ze 2
JS Enabled - ve stavu JS povolen
HTML 5 Autoplay - deaktivován
V jiném prohlížeči mi funguje.
== Máte zkušenosti s ostrým nasazením? ==
Dá se k Brythonu naimportovat např. knihovna PyMongo
a rovnou z browseru přistupovat ke vzdálené Mongo databázi?
== Jak je to se zpožděním při reloadu stránky? ==
brython.js se stáhne 1x při prvním spuštění aplikace a pak už jen kontroluje zda se na serveru nezměnil?
brython.js coby JavaScript se celý interpretuje po každém reloadu stránky?
> Dá se k Brythonu naimportovat např. knihovna PyMongo
Ne. Browser není počítač, nemá to třeba TCP/IP spojení a když už můžeš používat třeba websocket, tak to má vlastní limitace, z principu stejné jako v JavaScriptu (same origin policy a tak dál). Můžeš si napsat nějaký transport nad třeba REST API.
> brython.js se stáhne 1x při prvním spuštění aplikace a pak už jen kontroluje zda se na serveru nezměnil?
To záleží jen na tom jak máš nastavené hlavičky na serveru. Pokud si nastavíš správě cacheování, tak se to bude cacheovat.
> brython.js coby JavaScript se celý interpretuje po každém reloadu stránky?
To bohužel jo. Má to tendenci na vteřinu / dvě zasknout celý prohlížeč.
Jen poznámka k tomu dotažení brython.js - jak píše Bystroushaak, pokud je správně nastavený HTTP server, tak bude posílat korektní informace o tom, jestli se resource změnil nebo ne (pro hlavičku dotazu If-Modified-Since). Takže se brython.js dotáhne jedenkrát a potom zůstane v cachi prohlížeče. Až se vydá nová verze Brythonu a vy ji použijete, natáhne se do prohlížeče znovu.
Jde to vyzkoušet i přímo na stránce www.brython.info. Poprvé ji normálně načtěte, potom si zobrazte tab Network (Ctrl+Shift+E) a můžete sledovat, co se bude dít po reloadu (F5):
200 GET www.brython.info / document html 4.66 KB 12.92 KB 53 ms 200 GET fonts.googleapis.com css?family=Montserrat stylesheet css 996 B 1.80 KB 71 ms 304 GET www.brython.info brython.js script js cached 684.83 KB 85 ms 304 GET www.brython.info doc_brython.css stylesheet css cached 3.77 KB 227 ms 304 GET www.brython.info brython_tp.png img png cached 1.57 KB 135 ms 200 GET www.brython.info favicon.png img png cached 299 B ...
Ten skript je největší resource, ovšem je cachovaný a dotáhne se tedy z lokální cache ihned poté, co server odpověděl kódem 304.
Ale stejně - pokud máte OPA, je (IMHO) Brython fajn řešení, pokud však aplikaci typu Root, kde se jednotlivé stránky pořád dotahují celé, tak se ztratí moc času inicializací celého překladače.
Děkuji vám oběma za upřesnění.
Bylo by na zajímavé zamyšlení obejití opakované interpretace brython.js
Je to obecný problém opětovného interpretování velkého bloku JS.
Určitě to někdo někdo řešil a snad i vyřešil.
Od boku mě napadají směry:
- obalení stránky "blokem/rámem/framem", který se nebude znovu načítat a obsah se bude načítat a vykonávat uvnitř.
- převod brython.js do nějakého JS ASM nebo ještě hlouběji
- schopnost prohlížeče, zachovat již jednou zpracovaný .js např. v rámci domény (samozřejmě promyšlený s ohledem na bezpečnost)
Ahoj
Díky, že jsi mě nasměroval (resolved nefunkční obsah na brython.info).
První 4 řádky výpisu:
uncaught exception: Object
[Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIDOMWindowUtils.addSheet]" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS frame :: resource://gre/modules/ExtensionCommon.jsm :: runSafeSyncWithoutClone :: line 75" data: no] ExtensionCommon.jsm:75:12
runSafeSyncWithoutClone resource://gre/modules/ExtensionCommon.jsm:75
cssPromise resource://gre/modules/ExtensionContent.jsm:520
InterpretGeneratorResume self-hosted:1300
AsyncFunctionNext self-hosted:839
[Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIDOMWindowUtils.addSheet]" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS frame :: resource://gre/modules/ExtensionCommon.jsm :: runSafeSyncWithoutClone :: line 75" data: no] ExtensionCommon.jsm:75:12
runSafeSyncWithoutClone resource://gre/modules/ExtensionCommon.jsm:75
cssPromise resource://gre/modules/ExtensionContent.jsm:520
InterpretGeneratorResume self-hosted:1300
AsyncFunctionNext self-hosted:839
$download_module https://brython.info/src/brython.js:8840
find_spec https://brython.info/src/brython.js:9061
method https://brython.info/src/brython.js:5321
find_spec https://brython.info/src/brython.js:9048
f https://brython.info/src/brython.js:6372
method https://brython.info/src/brython.js:6376
import_hooks https://brython.info/src/brython.js:13370
$__import__ https://brython.info/src/brython.js:9104
$import https://brython.info/src/brython.js:9137
anonymous https://brython.info/src/brython.js line 5202 > Function:21
loop https://brython.info/src/brython.js:5202
_run_scripts https://brython.info/src/brython.js:5088
brython https://brython.info/src/brython.js:5010
onload https://brython.info/:1
Chyba zabezpečení: Dokument na https://brython.info/ nemůže načítat nebo odkazovat na moz-extension://e2984dc2-4e2a-438a-b061-d48f48154fe4/js/Lib/site-packages/header.py?v=1572002494195.
Chyba zabezpečení: Dokument na https://brython.info/ nemůže načítat nebo odkazovat na moz-extension://e2984dc2-4e2a-438a-b061-d48f48154fe4/js/Lib/site-packages/header/__init__.py?v=1572002494321.
Z toho jsem zjistil, že něco z brythonu teče přes
extension://e2984dc2-4e2a-438a-b061-d48f48154fe4/
což je u mě Disable HTML5 Autoplay (i když by nemělo).
Při zastavení Disable HTML5 Autoplay brython.info funguje.
Zkoušel jsem tedy hledat náhradu za toto, již neudržované rozšíření a je to celkem zamotané:
https://github.com/Eloston/disable-html5-autoplay/issues/175
Ve FF to budu řešit nastavením v about:config
media.autoplay.default na 1
dle
https://www.ghacks.net/2018/09/21/firefox-improved-autoplay-blocking/
Podobné nastavení se dá najít v
about:preferences#privacy
Oprávnění -> Automatické přehrávání -> Nastavení -> blokovat přehrávání videí a medií se zvukem
Mintaka
BTW: Nefungovaly mi některé captchy. Vůbec se na stránce nezobrazily, jen mi to vynadalo, že jsem je nevyřešil a nepustilo mě to dál, což třeba při vyplnění komplikovaného formuláře naštve. Možná se tím vyřeší i tento problém.
25. 10. 2019, 14:14 editováno autorem komentáře
Zrovna bezpečnost je jedna z věcí, kterou jsem tím kódem na straně uživatele chtěl posunout zase o kousek dál.
Databáze by mohla být i na localhostu, ale v principu kdekoliv, dostupná po TCP.
Volitelně zde může být dvoufaktorová autentizace přes SMS nebo email a několik dalších opatření.
V této aplikaci má každý uživatel svou vlastní databázi. Uživatelé jsou v bezpečnosti svých zařízení "pokročilí", jejich stroje mají nadstandardní zabezpečení, bohužel přístup nelze omezit na konkrétní IP/MAC., někteří však přistupují přes VPN do bezpečnější sítě a pak teprve ven.
Heslo do DB by bylo složením saltu, který přišel po https ze serveru + toho co by zadal uživatel přímo v aplikaci a měl uložené jen u sebe.
Aktuálně to funguje tak, že k databázím uživatelů se připojuje server s aplikačním kódem se svým saltem+hashem hesla uživatele. (Změna hesla uživatele je pak bohužel netriviální operace.) Databáze jsou mimo server s aplikační logikou.
Ovšem heslo byť ve formě hashe odchází od klienta na server.
Navíc, data v databázi jsou šifrována na úrovni jednotlivých záznamů/dokumentů jde o MongoDB ale principiálně by šlo použít téměř libovolné SŘBD.
Data z databáze jsou nahrána na server, kde jsou rozšifrována a po dobu přihlášení uživatele jsou kompletně v RAM serveru. Odtud jsou používána pro vytváření stránek dle požadavků uživatele.
Čtení je ze záznamů v RAM serveru, zápisy do DB se v samostatných vláknech šifrují a ukládají do zdrojové databáze, takže se tím nezdržuje samotný běh aplikace a uživatel na to nečeká.
Od možnosti přihlášení k DB přímo z browseru od uživatele bych si sliboval:
- zmenšení nároků na RAM serveru (od 15 do 200MB na uživatele, medián ~70MB)
- snížení zátěže serveru
- zrychlení odezvy (teď je dobrá, ale mohla by být ještě lepší)
- zvýšení zabezpečení (rozšifrovaná data by byla jen v prohlížeči nikoliv v prohlížeči a ještě i na serveru)
- lepší možnosti offline funkčnosti
Pokud v tom vidíte problém, který možná nevidím, budu rád za připomínky.
PS:
Tady to vypadá, že by přímé připojení do MongoDB z JS mělo být možné:
https://dzone.com/articles/crud-operations-on-mongodb-thru-nodejs
https://www.tutorialsteacher.com/nodejs/access-mongodb-in-nodejs
Kdyby to přes REST API nešlo, i tak by šlo využít server k předání šifrovaných dat k uživateli a rozšifrování a uložení pracovní kopie dat by se řešilo až v browseru a v RAM uživatele.