Python flash URL訪問參數(shù)配置
1. 路徑參數(shù)(Route Parameters)
路徑參數(shù)指的是 URL 路徑中的一部分被當(dāng)作變量傳遞給視圖函數(shù)。
示例
from flask import Flask
app = Flask(__name__)
@app.route('/user/<username>')
def show_user_profile(username):
return f'User: {username}'- 訪問
/user/alice,返回User: alice <username>是路徑參數(shù)
類型轉(zhuǎn)換
可以指定參數(shù)類型:
<int:id>:只匹配整數(shù)<float:score>:只匹配浮點(diǎn)數(shù)<path:subpath>:匹配路徑(可包含/)
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post ID: {post_id}'2. 查詢參數(shù)(Query Parameters)
查詢參數(shù)是 URL 中 ?key=value 的部分,常用于 GET 請(qǐng)求。
示例
from flask import request
@app.route('/search')
def search():
keyword = request.args.get('keyword', '')
page = request.args.get('page', 1)
return f'Search: {keyword}, Page: {page}'訪問 /search?keyword=python&page=2,keyword 和 page 就能從 request.args 獲取。
3. 表單參數(shù)(Form Parameters)
用于 POST 請(qǐng)求,通過表單提交的數(shù)據(jù)。
示例
from flask import request
@app.route('/login', methods=['POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
return f'Logging in: {username}'4. JSON 參數(shù)
用于 POST 請(qǐng)求,客戶端以 JSON 格式發(fā)送數(shù)據(jù)。
示例
from flask import request
@app.route('/api/data', methods=['POST'])
def api_data():
data = request.get_json()
return f'Received: {data}'5. 多參數(shù)/默認(rèn)值/類型轉(zhuǎn)換
request.args.get('key', default, type=type)可以設(shè)置默認(rèn)值和類型- 路徑參數(shù)類型見前文
page = request.args.get('page', 1, type=int)6. 路徑參數(shù)進(jìn)階
多個(gè)參數(shù)
你可以在路由中定義多個(gè)參數(shù):
@app.route('/book/<int:book_id>/chapter/<int:chapter_id>')
def show_chapter(book_id, chapter_id):
return f'Book: {book_id}, Chapter: {chapter_id}'可選參數(shù)
Flask 的路由不支持直接可選參數(shù),但可以通過多個(gè)路由實(shí)現(xiàn):
@app.route('/item/')
@app.route('/item/<int:item_id>')
def show_item(item_id=None):
if item_id:
return f'Item ID: {item_id}'
else:
return 'No Item ID'7. 查詢參數(shù)進(jìn)階
獲取所有參數(shù)
request.args 是一個(gè)類似字典的對(duì)象,可以獲取所有參數(shù):
@app.route('/params')
def params():
all_params = request.args.to_dict()
return str(all_params)多值參數(shù)
如果一個(gè)參數(shù)可能有多個(gè)值,比如 ?tag=python&tag=flask:
tags = request.args.getlist('tag')
8. 表單參數(shù)進(jìn)階
獲取所有表單數(shù)據(jù)
@app.route('/submit', methods=['POST'])
def submit():
form_data = request.form.to_dict()
return str(form_data)文件上傳
@app.route('/upload', methods=['POST'])
def upload():
file = request.files['file']
file.save(f'./uploads/{file.filename}')
return 'File uploaded!'9. JSON參數(shù)進(jìn)階
校驗(yàn) JSON 數(shù)據(jù)
可以用 Flask 的 request.get_json(force=True) 強(qiáng)制解析 JSON:
@app.route('/json', methods=['POST'])
def json_view():
data = request.get_json(force=True)
if not data or 'name' not in data:
return 'Missing name!', 400
return f"Hello, {data['name']}"10. 路由中的 URL 構(gòu)建
Flask 推薦使用 url_for 來生成 URL,避免硬編碼:
from flask import url_for
@app.route('/profile/<username>')
def profile(username):
return f'Profile: {username}'
# 在其他地方
url = url_for('profile', username='alice')11. 常見問題與調(diào)試技巧
- 路由沖突:多個(gè)路由路徑一致時(shí),只有第一個(gè)生效。
- 參數(shù)類型錯(cuò)誤:比如
<int:id>,如果訪問/user/abc會(huì) 404。 - 使用
request.args.get('key', type=int)可以避免類型轉(zhuǎn)換錯(cuò)誤。 - 推薦使用 Flask 的調(diào)試模式:
app.run(debug=True)
12. 最佳實(shí)踐
- 路由參數(shù)盡量加類型限制,提升安全性和可讀性。
- 查詢參數(shù)建議設(shè)置默認(rèn)值和類型轉(zhuǎn)換。
- 表單和 JSON 數(shù)據(jù)建議做數(shù)據(jù)校驗(yàn)。
- 使用
url_for生成 URL,避免硬編碼。 - 對(duì)外暴露的 API 建議使用 RESTful 風(fēng)格。
13. 典型應(yīng)用場(chǎng)景舉例
RESTful API 路由設(shè)計(jì)
@app.route('/api/users/<int:user_id>', methods=['GET', 'PUT', 'DELETE'])
def user_api(user_id):
if request.method == 'GET':
# 查詢用戶信息
...
elif request.method == 'PUT':
# 更新用戶信息
...
elif request.method == 'DELETE':
# 刪除用戶
...搜索分頁接口
@app.route('/search')
def search():
keyword = request.args.get('keyword', '')
page = request.args.get('page', 1, type=int)
size = request.args.get('size', 10, type=int)
# 返回搜索結(jié)果
...14. 參數(shù)校驗(yàn)與錯(cuò)誤處理
路徑參數(shù)校驗(yàn)
Flask 路由定義時(shí)已做基本類型校驗(yàn)(如 <int:id>),但有時(shí)需要更復(fù)雜的校驗(yàn),可以在視圖函數(shù)內(nèi)處理:
@app.route('/user/<username>')
def user_profile(username):
if not username.isalnum():
return "用戶名不合法", 400
# 繼續(xù)處理
...查詢參數(shù)校驗(yàn)
常見做法是判斷參數(shù)是否存在、類型是否正確:
@app.route('/search')
def search():
keyword = request.args.get('keyword')
if not keyword:
return "缺少搜索關(guān)鍵詞", 400
page = request.args.get('page', default=1, type=int)
if page < 1:
return "頁碼必須大于0", 400
...JSON 參數(shù)校驗(yàn)
建議結(jié)合 pydantic 或 marshmallow 進(jìn)行結(jié)構(gòu)化校驗(yàn):
from flask import request
from marshmallow import Schema, fields, ValidationError
class UserSchema(Schema):
name = fields.Str(required=True)
age = fields.Int(required=True)
@app.route('/api/user', methods=['POST'])
def create_user():
try:
data = UserSchema().load(request.get_json())
except ValidationError as err:
return err.messages, 400
# data 是校驗(yàn)后的字典
...15. RESTful 風(fēng)格參數(shù)設(shè)計(jì)
- GET 用于查詢(通過路徑參數(shù)、查詢參數(shù))
- POST 用于創(chuàng)建(通過 JSON、表單參數(shù))
- PUT/PATCH 用于更新(通過路徑參數(shù)+JSON)
- DELETE 用于刪除(通過路徑參數(shù))
示例:
@app.route('/api/items/<int:item_id>', methods=['GET', 'PUT', 'DELETE'])
def item_api(item_id):
if request.method == 'GET':
# 查詢
...
elif request.method == 'PUT':
# 更新
...
elif request.method == 'DELETE':
# 刪除
...16、Flask 2.0 及以上版本提供的新路由注冊(cè)方式
(1). 基本用法
@app.get
注冊(cè)一個(gè)只響應(yīng) GET 請(qǐng)求的路由:
from flask import Flask, request
app = Flask(__name__)
@app.get('/hello')
def hello():
name = request.args.get('name', 'World')
return f'Hello, {name}!'等價(jià)于:
@app.route('/hello', methods=['GET'])
def hello():
...@app.post
注冊(cè)一個(gè)只響應(yīng) POST 請(qǐng)求的路由:
@app.post('/submit')
def submit():
data = request.form.get('data')
return f'You submitted: {data}'等價(jià)于:
@app.route('/submit', methods=['POST'])
def submit():
...(2). 混合用法
如果你希望同一路由支持多種方法(比如 GET 和 POST),還是需要用 @app.route:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return 'Login Page'
else:
username = request.form.get('username')
return f'Welcome, {username}'(3). 適用場(chǎng)景
@app.get('/xxx')適合只讀接口(查詢、頁面渲染等)。@app.post('/xxx')適合只寫接口(表單提交、數(shù)據(jù)創(chuàng)建等)。- 多方法共用時(shí),仍建議用
@app.route()。
(4). 版本要求
- 需要 Flask 2.0 及以上版本。
- 低于 2.0 的 Flask 沒有
@app.get和@app.post,只能用@app.route()。
(5). 代碼示例
from flask import Flask, request
app = Flask(__name__)
@app.get('/api/info')
def get_info():
return {'info': 'This is a GET endpoint'}
@app.post('/api/info')
def post_info():
data = request.get_json()
return {'received': data}(6). 總結(jié)
@app.get('/path')==@app.route('/path', methods=['GET'])@app.post('/path')==@app.route('/path', methods=['POST'])- 讓代碼更簡(jiǎn)潔、語義更明確
- 只在 Flask 2.0+ 可用
17. 使用 Flask 擴(kuò)展簡(jiǎn)化參數(shù)處理
Flask-RESTful
簡(jiǎn)化 REST API 的參數(shù)獲取和校驗(yàn):
from flask import Flask
from flask_restful import Resource, Api, reqparse
app = Flask(__name__)
api = Api(app)
class Hello(Resource):
def get(self):
parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True, help='Name cannot be blank')
args = parser.parse_args()
return {'hello': args['name']}
api.add_resource(Hello, '/hello')Flask-Swagger / Flask-apispec
自動(dòng)生成接口文檔,并支持參數(shù)校驗(yàn)。
18. 參數(shù)默認(rèn)值與類型轉(zhuǎn)換技巧
request.args.get('key', default=xxx, type=xxx)request.form.get('key', default=xxx, type=xxx)
示例:
limit = request.args.get('limit', default=10, type=int) 19. 復(fù)雜數(shù)據(jù)結(jié)構(gòu)的參數(shù)處理
有時(shí)候前端會(huì)以數(shù)組、字典等復(fù)雜結(jié)構(gòu)傳參,常見方式:
- 查詢參數(shù):
?ids=1&ids=2&ids=3,用getlist - JSON 參數(shù):直接傳遞復(fù)雜結(jié)構(gòu)
ids = request.args.getlist('ids')
# JSON: request.get_json()['items']20. 參數(shù)安全與防注入
- 對(duì)路徑參數(shù)、查詢參數(shù)、表單參數(shù)都要做校驗(yàn)(長(zhǎng)度、格式、類型、特殊字符)
- 對(duì) SQL 查詢要用 ORM 或參數(shù)化防止 SQL 注入
- 對(duì)文件上傳要檢查文件類型和大小
21. 實(shí)際項(xiàng)目中的參數(shù)設(shè)計(jì)建議
- 路由設(shè)計(jì)要簡(jiǎn)潔、語義清晰
- 參數(shù)命名統(tǒng)一,避免歧義
- 必填參數(shù)要明確說明,選填參數(shù)要有合理默認(rèn)值
- 錯(cuò)誤返回要有明確提示(如 400 Bad Request)
22. 常見問題答疑
- 參數(shù)獲取不到? 檢查請(qǐng)求方法、參數(shù)名和數(shù)據(jù)格式是否一致。
- 類型轉(zhuǎn)換失敗? 用
type=int等參數(shù),或在代碼里 try/except 捕獲異常。 - 參數(shù)沖突? 路由和參數(shù)名要避免重名,優(yōu)先使用 RESTful 風(fēng)格。
到此這篇關(guān)于Python flash URL訪問參數(shù)配置的文章就介紹到這了,更多相關(guān)Python flash URL訪問內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python實(shí)現(xiàn)在Word中添加或刪除超鏈接
在Word文檔中,超鏈接是一種將文本或圖像連接到其他文檔、網(wǎng)頁或同一文檔中不同部分的功能,本文將為大家介紹一下Python如何實(shí)現(xiàn)在Word中添加或刪除超鏈接,需要的可以參考下2025-01-01
Python使用numpy模塊實(shí)現(xiàn)矩陣和列表的連接操作方法
今天小編就為大家分享一篇Python使用numpy模塊實(shí)現(xiàn)矩陣和列表的連接操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06

