اذهب إلى المحتوى
  • 0

السؤال

Recommended Posts

  • 0
نشر

نعم بالطبع يمكنك السؤال في أى شئ تريده يمكنك طرح السؤال هنا في قسم الأسئلة العامة وسيتم توفير الإجابات لك من قبل المدربين المتاحين .

  • 0
نشر

ما فائدة ال redirect في ال flask. مثلا هذا الكود:
 

# Stores registrants in a dictionary

from flask import Flask, redirect, render_template, request

app = Flask(__name__)

REGISTRANTS = {}

SPORTS = [
    "Basketball",
    "Soccer",
    "Ultimate Frisbee"
]


@app.route("/")
def index():
    return render_template("index.html", sports=SPORTS)


@app.route("/register", methods=["POST"])
def register():

    # Validate name
    name = request.form.get("name")
    if not name:
        return render_template("error.html", message="Missing name")

    # Validate sport
    sport = request.form.get("sport")
    if not sport:
        return render_template("error.html", message="Missing sport")
    if sport not in SPORTS:
        return render_template("error.html", message="Invalid sport")

    # Remember registrant
    REGISTRANTS[name] = sport

    # Confirm registration
    return render_template("registrants.html", registrants=REGISTRANTS)

# @app.route("/registrants")
def registrants():
    return render_template("registrants.html", registrants=REGISTRANTS)

قمت بتعديلة ليصبح:

# Stores registrants in a dictionary

from flask import Flask, redirect, render_template, request

app = Flask(__name__)

REGISTRANTS = {}

SPORTS = [
    "Basketball",
    "Soccer",
    "Ultimate Frisbee"
]


@app.route("/")
def index():
    return render_template("index.html", sports=SPORTS)


@app.route("/register", methods=["POST"])
def register():

    # Validate name
    name = request.form.get("name")
    if not name:
        return render_template("error.html", message="Missing name")

    # Validate sport
    sport = request.form.get("sport")
    if not sport:
        return render_template("error.html", message="Missing sport")
    if sport not in SPORTS:
        return render_template("error.html", message="Invalid sport")

    # Remember registrant
    REGISTRANTS[name] = sport

    # Confirm registration
    return render_template("registrants.html", registrants=REGISTRANTS)

لم أجد أي فرق في الشكل النهائي. فلماذا تمت اضافة redirect و لم نستخدم ال render_template مباشرة.

  • 0
نشر
بتاريخ 9 ساعة قال Abdelrehman Elsied:

ما فائدة ال redirect في ال flask. مثلا هذا الكود:
 

# Stores registrants in a dictionary

from flask import Flask, redirect, render_template, request

app = Flask(__name__)

REGISTRANTS = {}

SPORTS = [
    "Basketball",
    "Soccer",
    "Ultimate Frisbee"
]


@app.route("/")
def index():
    return render_template("index.html", sports=SPORTS)


@app.route("/register", methods=["POST"])
def register():

    # Validate name
    name = request.form.get("name")
    if not name:
        return render_template("error.html", message="Missing name")

    # Validate sport
    sport = request.form.get("sport")
    if not sport:
        return render_template("error.html", message="Missing sport")
    if sport not in SPORTS:
        return render_template("error.html", message="Invalid sport")

    # Remember registrant
    REGISTRANTS[name] = sport

    # Confirm registration
    return render_template("registrants.html", registrants=REGISTRANTS)

# @app.route("/registrants")
def registrants():
    return render_template("registrants.html", registrants=REGISTRANTS)

قمت بتعديلة ليصبح:

# Stores registrants in a dictionary

from flask import Flask, redirect, render_template, request

app = Flask(__name__)

REGISTRANTS = {}

SPORTS = [
    "Basketball",
    "Soccer",
    "Ultimate Frisbee"
]


@app.route("/")
def index():
    return render_template("index.html", sports=SPORTS)


@app.route("/register", methods=["POST"])
def register():

    # Validate name
    name = request.form.get("name")
    if not name:
        return render_template("error.html", message="Missing name")

    # Validate sport
    sport = request.form.get("sport")
    if not sport:
        return render_template("error.html", message="Missing sport")
    if sport not in SPORTS:
        return render_template("error.html", message="Invalid sport")

    # Remember registrant
    REGISTRANTS[name] = sport

    # Confirm registration
    return render_template("registrants.html", registrants=REGISTRANTS)

لم أجد أي فرق في الشكل النهائي. فلماذا تمت اضافة redirect و لم نستخدم ال render_template مباشرة.

