Flask開源項目的全面解析

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
AKTJS的頭像AKTJS
上一篇 2025-02-25 18:17
下一篇 2025-02-25 18:17

相關推薦

  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • 掌握magic-api item.import,為你的項目注入靈魂

    你是否曾經想要導入一個模塊,但卻不知道如何實現?又或者,你是否在使用magic-api時遇到了無法導入的問題?那麼,你來到了正確的地方。在本文中,我們將詳細闡述magic-api的…

    編程 2025-04-29
  • 做Python的Flask開發,必須安裝PyCharm

    PyCharm是一款專業的Python集成開發環境(IDE),適用於Flask、Django等Web開發框架,提供了強大的代碼編輯、調試和版本控制等功能,大大提高了開發效率和代碼質…

    編程 2025-04-29
  • Python zscore函數全面解析

    本文將介紹什麼是zscore函數,它在數據分析中的作用以及如何使用Python實現zscore函數,為讀者提供全面的指導。 一、zscore函數的概念 zscore函數是一種用於標…

    編程 2025-04-29
  • 全面解讀數據屬性r/w

    數據屬性r/w是指數據屬性的可讀/可寫性,它在程序設計中扮演着非常重要的角色。下面我們從多個方面對數據屬性r/w進行詳細的闡述。 一、r/w的概念 數據屬性r/w即指數據屬性的可讀…

    編程 2025-04-29
  • Python計算機程序代碼全面介紹

    本文將從多個方面對Python計算機程序代碼進行詳細介紹,包括基礎語法、數據類型、控制語句、函數、模塊及面向對象編程等。 一、基礎語法 Python是一種解釋型、面向對象、動態數據…

    編程 2025-04-29
  • SDN開源組織中ONOS起步最早

    ONOS是一個開源軟件定義網絡(SDN)操作系統,由ON.Lab創建並一直在開發。該平台旨在通過使用網絡虛擬化技術使工程師能夠快速靈活地創建和管理網絡服務。 一、ONOS的優勢 在…

    編程 2025-04-29
  • 如何將Java項目分成Modules並使用Git進行版本控制

    本文將向您展示如何將Java項目分成模塊,並使用Git對它們進行版本控制。分割Java項目可以使其更容易維護和拓展。Git版本控制還可以讓您跟蹤項目的發展並協作開發。 一、為什麼要…

    編程 2025-04-28
  • GitHub好玩的開源項目

    本文旨在介紹GitHub上一些好玩的開源項目,並提供代碼示例供讀者參考和學習。 一、Emoji列表 GitHub上有一份完整的Emoji列表,它支持各種平台和設備,方便用戶在Git…

    編程 2025-04-28
  • Matlab二值圖像全面解析

    本文將全面介紹Matlab二值圖像的相關知識,包括二值圖像的基本原理、如何對二值圖像進行處理、如何從二值圖像中提取信息等等。通過本文的學習,你將能夠掌握Matlab二值圖像的基本操…

    編程 2025-04-28

發表回復

登錄後才能評論