Repository files navigation

Google AppEngine: Minimal skeleton of a Python server

A minimal Flask server serving static HTML pages that deploys seamlessly to Google AppEngine, no troubleshooting needed. It also comes with a minimal HTML template skeleton in Jinja.
This skeleton complies with GAE's format although it won't run you through their instructions to set up a GAE's project.

See a live example of this template running on GAE.

Price of running on GAE

[As of April 2020, and purely informative]

GAE runs your server for FREE as long as you are under a million visits a day or so. You only need to purchase the domain name, and that's optional if you can be content with PROJECTNAME.appspot.com.
You would need to pay ($1 a month) if you want Gmail to host the emails for your domain.

Instructions

Run your server locally. When you are happy with the result, deploy to Google AppEngine (you will need to setup that account) and your website will be on internet.

Install

One time only install.

git clone https://github.com/ThomasJannaud/appengine_python_skeleton.git
python -m venv env
source env/bin/activate
pip install -r requirements.txt # Re-run this if you add libraries

Run your website locally

Most of this skeleton consists of a minimal Flask server for you to customize.
Edit the webpages in the Templates/ folder and style them in the static/ folder.
Change the logic in page_handler.py to serve more urls or in main.py to serve anything else than static pages.

To run, you only need:

python main.py

The server is now running on localhost:8080. Just navigate to either one of:

  • localhost:8080
  • localhost:8080?name=Thomas
  • localhost:8080/contact

The nice thing about Flask is that you can update your HTML templates or your Python code and Flask should take the changes into account without restarting the server.

Deploy

You need to have a GAE account and create a project there. It will ask at some point for Billing info but again it is free if you use the app normally, and if you are unsure set a budget (e.g $1 a month) to not have any bad surprise.
Your website will be hosted on https://PROJECTID.appspot.com but if you own a domain you can point it to this host.

Follow the instructions as you install gcloud to validate your credentials. Then run

gcloud app deploy --project PROJECTID

to deploy. The setup might take time but once it is ready one command line is enough.

About

AppEngine Python template Flask server

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Google AppEngine: Minimal skeleton of a Python server

A minimal Flask server serving static HTML pages that deploys seamlessly to Google AppEngine, no troubleshooting needed. It also comes with a minimal HTML template skeleton in Jinja.
This skeleton complies with GAE's format although it won't run you through their instructions to set up a GAE's project.

See a live example of this template running on GAE.

Price of running on GAE

[As of April 2020, and purely informative]

GAE runs your server for FREE as long as you are under a million visits a day or so. You only need to purchase the domain name, and that's optional if you can be content with PROJECTNAME.appspot.com.
You would need to pay ($1 a month) if you want Gmail to host the emails for your domain.

Instructions

Run your server locally. When you are happy with the result, deploy to Google AppEngine (you will need to setup that account) and your website will be on internet.

Install

One time only install.

git clone https://github.com/ThomasJannaud/appengine_python_skeleton.git
python -m venv env
source env/bin/activate
pip install -r requirements.txt # Re-run this if you add libraries

Run your website locally

Most of this skeleton consists of a minimal Flask server for you to customize.
Edit the webpages in the Templates/ folder and style them in the static/ folder.
Change the logic in page_handler.py to serve more urls or in main.py to serve anything else than static pages.

To run, you only need:

python main.py

The server is now running on localhost:8080. Just navigate to either one of:

  • localhost:8080
  • localhost:8080?name=Thomas
  • localhost:8080/contact

The nice thing about Flask is that you can update your HTML templates or your Python code and Flask should take the changes into account without restarting the server.

Deploy

You need to have a GAE account and create a project there. It will ask at some point for Billing info but again it is free if you use the app normally, and if you are unsure set a budget (e.g $1 a month) to not have any bad surprise.
Your website will be hosted on https://PROJECTID.appspot.com but if you own a domain you can point it to this host.

Follow the instructions as you install gcloud to validate your credentials. Then run

gcloud app deploy --project PROJECTID

to deploy. The setup might take time but once it is ready one command line is enough.

About

