Kahibaro
Discord Login Register

پردازش ورودی کاربر (فرم‌ها)

فرم‌ها در برنامه‌های وب

در بخش‌های قبلی این فصل، با مفهوم کلی توسعهٔ وب و فریم‌ورک Flask آشنا شده‌اید و احتمالاً یک وب‌سرور ساده و مسیرها (routes) را ساخته‌اید. در این بخش روی یک موضوع مشخص تمرکز می‌کنیم: گرفتن ورودی از کاربر از طریق فرم‌های HTML و پردازش آن در پایتون (Flask).

هدف این بخش:

مرور بسیار کوتاه: مسیر و تابع در Flask

فرض می‌کنیم تا این‌جا یک برنامهٔ پایهٔ Flask مانند زیر را می‌شناسید:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
    return "سلام دنیا!"
if __name__ == "__main__":
    app.run(debug=True)

اکنون می‌خواهیم به جای متن ساده، فرم‌ها را پردازش کنیم.

ساخت یک فرم HTML ساده

برای گرفتن ورودی از کاربر در وب، از فرم HTML استفاده می‌کنیم. یک فرم بسیار ساده که فقط نام کاربر را می‌گیرد:

<form action="/hello" method="post">
    <label>نام شما:</label>
    <input type="text" name="username">
    <button type="submit">ارسال</button>
</form>

نکات مهم این فرم:

در Flask معمولاً این فرم را داخل یک قالب (template) می‌گذاریم، اما در این فصل قبلاً با قالب‌ها آشنا شده‌اید؛ این‌جا تمرکز روی ورودی و پردازش است، نه جزئیات قالب‌بندی.

دریافت دادهٔ فرم در Flask با request

برای خواندن دادهٔ فرم در سمت سرور، در Flask از شیء request استفاده می‌کنیم.

ابتدا باید آن را وارد کنیم:

from flask import Flask, request

سپس مسیری می‌سازیم که فرم را دریافت کند. مثلاً مسیری برای /hello که هم فرم را نشان دهد و هم جواب را:

from flask import Flask, request
app = Flask(__name__)
@app.route("/hello", methods=["GET", "POST"])
def hello():
    if request.method == "POST":
        # فرم ارسال شده است
        username = request.form.get("username")
        return f"سلام، {username}!"
    else:
        # اولین بار صفحه را با فرم نمایش بده
        return """
        <form action="/hello" method="post">
            <label>نام شما:</label>
            <input type="text" name="username">
            <button type="submit">ارسال</button>
        </form>
        """
if __name__ == "__main__":
    app.run(debug=True)

نکات:

این ساده‌ترین شکل پردازش فرم در Flask است.

GET در برابر POST در فرم‌ها

فرم‌ها معمولاً با دو روش اصلی ارسال می‌شوند: GET و POST.

روش GET

اگر در فرم بنویسید:

<form action="/search" method="get">

http://localhost:5000/search?q=python

@app.route("/search", methods=["GET"])
def search():
    query = request.args.get("q")
    return f"نتیجهٔ جستجو برای: {query}"

روش GET معمولاً مناسب است برای:

روش POST

اگر در فرم بنویسید:

<form action="/login" method="post">
@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "POST":
        user = request.form.get("user")
        password = request.form.get("password")
        return f"ورود با نام کاربری: {user}"
    return """
    <form action="/login" method="post">
        <label>نام کاربری:</label>
        <input type="text" name="user">
        <label>رمز عبور:</label>
        <input type="password" name="password">
        <button type="submit">ورود</button>
    </form>
    """

روش POST مناسب است برای:

خواندن چندین فیلد از فرم

در یک فرم معمولاً بیش از یک فیلد داریم. مثال: فرم ثبت‌نام ساده.

@app.route("/register", methods=["GET", "POST"])
def register():
    if request.method == "POST":
        username = request.form.get("username")
        email    = request.form.get("email")
        age      = request.form.get("age")
        return f"ثبت‌نام انجام شد: {username} ({email})، سن: {age}"
    return """
    <h1>فرم ثبت‌نام</h1>
    <form method="post">
        <label>نام کاربری:</label>
        <input type="text" name="username"><br>
        <label>ایمیل:</label>
        <input type="email" name="email"><br>
        <label>سن:</label>
        <input type="number" name="age"><br>
        <button type="submit">ثبت‌نام</button>
    </form>
    """

در این مثال:

اعتبارسنجی سادهٔ ورودی (Validation مقدماتی)

کاربر ممکن است:

