flask功能使用總結和完整示例

Flask 功能使用總結與完整示例

一、Flask 核心功能總結

Flask 是輕量級 Web 框架,核心功能包括:

  • 路由系統:通過 ?@app.route? 裝飾器定義 URL 與函數的映射。
  • 模板引擎:默認使用 Jinja2,支持動態渲染 HTML。
  • 請求處理:獲取請求參數、表單數據、文件上傳等。
  • 響應處理:返回 JSON、HTML、重定向等。
  • 會話管理:通過 ?session? 對象存儲用戶狀態。
  • 擴展支持:可集成 Flask-SQLAlchemy(數據庫)、Flask-RESTful(API)等擴展。

二、完整示例:簡易待辦事項應用

以下是一個包含用戶認證、待辦事項管理的 Flask 應用示例:

from flask import Flask, render_template, request, redirect, url_for, session, jsonify
from flask_sqlalchemy import SQLAlchemy
import datetime
import uuid

初始化應用

app = Flask(name)
app.secret_key = ‘your_secret_key’ # 用于會話加密
app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite:///todo_app.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)
password = db.Column(db.String(120), nullable=False)
todos = db.relationship(‘Todo’, backref=‘user’, lazy=True)

class Todo(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
description = db.Column(db.Text)
due_date = db.Column(db.DateTime)
completed = db.Column(db.Boolean, default=False)
user_id = db.Column(db.Integer, db.ForeignKey(‘user.id’), nullable=False)

創建數據庫表

with app.app_context():
db.create_all()

路由:首頁 - 重定向到登錄頁

@app.route(’/’)
def index():
if ‘user_id’ in session:
return redirect(url_for(‘todo_list’))
return redirect(url_for(‘login’))

路由:登錄頁

@app.route(’/login’, methods=[‘GET’, ‘POST’])
def login():
if request.method == ‘POST’:
username = request.form.get(‘username’)
password = request.form.get(‘password’)

    user = User.query.filter_by(username=username).first()if user and user.password == password:  # 實際應用中應使用密碼哈希session['user_id'] = user.idreturn redirect(url_for('todo_list'))return render_template('login.html', error='用戶名或密碼錯誤')
return render_template('login.html')

路由:注冊頁

@app.route(’/register’, methods=[‘GET’, ‘POST’])
def register():
if request.method == ‘POST’:
username = request.form.get(‘username’)
password = request.form.get(‘password’)

    # 檢查用戶是否存在if User.query.filter_by(username=username).first():return render_template('register.html', error='用戶名已存在')# 創建新用戶new_user = User(username=username, password=password)db.session.add(new_user)db.session.commit()return redirect(url_for('login'))
return render_template('register.html')

路由:待辦事項列表

@app.route(’/todos’)
def todo_list():
if ‘user_id’ not in session:
return redirect(url_for(‘login’))

user = User.query.get(session['user_id'])
todos = Todo.query.filter_by(user_id=session['user_id']).all()
return render_template('todo_list.html', user=user, todos=todos)

路由:添加待辦事項

@app.route(’/todos/add’, methods=[‘GET’, ‘POST’])
def add_todo():
if ‘user_id’ not in session:
return redirect(url_for(‘login’))

if request.method == 'POST':title = request.form.get('title')description = request.form.get('description')due_date_str = request.form.get('due_date')due_date = Noneif due_date_str:due_date = datetime.datetime.strptime(due_date_str, '%Y-%m-%d')new_todo = Todo(title=title,description=description,due_date=due_date,user_id=session['user_id'])db.session.add(new_todo)db.session.commit()return redirect(url_for('todo_list'))return render_template('add_todo.html')

路由:更新待辦事項狀態

@app.route(’/todos/int:todo_id/toggle’, methods=[‘POST’])
def toggle_todo(todo_id):
if ‘user_id’ not in session:
return jsonify({‘status’: ‘error’, ‘message’: ‘未登錄’})

todo = Todo.query.filter_by(id=todo_id, user_id=session['user_id']).first()
if not todo:return jsonify({'status': 'error', 'message': '待辦事項不存在'})todo.completed = not todo.completed
db.session.commit()
return jsonify({'status': 'success', 'completed': todo.completed})

路由:登出

@app.route(’/logout’)
def logout():
session.clear()
return redirect(url_for(‘login’))

啟動應用

if name == ‘main’:
app.run(debug=True)

三、模板文件示例

假設模板文件存放在 ?templates? 目錄下:

  1. login.html
登錄 - 待辦事項應用

登錄

{% if error %}
{{ error }}
{% endif %}

登錄 注冊新賬戶 ?
  1. todo_list.html
待辦事項 - {?{ user.username }}

我的待辦事項

添加待辦 登出
<ul>{% for todo in todos %}<li><input type="checkbox" onchange="toggleTodo({{ todo.id }})" {% if todo.completed %}checked{% endif %}><span style="text-decoration: {% if todo.completed %}line-through{% endif %}">{{ todo.title }}</span>{% if todo.due_date %}<span style="color: {% if todo.due_date < now and not todo.completed %}red{% else %}green{% endif %}">(截止: {{ todo.due_date.strftime('%Y-%m-%d') }})</span>{% endif %}</li>{% else %}<li>暫無待辦事項,點擊"添加待辦"創建</li>{% endfor %}
</ul><script>function toggleTodo(todoId) {fetch(`/todos/${todoId}/toggle`, {method: 'POST'}).then(response => response.json()).then(data => {if (data.status !== 'success') {alert(data.message);}});}
</script>
?

四、功能說明

1.?用戶認證:

  • 注冊新用戶并存儲到數據庫。
  • 登錄后通過會話(session)保持用戶狀態。
    2.?待辦事項管理:
  • 列表展示:顯示所有待辦事項及完成狀態。
  • 添加功能:支持標題、描述、截止日期。
  • 狀態更新:通過 AJAX 異步切換完成狀態。
    3.?技術要點:
  • 路由設計:RESTful 風格 URL。
  • 數據庫操作:使用 SQLAlchemy ORM。
  • 模板渲染:Jinja2 動態生成 HTML。
  • 會話管理:Flask 內置 session 對象。

五、運行與擴展

1.?運行方式:
pip install flask flask-sqlalchemy
python app.py

訪問 ?http://127.0.0.1:5000? 使用應用。
2.?擴展方向:

  • 添加密碼哈希(如 bcrypt)增強安全性。
  • 集成 Flask-RESTful 提供 API 接口。
  • 使用 Flask-Migrate 管理數據庫遷移。
  • 添加文件上傳、用戶頭像等功能。

通過以上示例,可快速掌握 Flask 的核心功能和項目結構,適用于中小型 Web 應用開發。

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

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

相關文章

HarmonyOS應用基礎階段- 09、綜合案例-仿攜程旅行口碑榜

文章目錄 攜程-口碑榜1、banner 區域1.1 區域部分1.2 口碑榜 Logo1.3 推薦榜單1.4 評分規則1.5 底部 Line 2、選擇城市和目的地2.1 區域布局2.2 選擇城市2.3 口碑目的地 3、商業選項菜單4、熱門項目選項4.1 區域布局4.2 熱門標題4.3 選項 5、熱門榜標題6、熱門景點列表6.1 區域…

中小制造企業轉型:低成本國產工業軟件替代方案實踐

在數字經濟浪潮席卷全球的當下&#xff0c;制造業數字化轉型已成為企業提升競爭力、實現可持續發展的必由之路。然而&#xff0c;高昂的成本與復雜的技術門檻&#xff0c;卻讓眾多中小制造企業陷入 “不能轉、不想轉、不會轉、不敢轉” 的困局。幸運的是&#xff0c;一批具有自…

Kafka 核心架構與消息模型深度解析(二)

案例實戰&#xff1a;Kafka 在實際場景中的應用 &#xff08;一&#xff09;案例背景與需求介紹 假設我們正在為一個大型電商平臺構建數據處理系統。該電商平臺擁有龐大的用戶群體&#xff0c;每天會產生海量的訂單數據、用戶行為數據&#xff08;如瀏覽、點擊、收藏等&#…

【iOS】cache_t分析

前言 之前分析類的結構的時候&#xff0c;有遇到一個cache_t&#xff0c;當時說是用來保存方法緩存的結構&#xff0c;這篇文章來從源碼詳細介紹一下cache_t 概覽cache_t cache_t結構 類在底層的結構如之前所述&#xff0c;存在著cache_t屬性&#xff0c;而cache_t的結構如下…

java面試題:List如何排序?內存溢出/OOM怎么回事?如何排查和解決?

List如何排序 List排序可以通過實現Comparable接口并且實現compareTo方法&#xff0c;或者傳入comparator去實現排序。 內存溢出/OOM是怎么回事&#xff1f; 內存溢出就是程序在運行的過程中&#xff0c;申請的內存超過了最大內存限制&#xff0c;導致JVM拋出OOM異常&#x…

Python cryptography【密碼庫】庫功能與使用指南

邊寫代碼零食不停口 盼盼麥香雞味塊 、卡樂比&#xff08;Calbee&#xff09;薯條三兄弟 獨立小包、好時kisses多口味巧克力糖、老金磨方【黑金系列】黑芝麻丸 邊寫代碼邊貼面膜 事業美麗兩不誤 DR. YS 野森博士【AOUFSE/澳芙雪特證】377專研美白淡斑面膜組合 優惠劵 別光顧寫…

第二十四章 流程控制_ if分支

第二十四章 流程控制: if分支和輸入 正如許多編程語言一樣Shell也有自己的條件分支語句。有時需要根據情況進行相應的處理&#xff0c;因此可以通過條件分支語句實現&#xff0c;本章主要介紹的是if分支語句。 if語句 在Shell中if語句語法格式如下&#xff1a; if commands…

電腦網絡重置,找不到原先自家的WIFI,手機還能正常連接并上網

問題排查&#xff1a;1、電腦感覺網絡太慢&#xff0c;因此打算點擊了網絡重置 2、點擊提示會刪除網絡&#xff0c;在五分鐘后關機重啟 3、從設備管理器設備的無線wifi屬性-事件中發現刪除記錄 4、選擇更新驅動程序 5、從列表中選取 6、更改回老驅動版本 備選方案&#…

C語言_預處理詳解

1. 預定義符號 C語言設置了一些預定義符號&#xff0c;可以直接使用&#xff0c;預定義符號也是在預處理期間處理的 1 __FILE__ //進行編譯的源文件 2 __LINE__//文件當前的行號 3 __DATE__ //文件被編譯的日期 4 __TIME__//文件被編譯的時間 5 __STDC__//如果編譯器遵循ANSI…

【QT】使用QT幫助手冊找控件樣式

選擇幫助—》輸入stylesheet(小寫)—》選擇stylesheet—》右側選擇Qt Style Sheets Reference 2.使用CtrlF—》輸入要搜索的控件—》點擊Customizing QScrollBar 3.顯示參考樣式表–》即可放入QT-designer的樣式表中

SQL知識合集(二):函數篇

TRIM函數 作用&#xff1a;去掉字符串前后的空格 SELECT * FROM your_table_name WHERE TRIM(column_name) ; COALESCE函數 作用&#xff1a;返回其參數中的第一個非 NULL 值。它可以接受多個參數&#xff0c;并從左到右依次評估這些參數&#xff0c;直到找到第一個非 NUL…

Cursor 工具項目構建指南: Uniapp Miniprogram 環境下的 Prompt Rules 約束

簡簡單單 Online zuozuo: 簡簡單單 Online zuozuo 簡簡單單 Online zuozuo 簡簡單單 Online zuozuo 簡簡單單 Online zuozuo :本心、輸入輸出、結果 簡簡單單 Online zuozuo : 文章目錄 Cursor 工具項目構建指南: Uniapp Miniprogram 環境下的 Prompt Rules 約束前言項目簡…

Java轉Go日記(六十):gin其他常用知識

1. 日志文件 package mainimport ("io""os""github.com/gin-gonic/gin" )func main() {gin.DisableConsoleColor()// Logging to a file.f, _ : os.Create("gin.log")gin.DefaultWriter io.MultiWriter(f)// 如果需要同時將日志寫入…

cocos單例工廠和自動裝配

cocos單例工廠和自動裝配 1 單例工廠 1.1 分析 實例字典 原理很簡單&#xff0c;只是一個map&#xff0c;確保每個類只保留一個實例&#xff1b; private static _instances new Map<string, any>();獲取與存儲實例 這邊使用的方式是生成一個唯一的id存儲在類上&…

django paramiko 跳轉登錄

在使用Django框架結合Paramiko進行SSH遠程操作時&#xff0c;通常涉及到自動化腳本的執行&#xff0c;比如遠程服務器上的命令執行、文件傳輸等。如果你的需求是“跳轉登錄”&#xff0c;即在登錄遠程服務器后&#xff0c;再通過該服務器的SSH連接跳轉到另一臺服務器&#xff0…

《C++初階之類和對象》【命名空間 + 輸入輸出 + 缺省參數 + 函數重載】

【命名空間 輸入&輸出 缺省參數 函數重載】目錄 前言&#xff1a;---------------hello world---------------比較C語言和C的第一個程序&#xff1a;hello word ---------------命名空間---------------什么是命名空間&#xff1f;怎么使用命名空間&#xff1f;怎么定義…

[USACO1.5] 八皇后 Checker Challenge Java

import java.util.*;public class Main {// 標記 對角線1&#xff0c;對角線2&#xff0c;所在x軸 是否存在棋子static boolean[] d1 new boolean[100], d2 new boolean[100], d new boolean[100]; static int n, ans 0;static int[] arr new int[14]; // 記錄一輪棋子位置…

云服務器Xshell登錄拒絕訪問排查

根據你的描述&#xff0c;使用Xshell 8登錄云服務器時顯示“拒絕訪問”&#xff0c;可能涉及多個原因。以下結合搜索結果整理出排查和解決方法&#xff0c;按優先級排序&#xff1a; 一、檢查基礎網絡與端口連通性 本地網絡與服務器IP是否可達 在本地電腦的CMD中執行 ping 服務…

Python爬蟲實戰:研究urlunparse函數相關技術

1. 引言 1.1 研究背景與意義 在當今信息爆炸的時代,互聯網上的數據量呈現出指數級增長。如何從海量的網頁數據中高效地獲取有價值的信息,成為了學術界和工業界共同關注的問題。網絡爬蟲作為一種自動獲取網頁內容的技術,能夠按照預定的規則遍歷互聯網上的網頁,并提取出所需…

Spring AI學習一

隨著Chatpt的火爆&#xff0c;現在Spring官方也開始支持AI了并推出了Spring AI框架&#xff0c;目前還沒發布正式版本&#xff0c;這里可以先看一下官方依賴的版本。 Spring官網地址可以看這里&#xff1a;Spring | Home 目前官網上是有這兩個版本&#xff1a;1.0.0和1.1.0-SN…