ساخت سیستم فالو و دنبال‌کردن با پایتون و Flask

ساخت سیستم فالو و دنبال‌کردن با پایتون و Flask

در این مقاله، به بررسی و پیاده‌سازی یک سیستم فالو و دنبال‌کردن در یک وب اپلیکیشن با استفاده از پایتون و فریم‌ورک Flask خواهیم پرداخت. این سیستم به کاربران اجازه می‌دهد تا پروفایل‌های دیگر کاربران را دنبال کنند و پست‌ها یا فعالیت‌های آن‌ها را در فید خود مشاهده کنند. این یک ویژگی رایج در بسیاری از پلتفرم‌های اجتماعی و وب‌سایت‌های محتوا محور است.

پیش‌نیازها

قبل از شروع، اطمینان حاصل کنید که موارد زیر را دارید:

  • پایتون (نسخه 3.6 یا بالاتر)
  • Flask
  • یک پایگاه داده (مانند SQLite، PostgreSQL یا MySQL)
  • آشنایی با مفاهیم اولیه Flask، HTML، CSS و SQL

طراحی پایگاه داده

برای پیاده‌سازی سیستم فالو، به یک جدول در پایگاه داده نیاز داریم که اطلاعات مربوط به روابط فالو را ذخیره کند. این جدول معمولاً شامل دو ستون است: ستون ‘follower_id’ که شناسه کاربری است که دنبال می‌کند و ستون ‘following_id’ که شناسه کاربری است که دنبال می‌شود.

یک مثال از ساختار جدول ‘follows’ در SQLite:

CREATE TABLE follows (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    follower_id INTEGER NOT NULL,
    following_id INTEGER NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    UNIQUE (follower_id, following_id)
);

ستون ‘id’ یک شناسه یکتا برای هر ردیف است. ‘follower_id’ و ‘following_id’ کلیدهای خارجی به جدول ‘users’ هستند (که در این مقاله فرض می‌شود وجود دارد). ‘created_at’ زمان ایجاد رابطه فالو را ثبت می‌کند. قید ‘UNIQUE’ تضمین می‌کند که یک کاربر نمی‌تواند یک کاربر دیگر را بیش از یک بار دنبال کند.

پیاده‌سازی با Flask

اکنون، بیایید پیاده‌سازی سیستم فالو را با استفاده از Flask آغاز کنیم. ابتدا، باید یک تابع برای دنبال کردن یک کاربر ایجاد کنیم.

تابع دنبال کردن کاربر

این تابع، شناسه کاربری که دنبال می‌کند و شناسه کاربری که دنبال می‌شود را به عنوان ورودی می‌گیرد و یک ردیف جدید در جدول ‘follows’ ایجاد می‌کند.

from flask import Flask, render_template, redirect, url_for, session
import sqlite3

app = Flask(__name__)
app.secret_key = 'your_secret_key' # برای امنیت session

DATABASE = 'your_database.db'

def follow_user(follower_id, following_id):
    conn = sqlite3.connect(DATABASE)
    cursor = conn.cursor()
    try:
        cursor.execute("INSERT INTO follows (follower_id, following_id) VALUES (?, ?)", (follower_id, following_id))
        conn.commit()
        return True
    except sqlite3.IntegrityError:
        return False # کاربر قبلاً دنبال شده است
    finally:
        conn.close()

تابع لغو دنبال کردن کاربر

این تابع، شناسه کاربری که دنبال می‌کند و شناسه کاربری که دنبال می‌شود را به عنوان ورودی می‌گیرد و ردیف مربوطه را از جدول ‘follows’ حذف می‌کند.

def unfollow_user(follower_id, following_id):
    conn = sqlite3.connect(DATABASE)
    cursor = conn.cursor()
    cursor.execute("DELETE FROM follows WHERE follower_id = ? AND following_id = ?", (follower_id, following_id))
    conn.commit()
    conn.close()

بررسی وضعیت فالو

برای نمایش وضعیت فالو (دنبال کردن یا عدم دنبال کردن) به کاربر، باید یک تابع ایجاد کنیم که بررسی کند آیا یک کاربر، کاربر دیگری را دنبال می‌کند یا خیر.

def is_following(follower_id, following_id):
    conn = sqlite3.connect(DATABASE)
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM follows WHERE follower_id = ? AND following_id = ?", (follower_id, following_id))
    result = cursor.fetchone()
    conn.close()
    return result is not None

