Flask是Python Web開發領域中一個簡單、易上手的Web框架,其源代碼開放且易於擴展,適用於中小型Web應用的開發。Flask基於Werkzeug、Jinja 2 模板引擎等工具構建。在本文中,我們將從多個方面詳細闡述Flask開源項目的優勢特點、基本使用方法,以及其在現代Web應用開發中的應用。
一、起步
1、安裝Flask
Flask的安裝非常簡單,使用pip即可完成,只需在終端輸入以下命令即可:
$ pip install flask
2、第一個Flask程序
我們先來看一個使用Flask框架編寫的最簡單的程序:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
該程序會啟動一個Flask Web應用,並在默認端口 (http://localhost:5000/) 上監聽來自客戶端的請求。當我們在瀏覽器中訪問 http://localhost:5000/ 時,程序將返回”Hello, World!”。
二、URL路由與視圖函數
1、Flask中URL路由的基本定義
路由是指當Web服務器接到一個客戶端請求時,需要將請求指向哪個視圖函數的一條映射規則。Flask中,我們可以使用 @app.route() 裝飾器來對指定的 URL 進行綁定。例如,我們可以編寫以下代碼實現訪問 http://localhost:5000/hello/ 返回”Hello!”的功能:
from flask import Flask
app = Flask(__name__)
@app.route('/hello/')
def hello():
return "Hello!"
2、使用變量規則
你可以通過使用 來為 URL 增加一個可變的部分。Flask 中將 URL 裏面的這些特殊字段用 標註出來。例如,以下代碼為 URL 增加了一個變量name:
from flask import Flask
app = Flask(__name__)
@app.route('/user/')
def user(name):
return f"Hello, {name}!"
三、模板
1、模板的作用與用途
在Web應用程序中,模板通常指的是一種HTML文件,用於將動態數據渲染到用戶端瀏覽器中。Flask可以使用 Jinja2 模板引擎來創建模板。Flask嚴格遵循MVC(Model-View-Controller)模式來構建Web應用程序,而Jinja2模板引擎也正是屬於其中的”視圖”部分。
2、使用模板渲染動態數據
Flask在使用Jinja2模板引擎前,需要先指定好模板的文件夾位置。通常,我們使用 Flask 的構造函數中的 template_folder 參數來指定模板文件所在的目錄:
from flask import Flask, render_template
app = Flask(__name__, template_folder='templates')
@app.route('/user/')
def user(name):
return render_template('user.html', name=name)
接下來,我們可以在模板文件中渲染動態數據:
<html>
<head>
<title>User page</title>
</head>
<body>
Hello, {{ name }}!
</body>
</html>
四、表單
1、用法與作用
表單是Web應用程序中收集用戶輸入的一種HTML元素。在Flask中,我們可以使用Werkzeug的Request對象來獲取表單數據。對於GET請求,數據會出現在URL查詢字符串中(例如http://localhost:5000/login?username=test&password=123),而POST請求則需要從Request對象中獲取。
2、處理POST請求
以下是一個簡單的處理POST請求的程序:
from flask import Flask, request
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def do_login():
username = request.form['username']
password = request.form['password']
if username == 'admin' and password == 'admin':
return f"Hello, {username}!"
else:
return "Invalid login credentials!"
五、ORM
1、Flask_SQLAlchemy
ORM(Object Relation Mapping,對象關係映射)是一種技術,它把數據庫中的表格映射到了程序中的對象上。在Flask中,我們可以使用Flask_SQLAlchemy庫來進行ORM操作。Flask_SQLAlchemy庫是在SQLAlchemy庫的基礎上,增加了Flask特有的一些功能。以下是一個簡單的示例程序:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
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 f"User {self.username}, {self.email}"
2、使用ORM查詢數據
以下代碼是如何使用ORM查詢User表格中的數據:
users = User.query.all()
user = User.query.filter_by(username='admin').first()
六、插件
1、Flask插件介紹
除了jinja2和Werkzeug之外,Flask還提供了大量的擴展,它們可以幫助開發者快速地實現某些功能。例如, Flask-Moment 是一個支持本地化時間的插件, Flask-Misaka 是一個為Markdown提供支持的插件, Flask-Mail 是一個用於發送郵件的插件。Flask插件的安裝方式也很簡單:
$ pip install flask-moment
2、Flask-Moment插件使用示例
以下代碼展示如何在Jinja2模板中使用Flask-Moment插件:
<html>
<head>
...
{{ moment.include_moment() }}
</head>
<body>
...
The current date and time is: {{ moment(format='LLLL') }}
</body>
</html>
七、RESTful API
1、什麼是RESTful API
RESTful API是一種能夠使用HTTP請求(GET、POST、PUT、DELETE等)實現對Web資源進行操作的API。與傳統的WebService不同,RESTful API並不依賴於XML、SOAP等傳輸格式,而是通過自描述的JSON格式進行數據傳輸和交互。
2、使用Flask-RESTful實現RESTful API
Flask-RESTful是基於Flask擴展的庫,旨在幫助開發人員方便地編寫REST APIs。以下代碼展示了如何使用Flask-RESTful實現一個返回當前時間的API:
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class CurrentTime(Resource):
def get(self):
return {'time': datetime.datetime.now()}
api.add_resource(CurrentTime, '/time')
if __name__ == '__main__':
app.run(debug=True)
八、WebSocket
1、什麼是WebSocket
WebSocket是一種協議,允許服務器與客戶端進行雙向通信。相比於HTTP協議,它能夠更加快速地進行數據交互並小幅度減少網絡流量。
2、使用Flask-SocketIO實現WebSocket
Flask-SocketIO是一個在Flask上實現WebSocket的擴展庫。以下代碼展示了如何使用Flask-SocketIO實現一個簡單的聊天室程序:
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('message')
def handle_message(message):
emit('response', message, broadcast=True)
if __name__ == '__main__':
socketio.run(app)
九、分頁
1、處理分頁請求
在Web應用程序中,分頁通常用來將用戶請求的數據分成若干個頁面來顯示。Flask框架提供了一個常用的分頁擴展:Flask-Paginate。向用戶返回分頁數據時,我們需要對用戶請求進行解析。以下代碼展示了如何處理分頁請求:
from flask_paginate import Pagination
@app.route('/paginate')
def paginate():
total = 500
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 10, type=int)
pagination = Pagination(
page=page,
per_page=per_page,
total=total,
css_framework='bootstrap4',
)
return render_template('paginate.html', items=range(total), pagination=pagination)
2、在模板中渲染分頁數據
使用Flask-Paginate渲染分頁數據也非常簡單。在 Flask-Paginate 中,我們需要使用 Pagination 類來定義頁面參數,例如:當前頁面號、每頁顯示條目的數量和頁數。我們還需要使用 render_template() 方法將查詢結果封裝成頁面,然後將參數傳遞到模板中以進行呈現:
{% extends 'base.html' %}
{% block content %}
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
{{ pagination.links }}
{% endblock %}
十、安全
1、Flask-Security
Web應用程序的安全性非常重要,Flask-Security是Flask擴展庫中提供的一種安全增強工具,其支持用戶認證、密碼加密等功能。Flask-Security 解決了實現 Flask 應用時許多常見的安全問題。以下是一個使用 Flask-Security 的示例程序:
from flask import Flask
from flask_security import Security, \
SQLAlchemyUserDatastore, UserMixin, RoleMixin
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/myapp.db'
app.config['SECRET_KEY'] = 'super-secret'
app.config['SECURITY_PASSWORD_HASH'] = 'bcrypt'
app.config['SECURITY_PASSWORD_SALT'] = 'salt'
db = SQLAlchemy(app)
roles_users = db.Table('roles_users',
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)
2、CSRF防護
跨站點請求偽造(CSRF)是一種攻擊方式,它利用Web應用程序已通過認證的用戶身份,在不知情的情況下執行非預期的動作。通過發送帶有 CSRF 令牌的 POST / PUT / DELETE 請求,我們可以快速在 Flask 應用
原創文章,作者:AKTJS,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/361512.html