AppEngine Python template Flask server

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Google AppEngine: Minimal skeleton of a Python server

A minimal Flask server serving static HTML pages that deploys seamlessly to Google AppEngine, no troubleshooting needed. It also comes with a minimal HTML template skeleton in Jinja.
This skeleton complies with GAE's format although it won't run you through their instructions to set up a GAE's project.

See a live example of this template running on GAE.

Price of running on GAE

[As of April 2020, and purely informative]

GAE runs your server for FREE as long as you are under a million visits a day or so. You only need to purchase the domain name, and that's optional if you can be content with PROJECTNAME.appspot.com.
You would need to pay ($1 a month) if you want Gmail to host the emails for your domain.

Instructions

Run your server locally. When you are happy with the result, deploy to Google AppEngine (you will need to setup that account) and your website will be on internet.

Install

One time only install.

git clone https://github.com/ThomasJannaud/appengine_python_skeleton.git
python -m venv env
source env/bin/activate
pip install -r requirements.txt # Re-run this if you add libraries

Run your website locally

Most of this skeleton consists of a minimal Flask server for you to customize.
Edit the webpages in the Templates/ folder and style them in the static/ folder.
Change the logic in page_handler.py to serve more urls or in main.py to serve anything else than static pages.

To run, you only need:

python main.py

The server is now running on localhost:8080. Just navigate to either one of:

  • localhost:8080
  • localhost:8080?name=Thomas
  • localhost:8080/contact

The nice thing about Flask is that you can update your HTML templates or your Python code and Flask should take the changes into account without restarting the server.

Deploy

You need to have a GAE account and create a project there. It will ask at some point for Billing info but again it is free if you use the app normally, and if you are unsure set a budget (e.g $1 a month) to not have any bad surprise.
Your website will be hosted on https://PROJECTID.appspot.com but if you own a domain you can point it to this host.

Follow the instructions as you install gcloud to validate your credentials. Then run

gcloud app deploy --project PROJECTID

to deploy. The setup might take time but once it is ready one command line is enough.

About

AppEngine Python template Flask server

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Google AppEngine: Minimal skeleton of a Python server

A minimal Flask server serving static HTML pages that deploys seamlessly to Google AppEngine, no troubleshooting needed. It also comes with a minimal HTML template skeleton in Jinja.
This skeleton complies with GAE's format although it won't run you through their instructions to set up a GAE's project.

See a live example of this template running on GAE.

Price of running on GAE

[As of April 2020, and purely informative]

GAE runs your server for FREE as long as you are under a million visits a day or so. You only need to purchase the domain name, and that's optional if you can be content with PROJECTNAME.appspot.com.
You would need to pay ($1 a month) if you want Gmail to host the emails for your domain.

Instructions

Run your server locally. When you are happy with the result, deploy to Google AppEngine (you will need to setup that account) and your website will be on internet.

Install

One time only install.

git clone https://github.com/ThomasJannaud/appengine_python_skeleton.git
python -m venv env
source env/bin/activate
pip install -r requirements.txt # Re-run this if you add libraries

Run your website locally

Most of this skeleton consists of a minimal Flask server for you to customize.
Edit the webpages in the Templates/ folder and style them in the static/ folder.
Change the logic in page_handler.py to serve more urls or in main.py to serve anything else than static pages.

To run, you only need:

python main.py

The server is now running on localhost:8080. Just navigate to either one of:

  • localhost:8080
  • localhost:8080?name=Thomas
  • localhost:8080/contact

The nice thing about Flask is that you can update your HTML templates or your Python code and Flask should take the changes into account without restarting the server.

Deploy

You need to have a GAE account and create a project there. It will ask at some point for Billing info but again it is free if you use the app normally, and if you are unsure set a budget (e.g $1 a month) to not have any bad surprise.
Your website will be hosted on https://PROJECTID.appspot.com but if you own a domain you can point it to this host.

Follow the instructions as you install gcloud to validate your credentials. Then run

gcloud app deploy --project PROJECTID

to deploy. The setup might take time but once it is ready one command line is enough.

About

