Vlákno názorů k článku Brython aneb použití jazyka Python ve skriptech přímo v prohlížeči od Mintaka - Po Brythonu pokukuji mnoho let, ale zatím jsem...

  • Článek je starý, nové názory již nelze přidávat.
  • 24. 10. 2019 13:39

    Mintaka

    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?

  • 24. 10. 2019 14:06

    Bystroushaak

    > 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č.

  • 24. 10. 2019 20:03

    Pavel Tišnovský
    Zlatý podporovatel

    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.

  • 25. 10. 2019 13:29

    Mintaka

    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/fra­mem", 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)

  • 25. 10. 2019 14:12

    Mintaka

    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.autopla­y.default na 1

    dle

    https://www.ghacks.net/2018/09/21/firefox-improved-autoplay-blocking/

    Podobné nastavení se dá najít v

    about:preferen­ces#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

  • 25. 10. 2019 11:15

    Třešťák Huho

    Je dobrej nápad přímo z browseru, kde je uživateli k dispozici zdrojový kód, přistupovat k db, ke který potřebujete přihlašovací údaje?

  • 25. 10. 2019 15:24

    Mintaka

    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.