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

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

فلاسک یک فریم‌ورک سبک وزن برای وب است که ابزارها و ویژگی‌های مفیدی برای ساخت برنامه‌های وب در زبان پایتون ارائه می‌دهد. PostgreSQL یا Postgres، یک سیستم مدیریت پایگاه داده رابطه‌ای است که پیاده‌سازی زبان کوئری SQL را ارائه می‌کند. این سیستم مطابق استاندارد است و ویژگی‌های پیشرفته‌ای مانند تراکنش‌های قابل اطمینان و همزمانی بدون قفل خواندن دارد.

در این آموزش، یک برنامه کوچک مرور کتاب خواهید ساخت که نشان می‌دهد چگونه از کتابخانه psycopg2، که یک درایور پایگاه داده PostgreSQL برای پایتون است، استفاده کنید تا با پایگاه داده PostgreSQL خود تعامل داشته باشید. این کتابخانه را همراه با فلاسک برای انجام کارهای پایه‌ای مثل اتصال به سرور پایگاه داده، ساخت جداول، وارد کردن داده‌ها به جدول و بازیابی داده‌ها استفاده خواهید کرد.

یک محیط برنامه‌نویسی پایتون ۳ محلی نیاز دارید. می‌توانید آموزش مربوط به نصب و راه‌اندازی محیط برنامه‌نویسی پایتون ۳ را برای توزیع خود دنبال کنید. فرض می‌کنیم دایرکتوری پروژه شما flask_app نام‌گذاری شده است.

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

همچنین باید با مفاهیم پایه HTML آشنایی داشته باشید. می‌توانید سری آموزش ساخت سایت با HTML را برای آشنایی بیشتر مرور کنید.

PostgreSQL باید روی دستگاه محلی شما نصب شده باشد و دسترسی به پرامپت PostgreSQL داشته باشید. آموزش نصب و استفاده از PostgreSQL روی اوبونتو ۲۰.۰۴ را دنبال کنید و آن را تنظیم کنید.

در این مرحله، یک پایگاه داده به نام flask_db و یک کاربر پایگاه داده به نام sammy برای اپلیکیشن فلاسک خود ایجاد خواهید کرد.

در مرحله نصب PostgreSQL، یک کاربر سیستم‌عامل به نام postgres هم ساخته شده است که مربوط به کاربر ادمین PostgreSQL است. برای انجام کارهای مدیریتی باید از این کاربر استفاده کنید. می‌توانید از sudo استفاده کنید و نام کاربر را با گزینه -iu وارد کنید.

برای ورود به جلسه تعاملی PostgreSQL از دستور زیر استفاده کنید:

sudo -iu postgres psql

پرومپت PostgreSQL باز خواهد شد که می‌توانید تنظیمات لازم را انجام دهید.

ابتدا پایگاه داده پروژه خود را ایجاد کنید:

CREATE DATABASE flask_db;

توجه: هر دستور Postgres باید با سمی‌کالن (;) پایان یابد، اگر با مشکل مواجهید، این مورد را بررسی کنید.

سپس یک کاربر پایگاه داده برای پروژه خود بسازید و رمز عبور مطمئنی انتخاب کنید:

CREATE USER sammy WITH PASSWORD 'your_password';

حالا این کاربر را صاحب پایگاه داده flask_db کنید:

ALTER DATABASE flask_db OWNER TO sammy;

برای تأیید ایجاد پایگاه داده، لیست پایگاه داده‌ها را بگیرید:

\l

در لیست مشاهده خواهید کرد که flask_db وجود دارد.

برای خروج از پرامپت PostgreSQL، دستور زیر را وارد کنید:

\q

حالا postgres تنظیم شده است و می‌توانید به کمک کتابخانه psycopg2 با پایتون به آن دسترسی داشته باشید. در مرحله بعد، این کتابخانه را همراه با فلاسک نصب خواهید کرد.

در این مرحله، با فعال بودن محیط مجازی، با pip فلاسک و psycopg2 را نصب کنید:

pip install flask psycopg2-binary

پس از پایان نصب، خروجی مشابه زیر خواهید دید:

Successfully installed flask psycopg2-binary

حالا بسته‌های لازم در محیط مجازی شما نصب شده‌اند. در ادامه اتصال و تنظیم پایگاه داده را انجام می‌دهید.

در این مرحله، یک فایل پایتون به نام init_db.py در دایرکتوری پروژه flask_app بسازید تا به پایگاه داده flask_db متصل شده، جدولی برای ذخیره کتاب‌ها بسازد و نمونه‌ای از داده‌ها را وارد جدول کند.

ابتدا با فعال بودن محیط برنامه‌نویسی، فایل init_db.py را ایجاد و باز کنید.

کد زیر را در init_db.py قرار دهید:

import os
import psycopg2

conn = psycopg2.connect(
    host="localhost",
    database="flask_db",
    user=os.environ['DB_USERNAME'],
    password=os.environ['DB_PASSWORD']
)

cur = conn.cursor()

cur.execute('DROP TABLE IF EXISTS books;')

cur.execute('''
    CREATE TABLE books (
        id SERIAL PRIMARY KEY,
        title VARCHAR(255) NOT NULL,
        author VARCHAR(255) NOT NULL,
        pages INTEGER NOT NULL,
        review TEXT,
        date_added TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );
''')

cur.execute('''
    INSERT INTO books (title, author, pages, review)
    VALUES (%s, %s, %s, %s);
''', ('A Tale of Two Cities', 'Charles Dickens', 489, 'A gripping classic novel.'))

cur.execute('''
    INSERT INTO books (title, author, pages, review)
    VALUES (%s, %s, %s, %s);
''', ('Anna Karenina', 'Leo Tolstoy', 864, 'An epic Russian novel.'))

conn.commit()

cur.close()
conn.close()

در این کد ابتدا ماژول os را برای دسترسی به متغیرهای محیطی وارد می‌کنیم تا نام کاربری و رمز عبور پایگاه داده در کد منبع مشخص نباشد. سپس کتابخانه psycopg2 را وارد می‌کنیم و با تابع psycopg2.connect() به پایگاه داده متصل می‌شویم. هاست همان localhost است. نام پایگاه داده flask_db است. نام کاربری و رمز عبور از متغیرهای محیطی DB_USERNAME و DB_PASSWORD خوانده می‌شوند. سپس یک کرسر می‌سازیم تا بتوانیم دستورهای SQL را اجرا کنیم.

با اجرای دستور DROP TABLE IF EXISTS, اگر جدول books قبلاً وجود داشت حذف می‌شود تا تداخل نداشته باشیم. در ادامه جدول books ایجاد می‌شود که ستون‌های id، title، author، pages، review و date_added دارد.

سپس دو ردیف نمونه وارد جدول می‌شوند که اطلاعات دو کتاب را دارند. از جایگذارهای %s استفاده شده تا از حملات SQL injection جلوگیری شود.

در پایان تغییرات ذخیره شده و اتصال و کرسر بسته می‌شوند.

برای اجرا، متغیرهای محیطی DB_USERNAME و DB_PASSWORD را با نام کاربری و رمز عبور خود تنظیم کنید:

export DB_USERNAME=sammy
export DB_PASSWORD=your_password

حالا فایل init_db.py را با دستور زیر اجرا کنید:

python init_db.py

اگر بدون خطا اجرا شود، جدول books به پایگاه داده flask_db اضافه می‌شود.

برای بررسی، وارد پرامپت postgres شوید:

sudo -iu postgres psql
\c flask_db

داده‌های وارد شده را با کوئری زیر مشاهده کنید:

SELECT title, author FROM books;

خروجی شامل دو کتاب وارد شده است. برای خروج از جلسه \q را بزنید.

در مرحله بعد، یک برنامه فلاسک می‌سازید که به پایگاه داده متصل شده، دو مرور کتاب را بازیابی و در صفحه اصلی نمایش دهد.

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

با فعال بودن محیط برنامه، فایل app.py را در دایرکتوری flask_app باز کنید و کد زیر را در آن قرار دهید:

import os
import psycopg2
from flask import Flask, render_template

app = Flask(__name__)

def get_db_connection():
    conn = psycopg2.connect(
        host="localhost",
        database="flask_db",
        user=os.environ['DB_USERNAME'],
        password=os.environ['DB_PASSWORD']
    )
    return conn

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

در این کد، ابتدا ماژول‌های مورد نیاز را وارد کرده و یک نمونه از برنامه فلاسک می‌سازیم. تابع get_db_connection اتصال به پایگاه داده را برقرار می‌کند. روت / صفحه اصلی، داده‌های جدول books را دریافت و به قالب index.html ارسال می‌کند.