AppEngine Python template Flask server

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Google AppEngine: Minimal skeleton of a Python server

A minimal Flask server serving static HTML pages that deploys seamlessly to Google AppEngine, no troubleshooting needed. It also comes with a minimal HTML template skeleton in Jinja.
This skeleton complies with GAE's format although it won't run you through their instructions to set up a GAE's project.

See a live example of this template running on GAE.

Price of running on GAE

[As of April 2020, and purely informative]

GAE runs your server for FREE as long as you are under a million visits a day or so. You only need to purchase the domain name, and that's optional if you can be content with PROJECTNAME.appspot.com.
You would need to pay ($1 a month) if you want Gmail to host the emails for your domain.

Instructions

Run your server locally. When you are happy with the result, deploy to Google AppEngine (you will need to setup that account) and your website will be on internet.

Install

One time only install.

git clone https://github.com/ThomasJannaud/appengine_python_skeleton.git
python -m venv env
source env/bin/activate
pip install -r requirements.txt # Re-run this if you add libraries

Run your website locally

Most of this skeleton consists of a minimal Flask server for you to customize.
Edit the webpages in the Templates/ folder and style them in the static/ folder.
Change the logic in page_handler.py to serve more urls or in main.py to serve anything else than static pages.

To run, you only need:

python main.py

The server is now running on localhost:8080. Just navigate to either one of:

  • localhost:8080
  • localhost:8080?name=Thomas
  • localhost:8080/contact

The nice thing about Flask is that you can update your HTML templates or your Python code and Flask should take the changes into account without restarting the server.

Deploy

You need to have a GAE account and create a project there. It will ask at some point for Billing info but again it is free if you use the app normally, and if you are unsure set a budget (e.g $1 a month) to not have any bad surprise.
Your website will be hosted on https://PROJECTID.appspot.com but if you own a domain you can point it to this host.

Follow the instructions as you install gcloud to validate your credentials. Then run

gcloud app deploy --project PROJECTID

to deploy. The setup might take time but once it is ready one command line is enough.

About

AppEngine Python template Flask server

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Google AppEngine: Minimal skeleton of a Python server

A minimal Flask server serving static HTML pages that deploys seamlessly to Google AppEngine, no troubleshooting needed. It also comes with a minimal HTML template skeleton in Jinja.
This skeleton complies with GAE's format although it won't run you through their instructions to set up a GAE's project.

See a live example of this template running on GAE.

Price of running on GAE

[As of April 2020, and purely informative]

GAE runs your server for FREE as long as you are under a million visits a day or so. You only need to purchase the domain name, and that's optional if you can be content with PROJECTNAME.appspot.com.
You would need to pay ($1 a month) if you want Gmail to host the emails for your domain.

Instructions

Run your server locally. When you are happy with the result, deploy to Google AppEngine (you will need to setup that account) and your website will be on internet.

Install

One time only install.

git clone https://github.com/ThomasJannaud/appengine_python_skeleton.git
python -m venv env
source env/bin/activate
pip install -r requirements.txt # Re-run this if you add libraries

Run your website locally

Most of this skeleton consists of a minimal Flask server for you to customize.
Edit the webpages in the Templates/ folder and style them in the static/ folder.
Change the logic in page_handler.py to serve more urls or in main.py to serve anything else than static pages.

To run, you only need:

python main.py

The server is now running on localhost:8080. Just navigate to either one of:

  • localhost:8080
  • localhost:8080?name=Thomas
  • localhost:8080/contact

The nice thing about Flask is that you can update your HTML templates or your Python code and Flask should take the changes into account without restarting the server.

Deploy

You need to have a GAE account and create a project there. It will ask at some point for Billing info but again it is free if you use the app normally, and if you are unsure set a budget (e.g $1 a month) to not have any bad surprise.
Your website will be hosted on https://PROJECTID.appspot.com but if you own a domain you can point it to this host.

Follow the instructions as you install gcloud to validate your credentials. Then run

gcloud app deploy --project PROJECTID

to deploy. The setup might take time but once it is ready one command line is enough.

About

