🚀 騷操作清單(進階黑魔法級)
1. 自定義 route
裝飾器,讓路由語法更優雅
python
複製編輯# 超騷:讓 route 看起來像函式呼叫
def route(path, **options):
def decorator(f):
app.add_url_rule(path, f.__name__, f, **options)
return f
return decorator
@route('/sao')
def sao_page():
return '真的騷'
2. 在 before_request
偷偷改變 request 路由
python
複製編輯@app.before_request
def redirect_secret():
if request.path == "/admin":
# 黑魔法:偷偷把訪問 /admin 導去 /notadmin
request.environ['PATH_INFO'] = "/notadmin"
@app.route('/notadmin')
def secret():
return "其實你進來的是 /notadmin"
3. Flask 的 g
對象偷渡資料(共享狀態)
python
複製編輯@app.before_request
def inject_data():
g.sao_value = "沒人知道的騷操作"
@app.route('/get_sao')
def get_sao():
return g.sao_value
👉 很多人沒用過 g
,但這其實是全域請求上下文變數,可以傳遞資料但只活在這次 request。
4. 返回任意物件,Flask 幫你自動處理
python
複製編輯class SuperSao:
def __str__(self):
return "我是物件不是字串"
@app.route('/weird')
def weird():
return SuperSao() # Flask 會自動 str()
# 更進階:可以實作 __html__ 或 __call__ 來參與渲染
5. 把 .py
當模板引擎使用(超極限)
python
複製編輯@app.route('/pytemplate')
def pytemplate():
code = """
name = '小明'
html = f"<h1>Hello {name}</h1>"
"""
loc = {}
exec(code, {}, loc)
return loc['html']
⚠️ 這是黑魔法 + 安全地獄,但真的超級騷。
6. 自定義 Response 類,做出奇怪格式回應
python
複製編輯from flask import Response
@app.route('/raw')
def raw():
return Response("這是原始字串喔", content_type='text/plain; charset=utf-8')
7. 用 Flask 做 TCP 或 Unix socket 通訊(跳脫 HTTP)
python🧠 用 Flask 配合 socket 寫 IPC 通訊,搞出非 Web 用法也很騷。
複製編輯# 使用 gunicorn 搭配 unix socket:
# gunicorn -b unix:/tmp/flask.sock app:app
8. 在 URL 裡使用正則,定義奇怪的路由規則
python
複製編輯from werkzeug.routing import BaseConverter
class RegexConverter(BaseConverter):
def __init__(self, map, *items):
super().__init__(map)
self.regex = items[0]
app.url_map.converters['re'] = RegexConverter
@app.route('/id/<re("[0-9]{4}"):id>')
def regex_demo(id):
return f"你輸入了四位數 ID:{id}"
9. 讓 Flask 伺服器自己重啟(像病毒一樣)
python
複製編輯import os, sys
@app.route('/restart')
def restart():
os.execl(sys.executable, sys.executable, *sys.argv)
🛑 真的會重啟伺服器,用來做開發期自我熱重載(極限情況)。
10. 用裝飾器定義多語系自動回應
python
複製編輯from functools import wraps
def multilingual(func):
@wraps(func)
def wrapper(*args, **kwargs):
lang = request.args.get('lang', 'en')
if lang == 'zh':
return "你好,世界!"
return func(*args, **kwargs)
return wrapper
@app.route('/greet')
@multilingual
def greet():
return "Hello, World!"