# Flask

```python
from flask import Flask, render_template

app = Flask(__name__, template_folder="path_to_folder")    # create app

# template folder contains html pages
@app.route("/")    # define URLs
def index():

    return render_template("index.html")    # parse HTML page and return it


if __name__ == "__main__":
    # run server if server is single file
    app.run(debug=True, host="0.0.0.0")
```

`@app.route("/page/")` enables to access the page with `url/page` and `url/page/`. The same is possible using `app.add_url_rule("/", "page", function)`.

## Variable Rules

You can add variable sections to a URL by marking sections with `<variable_name>`.  
Your function then receives the `<variable_name>` as a keyword argument.  
Optionally, you can use a converter to specify the type of the argument like `<converter:variable_name>`.

Converter Type | Accepts
---------------|------------------------------
`string`       | any text without a slash (default option)
`int`          | positive integers
`float`        | positive floating point values
`path`         | strings with slashes
`uuid`         | UUID strings

```python
@app.route("/user/<string:username>")    # handle URL at runtime
def profile(username):
    return f"{escape(username)}'s profile'"
```

## Redirection

`url_for(endpoint, **values)` is used to redirect passing keyworded arguments. It can be used in combination with `@app.route("/<value>")` to accept the passed arguments.

```py
from flask import Flask, redirect, url_for

@app.route("/url")
def func():

    return redirect(url_for("html_file/function"))    # redirect to other page
```

## Jinja Template Rendering (Parsing Python Code in HTML, CSS)

* `{% ... %}` for **Statements**
* `{{ ... }}` for **Expressions** to print to the template output
* `{# ... #}` for **Comments** not included in the template output
* `#  ... ##` for **Line Statements**

Use `{% block block_code %}` to put a line python code inside HTML.
Use `{% end<block> %}` to end a block of code.

In `page.html`;

```py
<html>
    {% for item in content %}
        <p>{{item}}</p>
    {% endfor %}
</html>
```

In `file.py`:

```py
@app.route("/page/)
def func():
    return render_template("page.html", content=["A", "B", "C"])
```

### Hyperlinks

In `file.py`:

```py
@app.route('/linked_page/')
def cool_form():
    return render_template('linked_page.html')
```

In `page.html`:

```html
<!doctype html>
<html>
  <head>
  </head>

  <body>
    <a href="{{ url_for('linked_page') }}">link text</a>
  </body>
</html>
```

### CSS

Put `style.css` inside `/static/style`.  

In `page.html`:

```html
<!doctype html>
<html>
  <head>
  </head>
    <link rel="stylesheet" href="{{ url_for('static', filename='style/style.css') }}">
  <body>

  </body>
</html>
```

## Template Inheritance

In `parent_template.html`:

```html
<html>
    <!-- html content -->
    {% block block_name %}
    {% endblock %}
    <!-- html content -->
</html>
```

The content of the block will be filled by the child class.

In `child_template.html`:

```html
{% extends "parent_template.html" %}
{% block block_name}
    {{ super() }}  <!-- use parent's contents -->
    <!-- block content -->
{% endblock %}
```
