วิธีดีบักแอพ Flask


134

คุณตั้งใจจะแก้ไขข้อผิดพลาดใน Flask อย่างไร? พิมพ์ไปที่คอนโซล? ข้อความแฟลชไปยังเพจ? หรือมีตัวเลือกที่ทรงพลังกว่านี้เพื่อดูว่าเกิดอะไรขึ้นเมื่อมีอะไรผิดพลาด?


5
ไม่มีอะไรวิเศษเกี่ยวกับapp.run()(ไม่ว่าจะเปิดหรือปิดการแก้ปัญหา) Flask ทำงานเหมือนแอปพลิเคชัน python อื่น ๆ ดังนั้นคุณสามารถดีบักได้เช่นเดียวกับที่คุณแก้ปัญหาแอปพลิเคชัน Python หากคุณต้องการใช้การบันทึกให้ใช้การบันทึก หากต้องการพิมพ์ให้ใช้ภาพพิมพ์ คุณยังสามารถใช้ดีบักเกอร์ได้หากต้องการ
Mark Hildreth

คำตอบ:


129

การเรียกใช้แอปในโหมดการพัฒนาจะแสดงการย้อนกลับแบบโต้ตอบและคอนโซลในเบราว์เซอร์เมื่อมีข้อผิดพลาด หากต้องการเรียกใช้ในโหมดการพัฒนาให้ตั้งค่าFLASK_ENV=developmentตัวแปรสภาพแวดล้อมจากนั้นใช้flask runคำสั่ง (อย่าลืมชี้FLASK_APPไปที่แอปของคุณด้วย)

สำหรับ Linux, Mac, Linux Subsystem สำหรับ Windows, Git Bash บน Windows ฯลฯ :

export FLASK_APP=myapp
export FLASK_ENV=development
flask run

สำหรับ Windows CMD ให้ใช้setแทนการส่งออก:

set FLASK_ENV=development

สำหรับ PowerShell ให้ใช้$env:

$env:FLASK_ENV = "development"

ก่อนหน้า Flask 1.0 สิ่งนี้ถูกควบคุมโดยFLASK_DEBUG=1ตัวแปรสภาพแวดล้อมแทน

หากคุณใช้app.run()วิธีนี้แทนflask runคำสั่งให้ส่งผ่านdebug=Trueเพื่อเปิดใช้งานโหมดดีบัก

ระบบจะพิมพ์ Tracebacks ไปยังเทอร์มินัลที่รันเซิร์ฟเวอร์โดยไม่คำนึงถึงโหมดการพัฒนา

หากคุณใช้ PyCharm, VS Code และอื่น ๆ คุณสามารถใช้ประโยชน์จากดีบักเกอร์เพื่อก้าวผ่านโค้ดด้วยเบรกพอยต์ การกำหนดค่าการรันสามารถชี้ไปที่การเรียกสคริปต์app.run(debug=True, use_reloader=False)หรือชี้ไปที่venv/bin/flaskสคริปต์และใช้ตามที่คุณต้องการจากบรรทัดคำสั่ง คุณสามารถปล่อยให้ตัวโหลดซ้ำถูกปิดใช้งาน แต่การโหลดซ้ำจะฆ่าบริบทการดีบักและคุณจะต้องจับเบรกพอยต์อีกครั้ง

คุณยังสามารถใช้ pdb, pudb หรือเทอร์มินัลดีบักเกอร์อื่นได้โดยเรียกใช้set_traceในมุมมองที่คุณต้องการเริ่มการดีบัก


อย่าใช้กว้างเกินไปยกเว้นบล็อก การล้อมรอบโค้ดทั้งหมดของคุณด้วยการจับทั้งหมดtry... except...จะปิดเสียงข้อผิดพลาดที่คุณต้องการแก้ไข โดยทั่วไปไม่จำเป็นเนื่องจาก Flask จะจัดการข้อยกเว้นอยู่แล้วโดยการแสดงดีบักเกอร์หรือข้อผิดพลาด 500 และพิมพ์การตรวจสอบย้อนกลับไปยังคอนโซล


38

คุณสามารถใช้app.run(debug=True)สำหรับการแก้ไขWerkzeug Debugger ดังที่กล่าวไว้ด้านล่างและฉันควรจะรู้


7
อันที่จริงเมื่อคุณวิ่งไปกับdebug=Trueคุณกำลังใช้ดีบักเกอร์ Werkzeug ดังนั้นจึงไม่ใช่อย่างใดอย่างหนึ่งหรือ ;-)
Sean Vieira

ฮ่าคุณพูดถูก ฉันเดาว่าฉันน่าจะดูความต้องการ setup.py ของ Flask แล้ว ฉันใช้สำเนาที่แก้ไขแล้วสำหรับการทำงานภายใต้ GAE ซึ่งคุณต้องเริ่มต้น Werkzeug ด้วยตนเอง
bnlucas

ฉันตั้งค่า app.run แล้ว (debug = True) ถ้าฉันพิมพ์ xyz จะพิมพ์ไปที่ไหนขอบคุณ
Kimmy

การใช้print 'xyz'จะพิมพ์ไปที่คอนโซล หากคุณต้องการแก้ไขข้อบกพร่องในเบราว์เซอร์คุณจะต้องบังคับให้เกิดข้อผิดพลาดที่คุณต้องการแก้ไขข้อบกพร่อง raise Exception('xyz'). สิ่งนี้จะทริกเกอร์การดีบักให้แสดงผลในหน้าต่างเบราว์เซอร์
bnlucas

25