برای نمایش داده‌ها، ابتدا یک قالب پایه می‌سازید تا کد HTML مشترک را نگه دارد. یک دایرکتوری templates بسازید و داخل آن فایل base.html را ایجاد کنید:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>{% block title %}ParminCloud Book Reviews{% endblock %}</title>
  </head>
  <body>
    <nav>
      <a href="{{ url_for('index') }}">Home</a>
    </nav>
    <main>
      {% block content %}{% endblock %}
    </main>
  </body>
</html>

این قالب پایه، کد HTML پایه را دارد. بلوک‌های title و content قابل جایگزینی هستند. منوی ناوبری شامل لینک صفحه اصلی است.

حالا قالب index.html را بسازید و کد زیر را داخل آن قرار دهید:

{% extends 'base.html' %}

{% block title %}Book Reviews{% endblock %}

{% block content %}
  <h1>Book Reviews</h1>
  <ul>
  {% for book in books %}
    <li>{{ book[1] }} by {{ book[2] }}, {{ book[3] }} pages. Review: {{ book[4] }} (Added on {{ book[5] }})</li>
  {% endfor %}
  </ul>
{% endblock %}

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

در دایرکتوری پروژه و با فعال بودن محیط مجازی، متغیر محیطی FLASK_APP را تنظیم کنید تا برنامه فلاسک را معرفی کنید و FLASK_ENV را روی development قرار دهید برای فعالسازی حالت توسعه:

export FLASK_APP=app.py
export FLASK_ENV=development

اگر متغیرهای DB_USERNAME و DB_PASSWORD را قبلاً تنظیم نکرده‌اید، آن‌ها را هم تنظیم کنید:

export DB_USERNAME=sammy
export DB_PASSWORD=your_password

حال برنامه را با دستور زیر اجرا کنید:

flask run

مرورگر خود را باز کرده و به آدرس زیر بروید:

http://127.0.0.1:5000/

دو کتابی که در ابتدا وارد شده بودند را مشاهده خواهید کرد.

حالا باید اجازه دهید کاربران کتاب‌های جدید اضافه کنند. در مرحله بعد مسیر جدیدی برای افزودن کتاب می‌سازید.

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

صفحه جدیدی با فرم دارید که کاربر عنوان کتاب، نویسنده، تعداد صفحات و مرور را وارد می‌کند.

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

from flask import request, redirect, url_for

در انتهای فایل، روت جدید /create را اضافه کنید:

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

        conn = get_db_connection()
        cur = conn.cursor()
        cur.execute('INSERT INTO books (title, author, pages, review) VALUES (%s, %s, %s, %s)',
                    (title, author, pages, review))
        conn.commit()
        cur.close()
        conn.close()
        return redirect(url_for('index'))

    return render_template('create.html')

این روت روش‌های GET و POST را پشتیبانی می‌کند. وقتی صفحه با GET درخواست داده شود، فرم نمایش داده می‌شود. هنگام ارسال فرم با POST، داده‌ها را گرفته و به جدول books اضافه می‌کند و سپس به صفحه اصلی هدایت می‌کند.

یک قالب create.html داخل فولدر templates بسازید و کد زیر را در آن قرار دهید:

{% extends 'base.html' %}

{% block title %}Add a New Book{% endblock %}

{% block content %}
  <h1>Add a New Book</h1>
  <form method="post">
    <label for="title">Title</label>
    <input type="text" name="title" id="title" required>

    <label for="author">Author</label>
    <input type="text" name="author" id="author" required>

    <label for="pages">Pages</label>
    <input type="number" name="pages" id="pages" required>

    <label for="review">Review</label>
    <textarea name="review" id="review"></textarea>

    <button type="submit">Submit</button>
  </form>
{% endblock %}

در این قالب، یک فرم برای وارد کردن اطلاعات کتاب دارید که هنگام ارسال، به روت /create ارسال می‌شود.

با اجرای مجدد سرور توسعه فلاسک، به آدرس /create بروید و فرم را مشاهده کنید. با پر کردن و ارسال فرم، داده جدید به پایگاه داده اضافه و به صفحه اصلی هدایت می‌شوید.

برای اضافه کردن لینک به صفحه Create، فایل base.html را باز کرده و منو را به شکل زیر ویرایش کنید:

<nav>
  <a href="{{ url_for('index') }}">Home</a>
  <a href="{{ url_for('create') }}">Add Book</a>
</nav>

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

شما یک برنامه وب کوچک مرور کتاب ساخته‌اید که با پایگاه داده PostgreSQL ارتباط برقرار می‌کند. این برنامه قابلیت افزودن داده جدید به پایگاه داده، بازیابی و نمایش آن را دارد.

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

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

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

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