نمایش لیست کاربران قابل فالو

فرض کنید یک صفحه داریم که لیست کاربران را نمایش می‌دهد. در این صفحه، می‌توانیم وضعیت فالو هر کاربر را با استفاده از تابع ‘is_following’ بررسی کنیم و یک دکمه “دنبال کردن” یا “لغو دنبال کردن” را بر اساس آن نمایش دهیم.

@app.route('/users')
def list_users():
    conn = sqlite3.connect(DATABASE)
    cursor = conn.cursor()
    cursor.execute("SELECT id, username FROM users") # فرض بر وجود جدول users
    users = cursor.fetchall()
    conn.close()

    user_list = []
    for user in users:
        user_id, username = user
        if user_id != session.get('user_id'): # نمایش ندادن کاربر فعلی
            following = is_following(session.get('user_id'), user_id)
            user_list.append({'id': user_id, 'username': username, 'following': following})

    return render_template('users.html', users=user_list)

صفحه users.html (مثال)

<!DOCTYPE html>
<html>
<head>
    <title>لیست کاربران</title>
</head>
<body>
    <h1>لیست کاربران</h1>
    <ul>
        <% for user in users %>
            <li>
                <% if user.following %>
                    <a href="{{ url_for('unfollow', following_id=user.id) }}">لغو دنبال کردن</a>
                <% else %>
                    <a href="{{ url_for('follow', following_id=user.id) }}">دنبال کردن</a>
                <% endif %>
                <% user.username %>
            <li>
        <% endfor %>
    </ul>
</body>
</html>

مسیرهای (Routes) Flask

@app.route('/follow/')
def follow(following_id):
    if follow_user(session.get('user_id'), following_id):
        return redirect(url_for('list_users'))
    else:
        # کاربر قبلاً دنبال شده است، پیام مناسب نمایش دهید
        return "شما قبلاً این کاربر را دنبال می‌کنید."

@app.route('/unfollow/')
def unfollow(following_id):
    unfollow_user(session.get('user_id'), following_id)
    return redirect(url_for('list_users'))

نمایش فید (Feed)

برای نمایش فید، باید پست‌های کاربران دنبال شده را از پایگاه داده دریافت کنیم. این کار را می‌توان با استفاده از یک کوئری SQL انجام داد که از جدول ‘follows’ برای فیلتر کردن پست‌ها استفاده می‌کند.

مثال (فرض بر وجود جدول ‘posts’ با ستون ‘user_id’):

@app.route('/feed')
def feed():
    conn = sqlite3.connect(DATABASE)
    cursor = conn.cursor()
    user_id = session.get('user_id')
    cursor.execute("""
        SELECT p.id, p.content, u.username
        FROM posts p
        JOIN users u ON p.user_id = u.id
        WHERE p.user_id IN (SELECT following_id FROM follows WHERE follower_id = ?)
        ORDER BY p.created_at DESC
    """, (user_id,))
    posts = cursor.fetchall()
    conn.close()
    return render_template('feed.html', posts=posts)

نکات امنیتی

هنگام پیاده‌سازی سیستم فالو، باید به نکات امنیتی زیر توجه کنید:

  • اعتبارسنجی ورودی: اطمینان حاصل کنید که شناسه کاربری که دنبال می‌کنید و شناسه کاربری که دنبال می‌شوید معتبر هستند.
  • جلوگیری از حملات SQL Injection: از پارامترهای جایگزین (parameterized queries) برای جلوگیری از حملات SQL Injection استفاده کنید.
  • حفاظت از session: از یک کلید امن برای session استفاده کنید و session را به درستی مدیریت کنید.

نتیجه‌گیری

در این مقاله، یک سیستم فالو و دنبال‌کردن ساده را با استفاده از پایتون و Flask پیاده‌سازی کردیم. این سیستم می‌تواند به عنوان یک نقطه شروع برای ساخت یک پلتفرم اجتماعی یا وب‌سایت محتوا محور استفاده شود. با افزودن ویژگی‌های بیشتر، مانند نوتیفیکیشن‌ها و تنظیمات حریم خصوصی، می‌توانید این سیستم را بهبود بخشید و آن را برای نیازهای خاص خود سفارشی کنید.

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *