Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ii:labs:s2:01 [2022/03/31 18:31]
florin.stancu
ii:labs:s2:01 [2023/03/27 15:20] (current)
radu.mantu
Line 1: Line 1:
 ~~NOTOC~~ ~~NOTOC~~
  
-====== Lab 01 - Web Basics (Flask) ​======+===== Lab 01 - Mastering Python ​======
  
 ==== Objectives ==== ==== Objectives ====
  
-  * Basic Web frontend coding (HTML + CSS) +  * Practice Python'​s syntax 
-  * Browser Development Tools (i.e., Web Inspector) +  * Learn to use the various ​Python ​structures 
-  * Server intro: ​Python ​/ Flask backend +  * Learn how to install & use third party libraries
-  * Forms and authentication (user sessions) +
-  * Advanced HTTP: file uploading+
  
 ===== Contents ===== ===== Contents =====
Line 18: Line 16:
 ===== Introduction ===== ===== Introduction =====
  
-With the emergence of the Internet and its undeniable commercial importance,​ +Python is dynamic, interpreted language that has gained widespread popularity among developers ​for its ease of use and versatility. It was first released in 1991 by Guido van Rossum and has since become one of the most widely-used languages in the world.
-web development became ​necessary software skill for an engineer to have.+
  
-A web site / application has two major components:​ +Python'​s syntax is clear and concisemaking it easy to read and write, even for those new to programming. Its standard library includes a wide range of modules, making it well-suited ​for tasks ranging from web development and data analysis ​to artificial intelligence and machine learning.
-  * **the frontend**: the user interfacedisplayed with the help of a client-side browser; written in HTML + CSS, optionally employing JavaScript ​for better interactivity;​ +
-  * **the backend**: an optional server-side program used to provide additional ​web services ​to the users such as authentication,​ data persistence,​ database searching etc.+
  
