پیش فرض :

پیش فرض ما این است که شما با زبان برنامه  نویسی Python و فریمورک Flask آشنایی دارید. همچنین از محیط PyCharm برای برنامه نویسی پروژه های تحت پایتون خود استفاده می کنید.

پیش فرض دیگه ما این هست که شما از ubuntu به عنوان سیستم عامل استفاده میکنید و آشنایی مختصری با  فرامین ابتدایی خط فرمان لینوکس دارید.

PyCharm

PyCharm یک IDE (محیط برنامه نویسی مجتمع) برای توسعه برنامه های تحت Python هست که توسط شرکت JetBrains نوشته شده. اگر از ویژوال استدیو استفاده میکنید حتما با پلاگین Resharper محصول این شرکت آشنایی دارد. در این آموزش من از نسخه comuinty این نرم افزار که رایگان و اپن سورس هست استفاده خواهم کرد.

محیط توسعه PyCharm این قابلیت رو دارد که کد برنامتون رو به پروسسهای در حال اجرا ضمیمه (Attach) کنید. به کمک این قابلیت میتونید روی کد breakpoint بذارید و برنامه رو دیباگ کنید.

مشکل کجاست؟

مشکل از اینجا شروع میشه که میخواهید برنامه تحت Flask خودتون رو دیباگ کنید. خود Flask یک دیباگر داره و میشه از خروجی اون برای دیباگ کردن کد استفاده کرد اما کار کردن با این دیباگر یه مقداری آزاردهنده ( حداقل برای من) است. خوب راه حل اینه که کد پروژه در حال اجرای خودتون را به پروسس در حال اجرای Python که داره اپلیکیشن فلسک رو اجرا میکنه ضمیمه کنید. این کار میتونید از منوی Tools>Attach To Proccess انجام بدهید. اما این کار در مورد برنامه های فلسک جواب نمیده.

چکار باید کرد؟

اولین گام برای اینکه فرآیند Attach کردن کد به پروسس به درستی انجام بشه اینه که PyCharm رو با دسترسی root اجرا کنید. برای این کار میتونید از دستور gksudo استفاده کنید.

گام دوم ایجاد تغییراتی توی برنامتون هست تا دیباگر PyCharm بتونه با برنامتون ارتباط برقرار کنه.

فرض کنید یک برنامه ساده فلسک به صورت زیر داریم:

from flask import Flask
app = Flask(__name__)
 
@app.route("/")
def hello():
    return "Hello World!"
 
if __name__ == "__main__":
    app.run()

برای اینکه امکاناتی به خط فرمان برنامه خودمون استفاده کنیم از ماژول argparse استفاده میکنیم.

#my_app.py
from flask import Flask
app = Flask(__name__)
 
@app.route("/")
def hello():
    return "Hello World!"
 
if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser(description='Development Server Help')
    parser.add_argument("-d", "--debug", action="store_true", dest="debug_mode",
                  help="run in debug mode (for use with PyCharm)", default=False)
    parser.add_argument("-p", "--port", dest="port",
                  help="port of server (default:%(default)s)", type=int, default=5000)
 
    cmd_args = parser.parse_args()
    app_options = {"port": cmd_args.port }
 
    if cmd_args.debug_mode:
        app_options["debug"] = True
        app_options["use_debugger"] = False
        app_options["use_reloader"] = False
 
    app.run(**app_options)

تغییرات ایجاد شده در برنامه باعث میشه که برنامتون قابلیت گرفتن پارامترهای مختلف از خط فرمان رو داشته باشه. مثلا پارامتر -h توضیح کوچکی در مورد برنامتون میده :

~username$ python my_app.py -h
usage: my_app.py [-h] [-d] [-p PORT]

Development Server Help

optional arguments:
-h, --help show this help message and exit
-d, --debug run in debug mode (for use with PyCharm)
-p PORT, --port PORT port of server (default:5000)

خوب همونطور که حدس زدید در ادامه ما برای اینکه بتونیم از PyCharm برای دیباگ برنامه استفاده کنیم از پارامتر -d استفاه میکنیم. توی محیط Terminal لینوکس دستور زیر رو وارد کنید

~username$sudo python my_app.py -d

حالا بر میگردیم به PyCharm. از منوی Tools>Attach To Proccess استفاده میکنیم و پروسس مربوطه را ضمیمه کد میکنیم. اگه همه چیز به درستی انجام شده باشه میتونید به راحتی از دیباگر برای breakpoint ها و یا watch کردن متغیرها استفاده کنید.

منبع : Debugging a Flask app inside PyCharm