Basics of Flask Flashcards
Flask-WTF what is it used for?
Is used to render and validate web forms in a safe and flexible way in Flask.
It deliver CSRF protection and data validation.
Flask what is it used for?
when we install e.g Flask == 0.10.1 we need it for managing the request / response cycle
In general, Flask is a web framework that provides you with tools, libraries and technologies that allow you to build a web application.
Flask-SQLAlchemy what is it used for?
Is for database connection pooling and object / relational mapper
ORM
Object–relational mapping - technique for converting data between a relational database and object-oriented programming language. Flask-SQLAlchemy is an example of object/relational mapper.
Object-Relational Mapping (ORM) is a technique that lets you query and manipulates data from a database using an object-oriented paradigm. An ORM library is a completely ordinary library written in your language of choice that encapsulates the code needed to manipulate the data, so you don’t use SQL anymore, you interact directly with an object in the same language you’re using.
Flask-SQLAlchemy is an extension for Flask that adds support for SQLAlchemy to your application.
In the main python file of your app, you’ll see information like this:
_cwd = dirname(abspath(__file__))
SECRET_KEY = ‘flask-session-insecure-secret-key’
SQLALCHEMY_DATABASE_URI = ‘sqlite:///’ + join(_cwd, ‘flask-tracking.db’)
SQLALCHEMY_ECHO = True
WTF_CSRF_SECRET_KEY = ‘this-is-not-random-but-it-should-be’
app = Flask(__name__)
app.config.from_object(__name__)
db = SQLAlchemy(app)
what do these lines mean?
SECRET_KEY = is used to sign session cookies for protection against cookie data tampering. It’s very important that an attacker doesn’t know the value of this secret key.
SQLALCHEMY_DATABASE_URI = is the path to our database (we are using SQLite)
WTF_CSRF_SECRET_KEY = is used to sign WTForms’ CSRF tokens.
app = Flask(__name__)
app.config.from_object(__name__)
Above initialize a new Flask application and tell it to configure itself (with our app.config.from_object call)
db = SQLAlchemy(app) here we initialize our Flask-SQLAlchemy extension with our application.
Podsumowując:
aby startując aplikację we Flasku musimy:
- ją zanicjować app = Flask(__name__),
- wskazać na bazę danych jakiej będziemy używać (np. SQLAlchemy),
- podać ścieżkędla tej bazy w naszym projekcie
oraz
- podać SECRET_KEY do podpisywania sesji ciasteczek (ochrona przed ich zewnętrzną manipulacją)
a także
- podać WTF_SECRET_KEY dla formularzy internetowych, które będziemy chcieli bezpiecznie renderować w naszej aplikacji.
CSRF
Cross-Site Request Forgery (fałszowanie żądań HTTP między stronami)
A CSRF attack forces a logged-on victim’s browser to send a forged HTTP request, including the victim’s session cookie and any other automatically included authentication information, to a vulnerable web application. This allows the attacker to force the victim’s browser to generate requests the vulnerable application thinks are legitimate requests from the victim.
Oprócz głownego pliku zawierającego konfigurację naszej aplikacji (
inicjację aplikacji app = Flask(__name__), SECRET_KEY dla cookies session, wskazanie bazy danych i jej ścieżk oraz secret key dla WTF Forms
)
musimy również stworzyć (wymień 3 pliki konieczne dla działania aplikacji)
- models.py
Model to klasa reprezentująca tabelę w bazie danych, w której każdy atrybut klasy jest polem tej tabeli. - forms.py
plik z formularzami służy do pobierania danych od użytkownika w odpowiednim formacie (tak aby te dane można było wpisać potem do tabeli)
Formularz jest podstawowym elementem umożliwiającym interakcję użytkownika z naszą aplikacją internetową. Formularze operują na klasach, których instancje to wpisy od użytkowników.
- routes.py
tutaj znajdują się endpointy (końcówki adresów) dostępne w naszej aplikacji
In the following example of creating a model in Flask:
Please translate for human this snippet line by line:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config[‘SQLALCHEMY_DATABASE_URI’]=’mysql://root:root@localhost/demo’
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def \_\_repr\_\_(self): return '<User %r>' % self.usern
Importujemy Flask oraz Flask SQL Alchemy
Inicjujemy aplikację + określamy jej konfigurację. Wskazujemy też, że baza danych to będzie SQL
Tworzymy klasę definiującą model:
class User(db.Model):
Klasa reprezentuje tabelę, w której każde pole to atrybut tej klasy.
Określamy jak mają wyglądać pola tej tabeli:
db.Column - definiuje jakie mamy mieć kolumny w tej tabeli, tu mamy takie kolumny jak id, username
db.Integer, db.String - deginiuje jakiego typu dane będą storowane w tej tabeli np. w kolumnę id będziemy wpisywać integery, a w kolumnę username będziemy wpisywać stringi
primary_key=True każdy kolejny rekord w tabeli ma swój unikatowy identyfikator
unique=True nie możemy wpisywać kilka razy tych samych dany
nullable=True oznacza, że kolumna może pozostać pusta
W modelach możemy deklarować parent, child tables oraz deklarować relacje pomiędzy różnymi tabelami np. One-to-Many Relationships
Jinja
is an template engine that allows data to be passed between backend and frontend
What is a development server? This kind of server is is available in Flask.
Flask provides a run command to run the application with a development server. In debug mode, this server provides an interactive debugger and will reload when code is changed. Warning. Do not use the development server when deploying to production.
Flask support secure cookies. Why?
because cookies are essentially trackers that remember use user information
The first step to every flask application is to import the _______
The next step is to create ______
Then we can finish, the app by defining route of our website. We use _____ decorator to do this
odp1 flask class,
from flask import Flask
odp 2 an instance of the Flask class,
app = Flask(__name__)
odp 3 @app.route decorator,
@app.route(“/”):
def hello_world():
return “Hello world. This is my app”
What if statement should be at the end of the main app file (necessary for the app to run)?
if __name__ == “ __main__”:
app.run(host=”0.0.0.0”, debug=True)
This is basically just saying, if this app is inside the main directory (if __name__ == “ __main__”)
Then we run the app (app.run()) with some variables:
- host default value for address
eg. in this case we will run our website on local host http://0.0.0.0.5000
- debug= True (debugging refreshes the server for you whenever you make the change.
So you wouldn’t have to stop the server, save the file, restart your server just to see any changes)
How to add a variable section to a URL of your Flask application?
by using <> brackets for your variable
e.g
@app.route(“/user/<username>")
def user(username):
return f"Welcome user "</username>
to do this we need to import :
from, markupsafe import escape
Web applications use different _____ _________ when accessing URL
HTTP methods