چگونه از پایگاه‌دادهٔ SQLite در یک برنامهٔ Flask استفاده کنیم؟

در برنامه‌های وب معمولاً به یک پایگاه داده نیاز دارید که مجموعه‌ای سازماندهی‌شده از داده‌ها است. شما از پایگاه داده برای ذخیره و نگهداری داده‌های پایدار استفاده می‌کنید که بتوان آن‌ها را به طور مؤثر بازیابی و تغییر داد. به عنوان مثال، در یک اپلیکیشن شبکه اجتماعی، یک پایگاه داده دارید که داده‌های کاربری (اطلاعات شخصی، پست‌ها، کامنت‌ها، دنبال‌کنندگان) در آن ذخیره شده و به شکلی قابل مدیریت است. شما می‌توانید داده‌ها را به پایگاه داده اضافه کنید، بازیابی کنید، تغییر دهید یا حذف کنید، بسته به نیازها و شرایط مختلف. در یک اپلیکیشن وب، این نیازها ممکن است شامل افزودن یک پست جدید توسط کاربر، حذف یک پست یا حذف حساب کاربری او باشد، که شاید پست‌هایش حذف نشوند. عملیاتی که برای دستکاری داده انجام می‌دهید بستگی به ویژگی‌های خاص اپلیکیشن شما دارد. مثلاً ممکن است نخواهید کاربران پستی بدون عنوان اضافه کنند.

Flask یک فریم‌ورک سبک وزن Python برای توسعه وب است که ابزارها و قابلیت‌های مفیدی برای ساخت برنامه‌های وب با زبان Python فراهم می‌کند. SQLite یک موتور SQL ساده و سریع با کد باز است که می‌توان از آن با Python برای ذخیره و مدیریت داده‌های اپلیکیشن استفاده کرد. SQLite به خوبی با Python سازگار است چون کتابخانه استاندارد Python ماژول sqlite3 را ارائه می‌دهد که به شما امکان برقراری ارتباط با هر پایگاه داده SQLite را بدون نیاز به نصب اضافی می‌دهد. استفاده از SQLite با Python نیز نسبت به سایر موتورهای پایگاه داده نیاز به راه‌اندازی بسیار کمی دارد.

در این آموزش، شما یک برنامه وب کوچک می‌سازید که نشان می‌دهد چطور می‌توان با Flask و SQLite عملیات پایه‌ای CRUD (ایجاد، خواندن، به‌روزرسانی و حذف) را انجام داد. اپلیکیشن وب شما یک بلاگ ساده خواهد بود که پست‌ها را در صفحه اصلی نمایش می‌دهد. کاربران می‌توانند پست‌های جدید ایجاد کنند، آن‌ها را ویرایش کنند و یا حذف کنند.

راه‌اندازی پایگاه داده SQLite

در این مرحله، باید پایگاه داده SQLite خود را که برای ذخیره داده‌هایتان (پست‌های بلاگ) استفاده می‌کنید، راه‌اندازی کنید و سپس چند نمونه پست وارد کنید.

از ماژول sqlite3 برای ارتباط با پایگاه داده استفاده خواهید کرد که در کتابخانه استاندارد Python موجود است.

داده‌ها در SQLite در جداول و ستون‌ها ذخیره می‌شوند. ابتدا باید جدولی به نام posts با ستون‌های لازم بسازید. یک فایل schema.sql ایجاد کنید و دستورات SQL لازم برای ایجاد جدول posts را داخل آن بنویسید. سپس از این فایل برای ایجاد پایگاه داده استفاده خواهید کرد.

فایل schema.sql را در دایرکتوری flask_app باز کنید و دستورات زیر را در آن وارد کنید (بدون تغییر):

-- Delete the posts table if it exists to avoid conflicts
DROP TABLE IF EXISTS posts;

-- Create the posts table with the necessary columns
CREATE TABLE posts (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  title TEXT NOT NULL,
  content TEXT NOT NULL,
  created TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

حالا یک فایل Python به نام init_db.py برای اجرای این schema ایجاد کنید:

import sqlite3

connection = sqlite3.connect('database.db')

with open('schema.sql') as f:
    connection.executescript(f.read())

cur = connection.cursor()

cur.execute("INSERT INTO posts (title, content) VALUES (?, ?)",
            ('Sample Post 1', 'This is the content for the first post')
            )

cur.execute("INSERT INTO posts (title, content) VALUES (?, ?)",
            ('Sample Post 2', 'This is the content for the second post')
            )

connection.commit()
connection.close()

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

python init_db.py

فایل database.db در دایرکتوری flask_app ساخته خواهد شد که پایگاه داده شما است.

ساخت اپلیکیشن Flask و نمایش پست‌ها

فایل app.py را بسازید و کد زیر را در آن قرار دهید:

import sqlite3
from flask import Flask, render_template

app = Flask(__name__)

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

@app.route('/')
def index():
    conn = get_db_connection()
    posts = conn.execute('SELECT * FROM posts').fetchall()
    conn.close()
    return render_template('index.html', posts=posts)

تابع get_db_connection یک اتصال به پایگاه داده باز می‌کند و row_factory را طوری تنظیم می‌کند که بتوانید به ستون‌ها با نام دسترسی داشته باشید. تابع index همه پست‌ها را می‌خواند و آن‌ها را به قالب index.html ارسال می‌کند.

قالب base.html

یک پوشه templates ایجاد کنید و فایل base.html را با محتوای زیر بسازید:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>{% block title %}Blog{% endblock %}</title>
    <style>
      body {
        font-family: Arial, sans-serif;
      }
      nav a {
        margin-right: 15px;
      }
      .alert {
        color: red;
      }
    </style>
  </head>
  <body>
    <nav>
      <a href="{{ url_for('index') }}">Home</a>
      <a href="{{ url_for('create') }}">Create</a>
    </nav>
    {% with messages = get_flashed_messages() %}
      {% if messages %}
        {% for message in messages %}
          <div class="alert">{{ message }}</div>
        {% endfor %}
      {% endif %}
    {% endwith %}
    {% block content %}{% endblock %}
  </body>
</html>

قالب index.html

فایل index.html را در پوشه templates بسازید یا ویرایش کنید:

{% extends 'base.html' %}

{% block title %}Home{% endblock %}

{% block content %}
  <h1>Posts</h1>
  {% for post in posts %}
    <article>
      <h2>{{ post['title'] }}</h2>
      <div>{{ post['created'] }}</div>
      <p>{{ post['content'] }}</p>
      <a href="{{ url_for('edit', id=post['id']) }}">Edit</a>
    </article>
  {% endfor %}
{% endblock %}

راه‌اندازی سرور Flask

در ترمینال و داخل دایرکتوری flask_app، با محیط مجازی فعال، این دستورات را اجرا کنید (در Linux/Mac):

export FLASK_APP=app.py
export FLASK_ENV=development
flask run

در ویندوز به جای export از set استفاده کنید.

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

پیاده‌سازی ایجاد پست جدید با فرم وب و فلاش پیام

app.py را باز کرده و موارد زیر را به اول فایل اضافه کنید:

from flask import request, redirect, url_for, flash

app.config['SECRET_KEY'] = 'your-secret-key'  # Replace with a secure random key

و سپس این مسیر را در پایین فایل اضافه کنید:

@app.route('/create', methods=('GET', 'POST'))
def create():
    if request.method == 'POST':
        title = request.form['title']
        content = request.form['content']

        if not title:
            flash('Title is required!')
        elif not content:
            flash('Content is required!')
        else:
            conn = get_db_connection()
            conn.execute('INSERT INTO posts (title, content) VALUES (?, ?)',
                         (title, content))
            conn.commit()
            conn.close()
            return redirect(url_for('index'))

    return render_template('create.html')

یک قالب create.html با محتوای زیر ایجاد کنید:

{% extends 'base.html' %}

{% block title %}Create{% endblock %}

{% block content %}
  <h1>Add a New Post</h1>
  <form method="post">
    <label for="title">Title</label>
    <input type="text" name="title" id="title" value="{{ request.form['title'] }}">
    <label for="content">Content</label>
    <textarea name="content" id="content">{{ request.form['content'] }}</textarea>
    <input type="submit" value="Submit">
  </form>
{% endblock %}

ویرایش و حذف پست‌ها

در app.py توابع زیر و مسیرها برای گرفتن یک پست، ویرایش و حذف اضافه کنید. توجه کنید کامنت‌ها به زبان انگلیسی باقی بمانند و کامندها و کدها تغییر نکنند.

from flask import abort

def get_post(post_id):
    conn = get_db_connection()
    post = conn.execute('SELECT * FROM posts WHERE id = ?', (post_id,)).fetchone()
    conn.close()
    if post is None:
        abort(404)
    return post

@app.route('/<int:id>/edit/', methods=('GET', 'POST'))
def edit(id):
    post = get_post(id)

    if request.method == 'POST':
        title = request.form['title']
        content = request.form['content']

        if not title:
            flash('Title is required!')
        elif not content:
            flash('Content is required!')
        else:
            conn = get_db_connection()
            conn.execute('UPDATE posts SET title = ?, content = ? WHERE id = ?',
                         (title, content, id))
            conn.commit()
            conn.close()
            return redirect(url_for('index'))

    return render_template('edit.html', post=post)


@app.route('/<int:id>/delete', methods=('POST',))
def delete(id):
    post = get_post(id)
    conn = get_db_connection()
    conn.execute('DELETE FROM posts WHERE id = ?', (id,))
    conn.commit()
    conn.close()
    flash('"{}" was successfully deleted!'.format(post['title']))
    return redirect(url_for('index'))

قالب edit.html را ایجاد کنید:

{% extends 'base.html' %}

{% block title %}Edit "{{ post['title'] }}"{% endblock %}

{% block content %}
  <h1>Edit "{{ post['title'] }}"</h1>
  <form method="post">
    <label for="title">Title</label>
    <input type="text" name="title" id="title" value="{{ request.form['title'] or post['title'] }}">
    <label for="content">Content</label>
    <textarea name="content" id="content">{{ request.form['content'] or post['content'] }}</textarea>
    <input type="submit" value="Submit">
  </form>

  <hr>

  <form method="post" action="{{ url_for('delete', id=post['id']) }}" onsubmit="return confirm('Are you sure you want to delete this post?');">
    <input type="submit" value="Delete">
  </form>
{% endblock %}

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

آماده‌سازی برای استقرار در محیط تولید با پشتیبانی CORS

برای استقرار برنامه Flask خود در محیط تولیدی که محافظت مرورگر با CORS (Cross-Origin Resource Sharing) را دارد، لازم است چند گام مهم انجام شود:

  • استفاده از سرور تولیدی مناسب مانند Gunicorn به جای سرور توسعه Flask.
  • انتشار برنامه در یک سرویس میزبانی یا هاست ابری مثل پارمین کلود، با تنظیمات شبکه مناسب.
  • فعال کردن و پیکربندی CORS به کمک افزونه flask-cors.
  • محدود کردن منابع قابل دسترسی با CORS (اجازه دادن به دامین‌های مشخص یا همه).
  • راه‌اندازی HTTPS و تنظیمات امنیتی دیگر برای تولید.

قدم‌های عملی به شکل زیر هستند:

1. نصب flask-cors

pip install flask-cors

2. اضافه کردن flask-cors به برنامه شما

در فایل app.py، flask-cors را وارد کنید و آن را به اپلیکیشن اضافه کنید:

from flask_cors import CORS

app = Flask(__name__)
CORS(app)

اگر می‌خواهید فقط به یک یا چند منبع خاص اجازه دهید، مثال زیر را استفاده کنید:

CORS(app, resources={r"/*": {"origins": "https://yourdomain.com"}})

3. اجرای اپلیکیشن با Gunicorn (به جای flask run)

با نصب Gunicorn:

pip install gunicorn

و اجرای دستور زیر برای شروع اپلیکیشن:

gunicorn --bind 0.0.0.0:8000 app:app

4. تنظیم سرور و DNS

برنامه را روی یک plan در پارمین کلود مستقر کنید، و آدرس دامنه خود را به IP سرور اشاره دهید.

5. تنظیم HTTPS و امنیت

از یک reverse proxy مثل Nginx همراه با Let’s Encrypt برای SSL و HTTPS استفاده کنید.

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

 

از همراهی شما با پارمین کلود متشکریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

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

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