{"id":17945416,"url":"https://github.com/gvwilson/web-tutorial","last_synced_at":"2025-06-14T15:04:40.391Z","repository":{"id":253135294,"uuid":"842434590","full_name":"gvwilson/web-tutorial","owner":"gvwilson","description":"Web Programming for Data Scientists","archived":false,"fork":false,"pushed_at":"2024-09-07T23:00:26.000Z","size":931,"stargazers_count":9,"open_issues_count":11,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-29T07:00:45.576Z","etag":null,"topics":["data-science","javascript","open-source","python","tutorial","web-development"],"latest_commit_sha":null,"homepage":"https://gvwilson.github.io/web-tutorial/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gvwilson.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-14T10:47:39.000Z","updated_at":"2024-10-08T20:45:45.000Z","dependencies_parsed_at":"2024-08-22T18:58:34.431Z","dependency_job_id":"d31be80c-3be9-4ee5-a124-43b7e7a2761d","html_url":"https://github.com/gvwilson/web-tutorial","commit_stats":null,"previous_names":["gvwilson/wp4ds","gvwilson/web-tutorial"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gvwilson/web-tutorial","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gvwilson%2Fweb-tutorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gvwilson%2Fweb-tutorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gvwilson%2Fweb-tutorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gvwilson%2Fweb-tutorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gvwilson","download_url":"https://codeload.github.com/gvwilson/web-tutorial/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gvwilson%2Fweb-tutorial/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259835381,"owners_count":22918975,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-science","javascript","open-source","python","tutorial","web-development"],"created_at":"2024-10-29T07:00:25.791Z","updated_at":"2025-06-14T15:04:40.216Z","avatar_url":"https://github.com/gvwilson.png","language":"Python","readme":"# The Webonomicon\n\n\u003cp class=\"subtitle\"\u003eAn Introduction to Web Programming for Weary Data Scientists\u003c/p\u003e\n\n\u003cdiv class=\"row\" markdown=\"1\"\u003e\n  \u003cdiv class=\"col-4 center\"\u003e\n    \u003cimg src=\"./static/advent_05_354.png\" alt=\"Advent 354 by Danielle Navarro\" style=\"width: 80%\"\u003e\n  \u003c/div\u003e\n  \u003cdiv class=\"col-8\" markdown=\"1\"\u003e\n\nThis tutorial is a short introduction to web programming using modern tools and practices\nfor data scientists who are comfortable using Python\nbut have never built interactive websites before.\nAll of the material is available under [open licenses](./LICENSE.md),\nand contributions through our [GitHub repository][repo] are welcome.\nAll contributors are required to respect our [Code of Conduct](./CODE_OF_CONDUCT.md).\n\n\u003e **Please note:** this tutorial is still being outlined.\n\u003e Most sections will have additional examples (and much more explanation)\n\u003e before learners encounter it.\n\u003e Suggestions and help are greatly appreciated.\n\n  \u003c/div\u003e\n\n\u003c/div\u003e\n\n## Learner Persona\n\n-   Sabina, 28, has a master's degree in animal physiology\n    and now works for a mid-sized veterinary pharmaceutical company.\n-   She learned a bit of R in an undergraduate biostatistics course,\n    then picked up Python in grad school.\n    She spends several hours a week analyzing data with [Pandas][pandas]\n    and visualizing it with [Plotly Express][plotly-express],\n    and is comfortable with basic Git commands.\n-   Sabina recently became responsible for maintaining a dashboard application built with [Dash][dash].\n    She believes a better understanding of how web applications work in general\n    will help her debug and extend it.\n-   Sabina has tried doing asynchronous online courses a couple of times,\n    but strongly prefers learning in real time with other people.\n\n## Syllabus\n\n\u003col class=\"chapters\" markdown=\"1\"\u003e\n\n1.  [Introduction](./01_intro/index.md): what we will learn, how to set up, and the data we will use\n1.  [HTTP](./02_http/index.md): how browsers and server talk to each other\n1.  [A Server](./03_server/index.md): building a server with [Flask][flask]\n1.  [Using a Database](./04_db/index.md): getting data from [SQLite][sqlite] using [PyPika][pypika]\n1.  [Testing the Server](./05_test/index.md): testing the server with [pytest][pytest]\n1.  [Serving HTML](./06_html/index.md): generating HTML with [Jinja][jinja] templates\n1.  [Using Forms](./07_forms/index.md): sending data to a server\n1.  [An Hour of JavaScript](./08_js/index.md): variables, loops, functions, and callbacks\n1.  [JavaScript in the Browser](./09_browser/index.md): using the language in its native habitat\n1.  [Using HTMX](./10_htmx/index.md): letting the [htmx][htmx] library do the hard work\n1.  [Database Migration](./11_migrate/index.md): managing database schema changes\n1.  [Permissions](./12_perm/index.md): representing and checking who can do what\n1.  [Authentication](./13_auth/index.md): checking the user's identity\n1.  [Encryption](./14_crypt/index.md): keeping secrets safe\n1.  [Testing in the Browser](./15_test/index.md): using [Selenium][selenium] to test the user interface\n1.  [Dynamic Graphics](./16_graphics/index.md): drawing pictures with [SVG.js][svgjs]\n1.  [A Graphical User Interface](./17_gui/index.md): handling interactivity in the browser\n1.  [Accessibility](./18_access/index.md): because everyone should be comfortable\n1.  [Internationalization](./19_intl/index.md): because everyone should be welcome\n1.  [Logging and Auditing](./20_log/index.md): keeping of track of what's happened\n1.  [Session](./21_sessions/index.md): persistent sessions and [JWT][jwt]\n1.  [Designing a Workflow](./22_workflow/index.md): thinking before coding\n\n\u003c/ol\u003e\n\n##  Appendices\n\n\u003col class=\"appendices\" markdown=\"1\"\u003e\n\n1.  [HTML and CSS](./98_htmlcss/index.md)\n1.  [Certificates](./99_cert/index.md)\n1.  [Bibliography](./bibliography.md)\n1.  [Glossary](./glossary.md)\n1.  [Contributing](./CONTRIBUTING.md)\n\n\u003c/ol\u003e\n\n## Technologies\n\n| Package                          | Purpose           |\n| -------------------------------- | ----------------- |\n| [Alpine.js][alpine]              | dynamic HTML      |\n| [Beautiful Soup][bs4]            | HTML manipulation |\n| [deno][deno]                     | JavaScript        |\n| [Flask][flask]                   | web server        |\n| [Frappe Charts][frappe-charts]   | charts            |\n| [html5validator][html5validator] | validation        |\n| [htmx][htmx]                     | interaction       |\n| [httpx][httpx]                   | HTTP              |\n| [Jinja2][jinja]                  | HTML templating   |\n| [Polars][polars]                 | tabular data      |\n| [PrettyTable][prettytable]       | formatting        |\n| [PyPika][pypika]                 | query builder     |\n| [pytest][pytest]                 | testing           |\n| [Selenium][selenium]             | testing           |\n| [SQLite][sqlite]                 | database          |\n| [SVG.js][svgjs]                  | graphics          |\n\n[alpine]: https://alpinejs.dev/\n[bs4]: https://beautiful-soup-4.readthedocs.io/\n[dash]: https://dash.plotly.com/\n[deno]: https://deno.com/\n[flask]: https://flask.palletsprojects.com/\n[frappe-charts]: https://frappe.io/charts/docs\n[html5validator]: https://pypi.org/project/html5validator/\n[htmx]: https://htmx.org/\n[httpx]: https://www.python-httpx.org/\n[jinja]: https://jinja.palletsprojects.com/\n[jwt]: https://en.wikipedia.org/wiki/JSON_Web_Token\n[pandas]: https://pandas.pydata.org/\n[plotly-express]: https://plotly.com/python/plotly-express/\n[polars]: https://pola.rs/\n[prettytable]: https://pypi.org/project/prettytable/\n[pypika]: https://pypika.readthedocs.io/\n[pytest]: https://docs.pytest.org/\n[repo]: https://github.com/gvwilson/web-tutorial\n[selenium]: https://pypi.org/project/selenium/\n[sqlite]: https://www.sqlite.org/\n[svgjs]: https://svgjs.dev/\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgvwilson%2Fweb-tutorial","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgvwilson%2Fweb-tutorial","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgvwilson%2Fweb-tutorial/lists"}