AppEngine Python template Flask server

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Google AppEngine: Minimal skeleton of a Python server

A minimal Flask server serving static HTML pages that deploys seamlessly to Google AppEngine, no troubleshooting needed. It also comes with a minimal HTML template skeleton in Jinja.
This skeleton complies with GAE's format although it won't run you through their instructions to set up a GAE's project.

See a live example of this template running on GAE.

Price of running on GAE

[As of April 2020, and purely informative]

GAE runs your server for FREE as long as you are under a million visits a day or so. You only need to purchase the domain name, and that's optional if you can be content with PROJECTNAME.appspot.com.
You would need to pay ($1 a month) if you want Gmail to host the emails for your domain.

Instructions

Run your server locally. When you are happy with the result, deploy to Google AppEngine (you will need to setup that account) and your website will be on internet.

Install

One time only install.

git clone https://github.com/ThomasJannaud/appengine_python_skeleton.git
python -m venv env
source env/bin/activate
pip install -r requirements.txt # Re-run this if you add libraries

Run your website locally

Most of this skeleton consists of a minimal Flask server for you to customize.
Edit the webpages in the Templates/ folder and style them in the static/ folder.
Change the logic in page_handler.py to serve more urls or in main.py to serve anything else than static pages.

To run, you only need:

python main.py

The server is now running on localhost:8080. Just navigate to either one of:

  • localhost:8080
  • localhost:8080?name=Thomas
  • localhost:8080/contact

The nice thing about Flask is that you can update your HTML templates or your Python code and Flask should take the changes into account without restarting the server.

Deploy

You need to have a GAE account and create a project there. It will ask at some point for Billing info but again it is free if you use the app normally, and if you are unsure set a budget (e.g $1 a month) to not have any bad surprise.
Your website will be hosted on https://PROJECTID.appspot.com but if you own a domain you can point it to this host.

Follow the instructions as you install gcloud to validate your credentials. Then run

gcloud app deploy --project PROJECTID

to deploy. The setup might take time but once it is ready one command line is enough.

About

AppEngine Python template Flask server

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Google AppEngine: Minimal skeleton of a Python server

A minimal Flask server serving static HTML pages that deploys seamlessly to Google AppEngine, no troubleshooting needed. It also comes with a minimal HTML template skeleton in Jinja.
This skeleton complies with GAE's format although it won't run you through their instructions to set up a GAE's project.

See a live example of this template running on GAE.

Price of running on GAE

[As of April 2020, and purely informative]

GAE runs your server for FREE as long as you are under a million visits a day or so. You only need to purchase the domain name, and that's optional if you can be content with PROJECTNAME.appspot.com.
You would need to pay ($1 a month) if you want Gmail to host the emails for your domain.

Instructions

Run your server locally. When you are happy with the result, deploy to Google AppEngine (you will need to setup that account) and your website will be on internet.

Install

One time only install.

git clone https://github.com/ThomasJannaud/appengine_python_skeleton.git
python -m venv env
source env/bin/activate
pip install -r requirements.txt # Re-run this if you add libraries

Run your website locally

Most of this skeleton consists of a minimal Flask server for you to customize.
Edit the webpages in the Templates/ folder and style them in the static/ folder.
Change the logic in page_handler.py to serve more urls or in main.py to serve anything else than static pages.

To run, you only need:

python main.py

The server is now running on localhost:8080. Just navigate to either one of:

  • localhost:8080
  • localhost:8080?name=Thomas
  • localhost:8080/contact

The nice thing about Flask is that you can update your HTML templates or your Python code and Flask should take the changes into account without restarting the server.

Deploy

You need to have a GAE account and create a project there. It will ask at some point for Billing info but again it is free if you use the app normally, and if you are unsure set a budget (e.g $1 a month) to not have any bad surprise.
Your website will be hosted on https://PROJECTID.appspot.com but if you own a domain you can point it to this host.

Follow the instructions as you install gcloud to validate your credentials. Then run

gcloud app deploy --project PROJECTID

to deploy. The setup might take time but once it is ready one command line is enough.

About

AppEngine Python template Flask server

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages