ساخت سیستم پیام خصوصی با پایتون و Flask

ساخت سیستم پیام خصوصی با پایتون و Flask

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

پیش‌نیازها

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

مراحل ساخت

1. راه‌اندازی پروژه

ابتدا یک دایرکتوری برای پروژه خود ایجاد کنید و سپس یک محیط مجازی (virtual environment) ایجاد کنید تا وابستگی‌های پروژه را جدا نگه دارید:

mkdir private_messaging
cd private_messaging
python3 -m venv venv
source venv/bin/activate  # در لینوکس/مک
venvScriptsactivate  # در ویندوز

سپس Flask را نصب کنید:

pip install Flask

2. ساخت پایگاه داده

برای ذخیره اطلاعات کاربران و پیام‌ها، از یک پایگاه داده استفاده می‌کنیم. در اینجا از SQLite استفاده می‌کنیم. یک فایل به نام database.db ایجاد کنید. سپس، یک فایل پایتون به نام db.py ایجاد کنید و کد زیر را در آن قرار دهید:

import sqlite3

def create_tables():
    conn = sqlite3.connect('database.db')
    cursor = conn.cursor()

    cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT UNIQUE NOT NULL,
            password TEXT NOT NULL
        )
    ''')

    cursor.execute('''
        CREATE TABLE IF NOT EXISTS messages (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            sender_id INTEGER NOT NULL,
            receiver_id INTEGER NOT NULL,
            content TEXT NOT NULL,
            timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
            FOREIGN KEY (sender_id) REFERENCES users(id),
            FOREIGN KEY (receiver_id) REFERENCES users(id)
        )
    ''')

    conn.commit()
    conn.close()

if __name__ == '__main__':
    create_tables()

این کد دو جدول users و messages را ایجاد می‌کند. جدول users شامل اطلاعات کاربران (شناسه، نام کاربری و رمز عبور) و جدول messages شامل اطلاعات پیام‌ها (شناسه، فرستنده، گیرنده، محتوا و زمان ارسال) است.

3. ساخت اپلیکیشن Flask

یک فایل پایتون به نام app.py ایجاد کنید و کد زیر را در آن قرار دهید:

from flask import Flask, render_template, request, redirect, url_for
import sqlite3
import hashlib

app = Flask(__name__)

def get_db_connection():
    conn = sqlite3.connect('database.db')
    conn.row_factory = sqlite3.Row
    return conn

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        hashed_password = hashlib.sha256(password.encode()).hexdigest()

        conn = get_db_connection()
        try:
            conn.execute('INSERT INTO users (username, password) VALUES (?, ?)', (username, hashed_password))
            conn.commit()
            return redirect(url_for('login'))
        except sqlite3.IntegrityError:
            return render_template('register.html', error='نام کاربری قبلاً ثبت شده است.')
        finally:
            conn.close()
    return render_template('register.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        hashed_password = hashlib.sha256(password.encode()).hexdigest()

        conn = get_db_connection()
        user = conn.execute('SELECT * FROM users WHERE username = ? AND password = ?', (username, hashed_password)).fetchone()
        conn.close()

        if user:
            # در اینجا می‌توانید اطلاعات کاربر را در session ذخیره کنید
            return redirect(url_for('conversations'))
        else:
            return render_template('login.html', error='نام کاربری یا رمز عبور اشتباه است.')
    return render_template('login.html')

@app.route('/conversations')
def conversations():
    # لیست مکالمات را از پایگاه داده دریافت کنید
    conn = get_db_connection()
    conversations = conn.execute('SELECT DISTINCT sender_id, receiver_id FROM messages').fetchall()
    conn.close()
    return render_template('conversations.html', conversations=conversations)

@app.route('/conversation/')
def conversation(user_id):
    # پیام‌های مربوط به یک مکالمه خاص را از پایگاه داده دریافت کنید
    conn = get_db_connection()
    messages = conn.execute('SELECT * FROM messages WHERE sender_id = ? OR receiver_id = ?', (user_id, user_id)).fetchall()
    conn.close()
    return render_template('conversation.html', messages=messages, user_id=user_id)

@app.route('/send_message/', methods=['POST'])
def send_message(user_id):
    content = request.form['content']
    # شناسه کاربر فعلی را از session دریافت کنید (فرض می‌کنیم کاربر وارد شده است)
    sender_id = 1  # به عنوان مثال، فرض می‌کنیم شناسه کاربر فعلی 1 است

    conn = get_db_connection()
    conn.execute('INSERT INTO messages (sender_id, receiver_id, content) VALUES (?, ?, ?)', (sender_id, user_id, content))
    conn.commit()
    conn.close()

    return redirect(url_for('conversation', user_id=user_id))

if __name__ == '__main__':
    app.run(debug=True)

این کد شامل مسیرهای مختلفی است:

  • /: صفحه اصلی
  • /register: ثبت‌نام کاربر
  • /login: ورود کاربر
  • /conversations: لیست مکالمات
  • /conversation/: نمایش یک مکالمه خاص
  • /send_message/: ارسال پیام به یک کاربر

4. ساخت قالب‌های HTML

یک دایرکتوری به نام templates ایجاد کنید و فایل‌های HTML زیر را در آن قرار دهید:

  • index.html: صفحه اصلی
  • register.html: فرم ثبت‌نام
  • login.html: فرم ورود
  • conversations.html: لیست مکالمات
  • conversation.html: نمایش یک مکالمه

مثال login.html:

<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required><br>

        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required><br>

        <button type="submit">Login</button>
    </form>
    {% if error %}
        <p style="color: red;">{{ error }}</p>
    {% endif %}
</body>
</html>

سایر فایل‌های HTML را نیز به همین ترتیب ایجاد کنید و فرم‌ها و نمایش‌های مورد نیاز را در آن‌ها قرار دهید.

5. اجرای اپلیکیشن

در ترمینال، به دایرکتوری پروژه خود بروید و اپلیکیشن را اجرا کنید:

python app.py

سپس می‌توانید به آدرس http://127.0.0.1:5000/ در مرورگر خود بروید و اپلیکیشن را مشاهده کنید.

نکات تکمیلی

  • برای امنیت بیشتر، از رمزنگاری قوی‌تر برای رمز عبورها استفاده کنید.
  • از session برای ذخیره اطلاعات کاربر استفاده کنید.
  • از یک کتابخانه CSS مانند Bootstrap برای طراحی رابط کاربری استفاده کنید.
  • از JavaScript برای بهبود تجربه کاربری استفاده کنید.
  • برای مقیاس‌پذیری بیشتر، از یک پایگاه داده قوی‌تر مانند PostgreSQL یا MySQL استفاده کنید.

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

بدون دیدگاه

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

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