前言
待業家中繼續學習。
Flask 項目結構
my_flask_app/
│
├── app/
│ ├── __init__.py
│ ├── routes/ -- 將不同功能模塊的路由分開管理
│ │ ├── __init__.py
│ │ ├── main.py -- 主模塊的路由
│ │ └── auth.py -- 認證相關的路由
│ ├── models/ -- 管理數據模型,通常與數據操作相關
│ │ ├── __init__.py
│ │ └── user.py -- 用戶模型
│ ├── templates/ -- 存放 HTML 模板文件
│ │ ├── layout.html -- 布局相關
│ │ └── home.html
│ └── static/ -- 存放靜態文件,如CSS和JavaScript
│ ├── css/
│ └── js/
│
├── config.py -- 配置文件,包含應用的配置信息
├── requirements.txt -- 列出項目的依賴庫
├── migrations/
│ └── ...
└── run.py -- 用于啟動Flask應用
如何在Trae IDE中配置Python解釋器
看到app.py
報錯,因為沒有導入flask
庫,但我的設備已經安裝了,所以應該是需要配置下。在設置中找半天沒有找到,后來搜索才知道原來是在Editor
中,搜索python,然后將 Python: Default Interpreter Path
的路徑設置為設備安裝的路徑。
藏的有點深,可能從產品的角度上看是不想局限在某種語言,可以在Editor
設置的說明文案部分增加編譯器,解釋器。
路由
Flask 路由是Flask應用的核心部分,用于處理不同URL的請求,并將請求的處理委托給相應的視圖函數
路由的相關說明
- 定義路由: 使用 @app.route(‘/path’) 裝飾器定義URL和視圖函數的映射。
- 路由參數: 通過動態部分在URL中傳遞參數的類型
- 路由規則: 使用類型轉換器指定URL參數的類型
- 請求方法: 指定允許的HTTP請求方法。(GET,POST,DELETE,PUT)
- 路由函數返回: 視圖函數可以返回不同類型的響應
- 靜態文件和模板: 管理靜態文件和動態渲染 HTML 模板
- 路由優先級: 確保路由順序正確,以避免意外的匹配結果
定義路由
from flask import Flaskapp = Flask(__name__)@app.route('/') # 裝飾器,用于定義路由。/ 表示根 URL
def home(): return 'Welcome to the Home Page!'if __name__ == '__main__':app.run(debug=True)
路由參數
...
@app.route('/greet/<name>') # 動態路由,<name> 是一個變量
def greet(name):return f'Hello, {name}!'if __name__ == '__main__':app.run(debug=True)
路由規則
路由規則支持不同
- 字符串(默認): 匹配任意字符串
- 整數(int:name): 匹配整數值
- 浮點數float:value): 匹配浮點數值
- path(path:name): 匹配任意字符,包括斜桿/
# 訪問/user/1 能正常輸出User ID:1
@app.route('/user/<int:user_id>')
def user_profile(user_id):return f'User ID: {user_id}'# 訪問/user/1 能正常輸出User ID:1
@app.route('/user/<user_id>')
def user_profile(user_id):return f'User ID: {user_id}'# 訪問/user/1 int和user_id同時存在時走int
@app.route('/user/<user_id>')
def user_profile2(user_id):return f'User ID2: {user_id}'# 換成float,訪問/user/1
# Not Found
# The requested URL was not found on the server. If you entered the URL # manually please check your spelling and try again.
@app.route('/user/<float:user_id>')
def user_profile(user_id):return f'User ID: {user_id}'
請求方法
Flask 路由支持不同的 HTTP 請求方法,如 GET、POST、PUT、DELETE 等。可以通過 methods 參數指定允許的請求方法。
@app.route('/submit', methods=['POST'])
def submit():return 'Form submitted!'
此時設置了是POST請求,如果用Trae自帶的瀏覽器訪問,因為實際是GET請求,會報405錯誤碼不允許
使用postman發送post請求驗證能獲得正常的返回
路由函數返回
- 字符串: 返回純文本響應
- HTML: 返回HTML頁面
- JSON: 返回JSON數據
- Response對象: 自定義響應
from flask import jsonify, Response@app.route('/json')
def json_response():data = {'key': 'value'}return jsonify(data)@app.route('/custom')
def custom_response():response = Response('Custom response with headers', status=200)response.headers['X-Custom-Header'] = 'Value'return response
返回json
返回自定義響應
靜態文件和模板
靜態文件(如 CSS、JavaScript、圖片)可以通過 static 路由訪問。模板文件則通過 templates 文件夾組織,用于渲染 HTML 頁面。
styles.css
<link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
p {color: #940f0f;
}
這個格式默認是在找工程下的static目錄下的styles.css
app.py
@app.route('/tutorial02/<name>')
def hello(name):return render_template('02.html', name=name)
02.html
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}"><title>02</title>
</head>
<body><h1>02</h1><p>{{ name }}</p>
</body>
</html>
路由優先級
Flask 按照定義的順序匹配路由,第一個匹配成功的路由將被處理。確保更具體的路由放在更一般的路由之前。
@app.route('/user/<int:user_id>')
def user_profile(user_id):return f'User ID: {user_id}'@app.route('/user')
def user_list():return 'User List'
/user/123
將匹配到 /user/<int:user_id>
,而 /user 將匹配到 user_list
。
參考
- Flask項目結構
- Flask路由