Classroom "rules":
Tell us about yourself:
Online development: Github account
Local development:
Local development (option 2):
A client sends an HTTP request:
GET /index.html HTTP/1.1
Host: www.example.com
The server sends back an HTTP response:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 208
<!DOCTYPE html>
<html>
<head>
<title>Example Domain</title>
</head>
<body>
<h1>Example Domain</h1>
<p>This domain is to be used for illustrative examples in documents.</p>
</body>
</html>
The most commonly used codes:
Code | Meaning |
---|---|
200 | OK |
301 | Moved Permanently |
404 | Not Found |
500 | Server Error |
See more codes at HTTPcats.com or Wikipedia: List of HTTP status codes.
Webpages are made up of three languages:
The most basic server just serves up HTML and multimedia files from a file system.
Server-side code is also useful for anything that requires access to persistent data or needs an additional layer of security than allowed in the client.
The http module in the Python standard library can run a basic server.
⚠️ It is not recommended for production.
It's handy for learning and local development, however...
A file server serves up files and folders according to their path in the file system. Also known as a static server.
Run a file server from any folder:
python3 -m http.server 8080
👩🏼💻 Repo: github.com/pamelafox/python-simple-server-example/
The server code is in server.py.
Uses the http
module to dynamically generate responses.
Run the server:
python3 server.py
Flask, an external package, is a lightweight framework for server requests and responses.
Apps written in Flask:
👀 Demo: tinyurl.com/simple-flask-website
👩🏼💻 Repo: github.com/pamelafox/simple-flask-server-example/
Most of the server code is in app.py. Uses Flask to generate responses for each route
Run the server:
python3 -m flask run --port 50505 --debug
Handle GET requests to "/about" route:
@app.get("/about")
def index():
return 'About Us'
Handle query parameters:
@app.get("/search")
def hello():
query = request.args.get("query")
return f"Searching for: {query}!"
Handle path parameters:
@app.get("/book/<id>")
def hello(name):
return f"Book with ID {id}!"
Handle POST requests:
@app.post("/submit")
def submit():
return "Thanks for submitting!"
Handle form data:
@app.post("/submit")
def submit():
name = request.form.get("name")
return f"Thanks for submitting, {name}!"
Handle JSON data:
@app.post("/submit")
def submit():
data = request.get_json()
name = data.get("name")
return f"Thanks for submitting, {name}!"
Flask uses Jinja2 templates to render HTML.
Variables:
<h1>{{ title }}</h1>
Conditionals:
{% if user %}
<p>{{ user.name }}</p>
{% else %}
<p>Logged out</p>
{% endif %}
Loops:
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
Using this repo:
github.com/pamelafox/simple-flask-server-example/
🙋🏼♀️🙋🏾♀️🙋🏽♀️ Let us know if you need any help! 🙋🏻♀️🙋🏽♂️🙋🏿♀️
Jinja2 supports template inheritance, which allows you to define a base template that other templates can extend.
Base template:
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
Child template:
{% extends "base.html" %}
{% block content %}
<h1>About Us</h1>
{% endblock %}
Using this repo:
github.com/pamelafox/simple-flask-server-example/
or your own app from the previous exercise.
🙋🏼♀️🙋🏾♀️🙋🏽♀️ Let us know if you need any help! 🙋🏻♀️🙋🏽♂️🙋🏿♀️
When your website is hosted on a server, it means other users on the Internet can access it.
Many possible hosts:
Consider:
Azure Container Apps | Azure Functions | |||
Azure Kubernetes Service | Container Management | Azure App Service | Serverless | |
Environment | Containers | PaaS | ||
Cloud | Azure |
For Flask, App Service is easiest way to get started.
Databases | PostGreSQL, MySQL, CosmosDB, ... |
---|---|
Storage | Blob Storage, Files, Archive Storage, ... |
Networking | DNS Zone, Virtual Network, VPN Gateway, ... |
Caching | CDN, Front Door, ... |
Security | Key Vault, Security Center, ... |
Machine Learning | Translator, Bot Service, Computer Vision, ... |
...and more! |
Using the Azure Dev CLI:
azd up
azd up
. If prompted, login to your Azure account.
azd down
to un-deploy the app (so that you don't waste cloud resources unnecessarily).