في الكود لم يتم إستخدام redirect بل تم فقط إستيرادها .

وإليك الفرق بين render_template و redirect:

render_template:

  • يعرض القالب مباشرة.
  • يبقى المستخدم في نفس مسار URL.
  • إذا قام المستخدم بتحديث الصفحة (refresh)، سيعيد إرسال النموذج (POST request) مما قد يسبب تسجيلات مكررة.

redirect:

  • يرسل المستخدم إلى مسار آخر مثلا من /register إلى /registrants.
  • يغير URL في المتصفح
  • يمنع إعادة إرسال النموذج عند تحديث الصفحة

 

  • 0
نشر
بتاريخ On 12‏/3‏/2026 at 03:39 قال Abdelrehman Elsied:

ما فائدة ال redirect في ال flask. مثلا هذا الكود:
 

# Stores registrants in a dictionary

from flask import Flask, redirect, render_template, request

app = Flask(__name__)

REGISTRANTS = {}

SPORTS = [
    "Basketball",
    "Soccer",
    "Ultimate Frisbee"
]


@app.route("/")
def index():
    return render_template("index.html", sports=SPORTS)


@app.route("/register", methods=["POST"])
def register():

    # Validate name
    name = request.form.get("name")
    if not name:
        return render_template("error.html", message="Missing name")

    # Validate sport
    sport = request.form.get("sport")
    if not sport:
        return render_template("error.html", message="Missing sport")
    if sport not in SPORTS:
        return render_template("error.html", message="Invalid sport")

    # Remember registrant
    REGISTRANTS[name] = sport

    # Confirm registration
    return render_template("registrants.html", registrants=REGISTRANTS)

# @app.route("/registrants")
def registrants():
    return render_template("registrants.html", registrants=REGISTRANTS)

قمت بتعديلة ليصبح:

# Stores registrants in a dictionary

from flask import Flask, redirect, render_template, request

app = Flask(__name__)

REGISTRANTS = {}

SPORTS = [
    "Basketball",
    "Soccer",
    "Ultimate Frisbee"
]


@app.route("/")
def index():
    return render_template("index.html", sports=SPORTS)


@app.route("/register", methods=["POST"])
def register():

    # Validate name
    name = request.form.get("name")
    if not name:
        return render_template("error.html", message="Missing name")

    # Validate sport
    sport = request.form.get("sport")
    if not sport:
        return render_template("error.html", message="Missing sport")
    if sport not in SPORTS:
        return render_template("error.html", message="Invalid sport")

    # Remember registrant
    REGISTRANTS[name] = sport

    # Confirm registration
    return render_template("registrants.html", registrants=REGISTRANTS)

لم أجد أي فرق في الشكل النهائي. فلماذا تمت اضافة redirect و لم نستخدم ال render_template مباشرة.

أنت محق  من ناحية الشكل النهائي للمستخدم لن تلاحظ أي فرق الصفحة ستعرض نفس البيانات في كلتا الحالتين ولكن السبب الرئيسي لاستخدام الـ redirect يكمن في سلوك المتصفح وكيفية تعامله مع البيانات ، وتحديداً لحل مشكلة إعادة إرسال النموذج 

أي عند استخدام render_template عندما يضغط المستخدم على تسجيل، يقوم المتصفح بإرسال البيانات عبر طلب من نوع POST. و ترد عليه باستخدام render_template مباشرة

المتصفح لا يزال يتذكر أن آخر عملية قام بها هي "إرسال بيانات POST". إذا قام المستخدم بتحديث الصفحة (ضغط F5)، ستظهر له رسالة تحذيرية من المتصفح تسأله (هل تريد إعادة إرسال النموذج؟). وإذا وافق المستخدم، سيتم إرسال نفس البيانات مرة أخرى للسيرفر، مما قد يؤدي إلى حفظ نفس الشخص مرتين في قاعدة البيانات

ولكن عندما تستقبل بيانات الـ POST بنجاح، بدلاً من عرض الصفحة مباشرة، تقوم بتوجيه المتصفح لصفحة أخرى: return redirect("/registrants"). وقتها سيتغير في المتصفح ليصبح /registrants، وهو أمر منطقي أكثر. وإذا قام المستخدم بتحديث الصفحة ، المتصفح سيقوم ببساطة بإعادة تحميل صفحة /registrants (عبر GET request) دون إعادة إرسال بيانات النموذج، ولن تظهر أي رسالة تحذيرية.

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...