مرحله‌ای بسیار مهم در پردازش ورودی، بررسی و اعتبارسنجی آن است.

یک مثال ساده:

@app.route("/age-check", methods=["GET", "POST"])
def age_check():
    if request.method == "POST":
        age_text = request.form.get("age", "").strip()
        if age_text == "":
            return "لطفاً سن خود را وارد کنید."
        # تلاش برای تبدیل به عدد
        try:
            age = int(age_text)
        except ValueError:
            return "سن باید عدد صحیح باشد."
        if age < 0:
            return "سن نمی‌تواند منفی باشد."
        elif age < 18:
            return "شما زیر ۱۸ سال هستید."
        else:
            return "شما ۱۸ سال یا بیشتر دارید."
    return """
    <form method="post">
        <label>سن شما:</label>
        <input type="text" name="age">
        <button type="submit">بررسی</button>
    </form>
    """

نکات مهم:

ارسال دوبارهٔ فرم به همراه پیام خطا

در عمل بهتر است اگر خطایی در ورودی وجود داشت، فرم را همراه پیام خطا دوباره نشان دهیم، نه فقط متن خالی.

برای این کار در پروژه‌های واقعی از قالب‌ها و render_template استفاده می‌کنیم. یک مثال ساده که ساختار کلی را نشان می‌دهد (بدون رفتن عمیق به جزئیات قالب‌ها):

فایل app.py:

from flask import Flask, request, render_template
app = Flask(__name__)
@app.route("/contact", methods=["GET", "POST"])
def contact():
    error = ""
    name = ""
    message = ""
    if request.method == "POST":
        name = request.form.get("name", "").strip()
        message = request.form.get("message", "").strip()
        if not name:
            error = "لطفاً نام خود را وارد کنید."
        elif len(message) < 10:
            error = "پیام باید حداقل ۱۰ کاراکتر باشد."
        else:
            # در این‌جا مثلاً می‌توان پیام را در فایل ذخیره کرد
            return "پیام شما ارسال شد. ممنون!"
    return render_template("contact.html", error=error, name=name, message=message)
if __name__ == "__main__":
    app.run(debug=True)

فایل templates/contact.html (فقط برای درک جریان):

<!doctype html>
<html>
<body>
    <h1>فرم تماس</h1>
    {% if error %}
        <p style="color:red;">{{ error }}</p>
    {% endif %}
    <form method="post">
        <label>نام:</label>
        <input type="text" name="name" value="{{ name }}"><br>
        <label>پیام:</label><br>
        <textarea name="message">{{ message }}</textarea><br>
        <button type="submit">ارسال</button>
    </form>
</body>
</html>

فقط نکات مرتبط با فرم:

ورودی‌هایی که چند مقدار دارند (checkbox, select multiple)

گاهی یک فیلد می‌تواند چند مقدار داشته باشد؛ مثلاً چند تیک در checkbox.

فرم:

<form method="post">
    <p>زبان‌های مورد علاقهٔ شما:</p>
    <label><input type="checkbox" name="languages" value="Python"> Python</label>
    <label><input type="checkbox" name="languages" value="JavaScript"> JavaScript</label>
    <label><input type="checkbox" name="languages" value="C++"> C++</label>
    <button type="submit">ارسال</button>
</form>

در Flask برای خواندن همهٔ مقدارها باید از getlist استفاده کنیم:

@app.route("/languages", methods=["GET", "POST"])
def languages():
    if request.method == "POST":
        selected = request.form.getlist("languages")
        return f"زبان‌های انتخاب‌شده: {', '.join(selected)}"
    return """
    <form method="post">
        <p>زبان‌های مورد علاقهٔ شما:</p>
        <label><input type="checkbox" name="languages" value="Python"> Python</label>
        <label><input type="checkbox" name="languages" value="JavaScript"> JavaScript</label>
        <label><input type="checkbox" name="languages" value="C++"> C++</label>
        <button type="submit">ارسال</button>
    </form>
    """

اگر از request.form.get("languages") استفاده کنید، فقط اولین مقدار را می‌گیرید. getlist همهٔ آن‌ها را به صورت یک لیست برمی‌گرداند.

جمع‌بندی

در این بخش یاد گرفتید که:

این مهارت‌ها پایهٔ بیشتر برنامه‌های وب تعاملی با پایتون هستند. در ادامهٔ فصل، می‌توانید از همین ورودی‌ها برای ساخت APIهای ساده یا پروژه‌های وب کوچک استفاده کنید.

Views: 5

Comments

Please login to add a comment.

Don't have an account? Register now!