-In the typical scenariothe user requests to open website by using a known URL. +With its focus on simplicity and flexibilityPython is great language for both beginners ​and experienced developers alikewhich is why it'​s ​such a good choice ​for an Applied Computer Science course.
-After optionally doing the DNS resolution to obtain an IP address, the browser connects to the server using the HTTP protocol (optionally encrypted using TLS) and requests the web page using specific HTTP headers. +
-The server software will then parse the messageidentify the requested document or dynamic application,​ do optional processing (e.g., invoke a routine / server-side script / CGI program to generate the webpage'​s ​HTML contents) and send the results back to the client'​s browser ​for displaying (or download, in some cases).+
  
-==== Frontend Basics ​====+===== Preparation =====
  
-On the client-side,​ //HyperText Markup Language (HTML)// is the de-facto standard language accepted by all browsers to describe the aspect and contents of web page. A HTML document is built using nested elements (i.e., tags) describing the structure (layout) of the page, text / graphical content and, optionally, client-side scripts and metadata. Each HTML element may have a series of pre-defined properties ​(e.g., ​paragraph ​line splitting, bigger/smaller font sizes, form input behavior etc.) which may (or may not) be altered using //attributes// specified between ​tag's angle brackets: +You will require ​code editor supporting Python syntax ​(e.g., ​[[https://code.visualstudio.com/|Visual Studio Code]] with plugins ​[[http://lunarvim.org/​|LunarVIM]]) and [[https://www.python.org/downloads/|Python 3]] (>= 3.7) distribution for your Operating System.
-<code html> +
-<tag1 attribute1="​attribute value" id="​unique-name-here">​ +
-  <​anothertag style="​CSS properties">​inside<​/anothertag>​ +
-  <​p>​paragraph <​b>​bold face</b></p> +
-</tag1> +
-</code>+
  
-HTML is often paired together with Cascading Style Sheetsa style definition language used to modify layout ​content properties for multiple elements at once by using special pattern matching rules using //selectors//. The general syntax is the selector (notethere are multiple types rules), followed by the list of style properties to apply (in ''​{ }''​ brackets, separated by '';''​):+Windows usersyou can either use the official [[https://www.python.org/downloads/windows/|Python3 release]] installer or the [[https://​learn.microsoft.com/​en-us/​windows/​wsl/​install|Windows Subsystem for Linux]] ​(highly recommended).
  
-<code css> +For Linux-based OSes, you may simply install the ''​python3''​ and ''​python3-pip''​ packages from the distro'​s official repositories.
-/* tag selector (matches all <​tag1>​ elements) */ +
-tag1 { property1: value; ... } +
-/* ID selector (matches <tag id="​unique-name-here">​) */ +
-#​unique-name-here { color: red; ... } +
-/* Class selectors (matches <tag class="​normal-text gray-bold">​) */ +
-/* Note: an element ​may have multiple classes */ +
-.normal-text { font-size: 14pt; ... } +
-.gray-bold { color: gray; font-weight:​ bold; } +
-/* Combined selectors: e.g. matches only <​tag1>​ with class="​special"​ */ +
-tag1.special { ... } +
-/* Nested selectors (element contained in another element) */ +
-#my-header h1 { ... } +
-/* or direct descentant rule: */ +
-.nav > .nav-item { ..}  +
-</​code>​+
  
-Thus, it becomes possible to create re-usable page elements (e.g., menus, various font styles, context boxes). +==== Python3 Resources ====
-This has led to the emergence of many CSS frameworks (e.g., [[https://​getbootstrap.com/​|Bootstrap]],​ [[https://​get.foundation/​|Foundation]]) facilitating the creation of responsive (accessible to both desktop + mobile devices) designs.+
  
-==== Serverside: ​Python ​/ Flask ====+Most of these tasks will involve a specific subset of Python ​features (e.g., data types, standard library routines or even PIP packages).
  
-On the server-sidesoftware must be running ​and listen for HTTP connections, optionally ​do application-specific processing and serve the requested web pages or files.+For most of themyou will be given a couple of notes with the concepts you will need to use and, optionally, an URL to their official documentations. 
 +Also check out the [[https://​docs.python.org/​3/​tutorial/​|official Python Tutorial]] (at least take a look at its Table of Contents to get a sense of the available topics).
  
-There are many standalone web server programs available on the market, with open-source software being the norm (e.g., [[https://​httpd.apache.org/​|Apache httpd]], [[https://​nginx.org/​|nginx]],​ [[https://​www.lighttpd.net/​|lighttpd]]) that can readily serve static resources and can be configured to execute third party interpreters to do server-side processing (e.g., [[https://​www.php.net/​|PHP]]).+==== iPython ====
  
-Moreovermodern programming languages (e.g.[[https://nodejs.org|NodeJS]],​ [[https://​go.dev/|Golang]], [[https://www.python.org/|Python]]) have built-in HTTP servers and third-party libraries that makes web development setup a breeze and well integrated with the web application'​s processing needs.+Even when you're writing Python scriptsyou'll want to do some quick prototyping every now and againThe shell that you choose for this can either make or break your experienceWe recommend that you install ​[[https://ipython.readthedocs.io/en/stable/index.html|IPython]]:
  
-Today, we will introduce [[https://​flask.palletsprojects.com/​|Flask]],​ a web framework for the Python language. +<code bash> 
-Flask uses Python decorators (e.g., ''​@decorator''​) to enhance functions and register them to be executed whenever the web server receives a HTTP request:+$ sudo apt update && sudo apt upgrade 
 +$ sudo apt install ipython3
  
-<code python>​ +$ ipython3
-from flask import Flask, request +
- +
-# first, create a Flask application instance +
-app = Flask("​my_website"​) +
- +
-@app.route("/​page.html"​) +
-def serve_page():​ +
-  """​ Returns some basic HTML content. """​ +
-  return "<​h1>​hello world</​h1>"​ +
-</​code>​ +
- +
-Of course, URL patterns can also be captured by a single function, check [[https://​flask.palletsprojects.com/​en/​2.1.x/​api/#​url-route-registrations|the official Flask route documentation]]. +
- +
-The routine must return a HTTP response which may either be HTML string, a rendered template, a redirection or a custom-built Response object: +
-<code python>​ +
-from Flask import Flask, render_template,​ redirect, Response +
-@app.route("/"​) +
-def serve_template():​ +
-  return render_template("​index.html",​ title="​Hello World"​) +
- +
-@app.route("/​admin"​) +
-def serve_unauthorized():​ +
-  # Note: 307 is standard HTTP code for TEMPORARY REDIRECT +
-  return redirect("/​login.html",​ 307, "<​h1>​Redirecting,​ please wait...</​h1>"​) +
- +
-@app.route("/​special.xml"​) +
-def serve_special_xml():​ +
-  return Response("<​xml><​author>​Me</​author></​xml>",​ mimetype='​text/​xml'​) +
-</​code>​ +
- +
-Check [[https://​flask.palletsprojects.com/​en/​2.1.x/​api/#​response-objects|Flask'​s Response object documentation]] for all available options. +
- +
-=== Template Engines === +
- +
-A typical website has a common HTML design, with only portions of its code changing on a per-page basis with specific content. +
-In order to prevent needless code duplication,​ a **template engine** is usually employed to obtain HTML documents from common layouts. A template is, basically, a HTML page interleaved with specific code blocks used to insert dynamically generated content from variables; many engines feature full programming languages that support loops and conditionals.\ +
- +
-Flask readily integrates with the [[https://​jinja.palletsprojects.com/​en/​3.1.x/​templates/​|Jinja templating engine]] which uses Python-like statements to enrich a HTML page with programmatic content: +
-<code html> +
-<!-- ... --> +
-<​body>​ +
-    <​h1>​My Webpage is {{ awesome_variable }}</​h1>​ +
- +
-    <ul id="​main-menu">​ +
-    {% for item in navigation %} +
-        <​li><​a href="​{{ item.href }}">​{{ item.caption }}</​a></​li>​ +
-    {% endfor %} +
-    </​ul>​ +
- +
-    {# a comment #} +
-</​body>​ +
-</​code>​ +
- +
-The Jinja templates usually reside inside the project'​s ''​templates/''​ directory (check the [[https://​flask.palletsprojects.com/​en/​2.1.x/​api/#​application-object|Flask documentation]] if you want to change it) and can be rendered using the ''​[[https://​flask.palletsprojects.com/​en/​2.1.x/​api/#​template-rendering|render_template]]''​ utility function. +
- +
-=== Accessing HTTP request data === +
- +
-When Python is executing a Flask-decorated function, the request context is made available using the ''​request''​ member of the ''​Flask''​ package. +
- +
-It contains [[https://​flask.palletsprojects.com/​en/​2.1.x/​api/#​incoming-request-data|all request data]] provided by the browser: +
- +
-  * ''​request.method'':​ the requested HTTP method string (e.g., ''​GET''​ or ''​POST''​);​ +
-  * ''​request.args'':​ a Python ''​dict''​ object with URL query string parameters, e.g. ''​http://​hostname/​page.html?​arg1=value&​arg2=value'';​ +
-  * ''​request.form'':​ HTML form data (for HTTP ''​POST''​ methods) as a ''​dict''​ object; +
-  * ''​request.cookies'':​ cookies stored by the browser (also a ''​dict''​);​ +
-  * ''​request.headers'':​ other HTTP request headers; +
- +
-Example code for printing data to the console: +
-<code python>​ +
-from Flask import request # and many others +
-# ... +
-@app.route("/"​) +
-def my_request_handler():​ +
-  print("​Method is", request.method) +
-  print("​URL parameters:",​ request.args) +
-  # hint: access members using dict.get() method to have a default value: +
-  print(request.args.get("​arg1",​ "​default value"​)) +
-  if request.method == "​POST":​ +
-    print("​Any form data:",​ request.form) +
-  print("​Cookies:",​ str(request.cookies)) +
-  print("​Headers:",​ str(request.headers)) +
-</​code>​ +
- +
-Flask also parses many other request data formats (XML, JSON, multipart / file upload requests etc.) and provides helpers to manipulating them. +
- +
-Finally, we note that the HTTP protocol is stateless: on its own, it doesn'​t retain anything from previous requests, e.g., the user's identity or navigation history. +
- +
-Thus, it becomes the server'​s responsibility to use browser-assisted persistence mechanisms such as cookies to associate a HTTP request with a specific user, also called a **Session**. For security reasons, the server must specifically validate any data received from the user, often through cryptographic means. +
- +
- +
-===== Preparation ===== +
- +
-In order to solve the tasks, you will need a modern browser (//duh//), a code editor supporting HTML, CSS and Python (e.g., [[https://​code.visualstudio.com/​|Visual Studio Code]] with plugins), a [[https://​www.python.org/​downloads/​|Python 3]] distribution (you must also have ''​pip''​ installed). +
- +
-Next, we will need to install the ''​Flask''​ Python package using the PIP package manager: +
-<code bash> +
-# NOTE: choose the most appropriate command: +
-# install globally (requires root / admin) +
-python3 -mpip install flask +
-# .. or for the current user only (e.g., inside ~/​.local/​lib/​python/​ on Linux) +
-python3 -mpip install --user flask+
 </​code>​ </​code>​
  
Line 179: Line 51:
  
 {{namespace>:​ii:​labs:​s2:​01:​tasks&​nofooter&​noeditbutton}} {{namespace>:​ii:​labs:​s2:​01:​tasks&​nofooter&​noeditbutton}}
 +
  
  
ii/labs/s2/01.1648740693.txt.gz · Last modified: 2022/03/31 18:31 by florin.stancu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0