Flask框架入門與實踐

Flask框架入門與實踐

Flask是一個輕量級的Python Web框架,以其簡潔、靈活和易于上手的特點深受開發者喜愛。本文將帶您深入了解Flask的核心概念、基本用法以及實際應用。

什么是Flask?

Flask是由Armin Ronacher于2010年開發的微型Web框架。與Django等大型框架不同,Flask堅持"微核心"的設計理念,只提供Web開發最核心的功能,其他功能通過擴展來實現。這種設計使得Flask既保持了簡單性,又具有極高的靈活性。

Flask的特點

1. 輕量級

Flask的核心代碼非常精簡,不包含數據庫抽象層、表單驗證等功能,讓開發者可以根據項目需求自由選擇組件。

2. 靈活性高

Flask不會對項目結構做過多限制,開發者可以按照自己的方式組織代碼,適合各種規模的項目。

3. 易于學習

Flask的API設計簡潔直觀,文檔完善,新手可以快速上手。

4. 擴展豐富

Flask擁有龐大的擴展生態系統,如Flask-SQLAlchemy、Flask-Login、Flask-RESTful等,可以輕松添加各種功能。

快速開始

安裝Flask

pip install flask

創建第一個Flask應用

from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return '歡迎來到Flask的世界!'@app.route('/user/<name>')
def user(name):return f'你好,{name}!'if __name__ == '__main__':app.run(debug=True)

運行上述代碼后,訪問 http://localhost:5000 即可看到歡迎信息。

Flask核心概念

1. 路由(Routing)

路由用于將URL映射到Python函數。Flask使用裝飾器來定義路由:

@app.route('/about')
def about():return '關于我們'# 支持不同的HTTP方法
@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':# 處理登錄邏輯passreturn render_template('login.html')

2. 模板(Templates)

Flask使用Jinja2模板引擎來渲染HTML頁面:

from flask import render_template@app.route('/profile/<username>')
def profile(username):return render_template('profile.html', name=username)

對應的模板文件 templates/profile.html

<!DOCTYPE html>
<html>
<head><title>用戶資料</title>
</head>
<body><h1>歡迎,{{ name }}!</h1>
</body>
</html>

3. 請求處理

Flask提供了方便的請求對象來處理HTTP請求:

from flask import request@app.route('/submit', methods=['POST'])
def submit():# 獲取表單數據username = request.form.get('username')# 獲取查詢參數page = request.args.get('page', 1)# 獲取JSON數據data = request.get_json()return '數據已接收'

4. 響應處理

可以自定義響應內容、狀態碼和頭部信息:

from flask import make_response, jsonify@app.route('/api/data')
def api_data():data = {'name': 'Flask', 'version': '2.0'}return jsonify(data)@app.route('/custom')
def custom_response():resp = make_response('自定義響應', 200)resp.headers['X-Custom-Header'] = 'Value'return resp

實戰示例:構建一個簡單的博客系統

下面是一個簡單博客系統的基本結構:

from flask import Flask, render_template, request, redirect, url_for
from datetime import datetimeapp = Flask(__name__)# 模擬數據庫
posts = []@app.route('/')
def index():return render_template('index.html', posts=posts)@app.route('/post/new', methods=['GET', 'POST'])
def new_post():if request.method == 'POST':title = request.form.get('title')content = request.form.get('content')post = {'id': len(posts) + 1,'title': title,'content': content,'created_at': datetime.now()}posts.append(post)return redirect(url_for('index'))return render_template('new_post.html')@app.route('/post/<int:post_id>')
def view_post(post_id):post = next((p for p in posts if p['id'] == post_id), None)if post:return render_template('post.html', post=post)return '文章不存在', 404

Flask擴展推薦

1. 數據庫操作

  • Flask-SQLAlchemy: ORM工具,簡化數據庫操作
  • Flask-Migrate: 數據庫遷移工具

2. 用戶認證

  • Flask-Login: 用戶登錄管理
  • Flask-Security: 完整的安全解決方案

3. API開發

  • Flask-RESTful: RESTful API開發
  • Flask-CORS: 處理跨域請求

4. 表單處理

  • Flask-WTF: 表單驗證和CSRF保護

部署Flask應用

開發環境

if __name__ == '__main__':app.run(debug=True)

生產環境

推薦使用WSGI服務器,如Gunicorn:

pip install gunicorn
gunicorn -w 4 -b 127.0.0.1:8000 app:app

配合Nginx作為反向代理:

server {listen 80;server_name example.com;location / {proxy_pass http://127.0.0.1:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

最佳實踐

1. 項目結構

對于大型項目,建議采用以下結構:

myapp/
├── app/
│   ├── __init__.py
│   ├── models.py
│   ├── views.py
│   └── templates/
├── config.py
├── requirements.txt
└── run.py

2. 配置管理

將配置與代碼分離:

# config.py
class Config:SECRET_KEY = 'your-secret-key'DATABASE_URI = 'sqlite:///db.sqlite'# app.py
app.config.from_object(Config)

3. 錯誤處理

自定義錯誤頁面:

@app.errorhandler(404)
def not_found(error):return render_template('404.html'), 404@app.errorhandler(500)
def internal_error(error):return render_template('500.html'), 500

4. 日志記錄

配置日志系統:

import logging
from logging.handlers import RotatingFileHandlerif not app.debug:file_handler = RotatingFileHandler('logs/app.log', maxBytes=10240, backupCount=10)file_handler.setLevel(logging.INFO)app.logger.addHandler(file_handler)

總結

Flask是一個優秀的Web框架,它的簡單性和靈活性使其成為Python Web開發的首選之一。無論是構建小型應用還是大型項目,Flask都能勝任。通過本文的介紹,相信您已經對Flask有了基本的了解。

Flask的學習曲線平緩,但要精通它需要不斷實踐。建議從簡單的項目開始,逐步深入了解Flask的高級特性和最佳實踐。隨著經驗的積累,您將能夠充分發揮Flask的潛力,構建出高效、可維護的Web應用。

記住,Flask的哲學是"微核心,可擴展"。它給了你選擇的自由,讓你可以根據項目需求靈活地構建應用。享受Flask帶來的開發樂趣吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83269.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83269.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83269.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數學復習筆記 14

前言 和家里人交流了一下&#xff0c;他們還是希望我全力以赴初試&#xff0c;我確實也得放開了干&#xff0c;不要束手束腳的。好好加油。感覺公共課都沒有啥壓力&#xff0c;主要是專業課要好好加油&#xff0c;真不能過不了線&#xff0c;要是過不了線&#xff0c;啥都白搭…

金格iWebOffice控件在新版谷歌Chrome中不能加載了怎么辦?

金格iWebOffice控件是由江西金格網絡科技有限責任公司開發的中間件軟件&#xff0c;主要用于在瀏覽器中直接編輯Word、Excel、PowerPoint等Office文檔&#xff0c;曾經是一款優秀國產的WebOffice插件。 由于2022年Chrome等瀏覽器取消支持PPAPI接口&#xff0c;導致這款金格iWe…

ChatGPT 能“記住上文”的原因

原因如下 你把對話歷史傳給了它 每次調用 OpenAI 接口時&#xff0c;都會把之前的對話作為參數傳入&#xff08;messages 列表&#xff09;&#xff0c;模型“看見”了之前你說了什么。 它沒有長期記憶 它不會自動記住你是誰或你說過什么&#xff0c;除非你手動保存歷史并再次…

微信小程序van-dialog確認驗證失敗時阻止對話框的關閉

使用官方(Vant Weapp - 輕量、可靠的小程序 UI 組件庫)的before-close&#xff1a; wxml&#xff1a; <van-dialog use-slot title"名稱" show"{{ show }}" show-cancel-button bind:cancel"onClose" bind:confirm"getBackInfo"…

K8S Ingress、IngressController 快速開始

假設有如下三個節點的 K8S 集群&#xff1a; ? k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、理論介紹 1&#xff09;什么是 Ingress 定義&#xff1a;Ingress 是 Kubernetes 中的一種資源對象&#xff0c;它定義了外部訪問集群內…

Vue3 + Element Plus 動態表單實現

完整代碼 <template><div class"dynamic-form-container"><el-formref"dynamicFormRef":model"formData":rules"formRules"label-width"auto"label-position"top"v-loading"loading"&g…

Mac修改hosts文件方法

Mac修改hosts文件方法 在 macOS 上修改 hosts 文件需要管理員權限 步驟 1&#xff1a;打開終端 通過 Spotlight 搜索&#xff08;Command 空格&#xff09;輸入 Terminal&#xff0c;回車打開。或進入 應用程序 > 實用工具 > 終端。 步驟 2&#xff1a;備份 hosts 文件…

深度學習—BP神經網絡

文章目錄 [TOC](文章目錄) 一、基本概念二、 網絡結構三、BP神經網絡的原理總結特點&#xff1a;應用場景優缺點 一、基本概念 BP 神經網絡&#xff08;Backpropagation Neural Network&#xff09;是一種基于誤差反向傳播算法的多層前饋神經網絡&#xff0c;由輸入層、隱藏層…

Spring AI(6)——向量存儲

向量數據庫是一種特殊類型的數據庫&#xff0c;在 AI 應用中發揮著至關重要的作用。 在向量數據庫中&#xff0c;查詢與傳統關系型數據庫不同。它們執行的是相似性搜索&#xff0c;而非精確匹配。當給定一個向量作為查詢時&#xff0c;向量數據庫會返回與該查詢向量“相似”的…

Qt功能區:簡介與安裝

Qt功能區 1. 功能區簡介2. SARibbon2.1 簡介2.2 編譯與安裝采用CMake-gui進行編譯采用VS進行編譯安裝與使用 Qt 官方不支持 Ribbon 風格&#xff08;Ribbon UI 風格是微軟開創的&#xff0c;具有專利許可協議&#xff0c;許可協議對從構建 UI 的指令到每個按鈕間的空格數都做了…

iOS safari和android chrome開啟網頁調試與檢查器的方法

手機開啟遠程調試教程&#xff08;適用于 Chrome / Safari&#xff09; 前端移動端調試指南&#xff5c;適用 iPhone 和 Android&#xff5c;WebDebugX 出品 本教程將詳細介紹如何在 iPhone 和 Android 手機上開啟網頁檢查器&#xff0c;配合 WebDebugX 實現遠程調試。教程包含…

Golang企業級商城高并發微服務實戰

Golang企業級商城高并發微服務實戰包含內容介紹&#xff1a; 從零開始講了百萬級單體高并發架構、千萬級微服務架構&#xff0c;其中包含Rpc實現微服務、微服務的跨語言調用jsonrpc和protobuf、protobuf的安裝、protobuf高級語法、protobuf結合Grpc實現微服務實戰、微服務服務…

實現可靠的 WebSocket 連接:心跳與自動重連的最佳實踐

概覽 本文將手把手教你如何從零編寫一個可用于直播或在線聊天的 WSocket 類&#xff0c;依次實現連接建立、心跳檢測、斷線重連、消息收發以及資源清理等功能。我們將結合 WebSocket API 的標準用法、心跳保持 和 重連策略&#xff0c;并充分運用現代 JavaScript 語法&#xf…

UEFI Spec 學習筆記---33 - Human Interface Infrastructure Overview(1)

33 - Human Interface Infrastructure Overview 本章節主要用于介紹Human Interface Infrastructure&#xff08;HII&#xff09;架構介紹&#xff0c;描述如何通過 HII 來管理用戶的輸入&#xff0c;以及描述在 UEFI spec 中涉及 HII 相關的 Protocol、function 和類型定義。…

ip命令詳解

控制網卡的硬件狀態 ip link set ens36 down ip link set ens36 up 修改網卡名稱&#xff08;臨時&#xff09; ip link set ens36 down ip link set ens36 name xxx 修改網卡的mac地址 ip link set ens36 down ip link set xxx name ens36 查看ip的addr ip addr show ip ad…

hadoop中了解yarm

Hadoop中的YARN&#xff08;Yet Another Resource Negotiator&#xff09;是一種新的Hadoop資源管理器&#xff0c;是一個通用資源管理系統&#xff0c;可為上層應用提供統一的資源管理和調度。以下是其相關介紹&#xff1a; 核心思想 將JobTracker的資源管理和作業調度/監控功…

做好的QT軟件,換一個筆記本打開后發現字體很小,部分字體還被控件遮擋

出現這種情況的原因主要是屏幕的DPI&#xff08;每英寸點數&#xff09;不同。Qt中控件的大小單位為像素&#xff0c;在高DPI下&#xff0c;控件會變小&#xff0c;低DPI下控件會變大。而Qt中字體的單位默認為磅&#xff0c;無論在什么顯示器上顯示同一磅值的字體&#xff0c;其…

linux - 權限的概念

目錄 用戶權限 超級用戶與普通用戶的區別 超級用戶&#xff08;root&#xff09;&#xff1a; 普通用戶&#xff1a; 切換用戶身份 使用sudo執行高權限命令 用戶管理 用戶組管理 文件權限 文件訪問者類別 基本權限 權限表示方法 權限修改 chmod chown chgrp u…

Python函數返回值的藝術:為何True/False是更優實踐及例外情況分析

在Python編程實踐中&#xff0c;子程序的返回值設計往往是一個容易被忽視但卻至關重要的設計決策。本文將深入探討為什么返回True/False往往是更好的選擇&#xff0c;何時應該避免這種做法&#xff0c;以及如何處理與None值相關的問題。 為什么返回True/False是更好的實踐&…

STM32單片機內存分配詳細講解

單片機的內存無非就兩種&#xff0c;內部FLASH和SRAM&#xff0c;最多再加上一個外部的FLASH拓展。在這里我以STM32F103C8T6為例子講解FLASH和SRAM。 STM32F103C8T6具有64KB的閃存和20KB的SRAM。 一. Flash 1.1 定義 非易失性存儲器&#xff0c;即使在斷電后&#xff0c;其所…