จาก1.1.xเอกสารประกอบคุณสามารถเปิดใช้งานโหมดดีบักโดยการเอ็กซ์พอร์ตตัวแปรสภาพแวดล้อมไปยังเชลล์พร้อมต์ของคุณ:

export FLASK_APP=/daemon/api/views.py  # path to app
export FLASK_DEBUG=1
python -m flask run --host=0.0.0.0

4
คำตอบนี้จะมีประโยชน์มากขึ้นหากอธิบายว่าโหมดดีบักคืออะไร มันทำมากกว่าอนุญาตให้แก้ไขจุดบกพร่องในเบราว์เซอร์หรือไม่? น่าเสียดายเนื่องจากฉันกำลังทำงานกับ REST API จึงไม่ได้ช่วยอะไรฉันมากนัก
Michael Scheper

ฉันจะวางข้อมูลโค้ดนั้นไว้ที่ไหน
mLstudent33

1
@ mLstudent33 in a shell
Édouard Lopez

16

คุณยังสามารถใช้ส่วนขยายFlask Debug Toolbarเพื่อรับข้อมูลรายละเอียดเพิ่มเติมที่ฝังอยู่ในหน้าที่แสดงผล

from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
import logging

app = Flask(__name__)
app.debug = True
app.secret_key = 'development key'

toolbar = DebugToolbarExtension(app)

@app.route('/')
def index():
    logging.warning("See this message in Flask Debug Toolbar!")
    return "<html><body></body></html>"

เริ่มแอปพลิเคชันดังนี้:

FLASK_APP=main.py FLASK_DEBUG=1 flask run

12

หากคุณใช้ Visual Studio Code ให้แทนที่

app.run(debug=True)

กับ

app.run()

ปรากฏขึ้นเมื่อเปิดดีบักเกอร์ภายในปิดใช้งานดีบักเกอร์ VS Code


3
คุณสามารถแบ่งปันตัวอย่างการตั้งค่าที่ใช้งานได้หรือไม่? ฉันได้กำหนด FLASK_APP ใน env ของฉันแล้วและการกำหนดค่าเริ่มต้นจะไม่ทำงาน ฉันลองใช้อันนี้ - pastebin.com/v8hBQ2vvและการเรียงสับเปลี่ยนที่คล้ายกันจำนวนหนึ่ง แต่ไม่มีประโยชน์
Brandon Dube

12

หากคุณต้องการดีบักแอพขวดของคุณให้ไปที่โฟลเดอร์ที่แอพขวดอยู่ อย่าลืมเปิดใช้งานสภาพแวดล้อมเสมือนของคุณและวางบรรทัดในคอนโซลเปลี่ยน "mainfilename" เป็นไฟล์หลักของขวด

export FLASK_APP="mainfilename.py"
export FLASK_DEBUG=1
python -m flask run --host=0.0.0.0

หลังจากที่คุณเปิดใช้งานดีบักเกอร์สำหรับแอป flask ข้อผิดพลาดเกือบทั้งหมดจะถูกพิมพ์บนคอนโซลหรือบนหน้าต่างเบราว์เซอร์ หากคุณต้องการทราบว่าเกิดอะไรขึ้นคุณสามารถใช้คำสั่งพิมพ์อย่างง่ายหรือคุณสามารถใช้ console.log () สำหรับโค้ดจาวาสคริปต์


6

ติดตั้งpython-dotenvในสภาพแวดล้อมเสมือนของคุณ

สร้าง. flaskenv ในรูทโปรเจ็กต์ของคุณ ตามรูทโปรเจ็กต์ฉันหมายถึงโฟลเดอร์ที่มีไฟล์ app.py ของคุณ

ภายในไฟล์นี้เขียนสิ่งต่อไปนี้:

FLASK_APP=myapp 
FLASK_ENV=development

ตอนนี้ออกคำสั่งต่อไปนี้:

flask run

ไม่ได้ผลสำหรับฉัน ... มันยังคงแสดงโหมด Debug: off
Federico Gentile

3

ในการเปิดใช้งานโหมดดีบักในขวดคุณเพียงแค่พิมพ์ set FLASK_DEBUG=1บนCMDwindows ของคุณและส่งออกFLASK_DEBUG=1บน Linux termial จากนั้นรีสตาร์ทแอพของคุณและคุณก็พร้อมแล้ว !!


2

เคล็ดลับด่วน - หากคุณใช้ PyCharm ให้ไปที่Edit Configurations=> Configurationsและเปิดใช้งานFLASK_DEBUGช่องทำเครื่องหมายรีสตาร์ทไฟล์Run.


2
คุณอาจต้องการเพิ่มว่าช่องทำเครื่องหมายนี้มีให้เฉพาะใน PyCharm Professional อ้างอิง: jetbrains.com/help/pycharm/…
cyroxx

1

ใช้ตัวบันทึกและคำสั่งการพิมพ์ในสภาพแวดล้อมการพัฒนาคุณสามารถใช้ยามในกรณีของสภาพแวดล้อมการผลิต


1

สำหรับผู้ใช้ Windows:

เปิด Powershell และ cd ในไดเรกทอรีโครงการของคุณ

ใช้คอมมานโดเหล่านี้ใน Powershell สิ่งอื่น ๆ ทั้งหมดจะไม่ทำงานใน Powershell

$env:FLASK_APP = "app"  
$env:FLASK_ENV = "development"

-1

หากคุณกำลังเรียกใช้งานในเครื่องและต้องการที่จะก้าวผ่านรหัส:

python -m pdb script.py


สิ่งนี้ใช้ไม่ได้กับแอปขวดเลย
CornSmith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.