كيفية استخدام قاعدة بيانات PostgreSQL في تطبيق Flask

اختار الكاتب صندوق الصناديق المفتوحة والمجانية لتلقي تبرع كجزء من برنامج كتابة من أجل التبرعات.

مقدمة

في تطبيقات الويب، عادةً ما تحتاج إلى قاعدة بيانات، وهي مجموعة منظمة من البيانات. تستخدم قاعدة البيانات لتخزين البيانات الدائمة والتي يمكن استرجاعها وتلاعبها بكفاءة. على سبيل المثال، في تطبيق وسائل التواصل الاجتماعي، لديك قاعدة بيانات يتم تخزين بيانات المستخدم (المعلومات الشخصية، المنشورات، التعليقات، المتابعين) فيها بطريقة يمكن تلاعبها بكفاءة. يمكنك إضافة بيانات إلى قاعدة بيانات، واسترجاعها، وتعديلها، أو حذفها، اعتمادًا على متطلبات وشروط مختلفة. في تطبيق الويب، قد تكون هذه المتطلبات هي إضافة مستخدم جديد للمنشور، أو حذف المنشور، أو حذف حسابهم، والذي قد يحذف أو لا يحذف منشوراتهم. ستعتمد الإجراءات التي تقوم بها لتلاعب البيانات على الميزات الخاصة بتطبيقك. على سبيل المثال، قد لا ترغب في أن يتمكن المستخدمون من إضافة منشورات بدون عناوين.

Flask هو إطار عمل ويب خفيف لغة Python يوفر أدوات وميزات مفيدة لإنشاء تطبيقات الويب بلغة Python. PostgreSQL، أو Postgres، هو نظام إدارة قواعد البيانات العلائقية يوفر تنفيذًا للغة الاستعلام SQL. إنه متوافق مع المعايير ويحتوي على العديد من الميزات المتقدمة مثل المعاملات الموثوقة وتوازن الفرز بدون قفل القراءة.

في هذا البرنامج التعليمي، سوف تقوم ببناء تطبيق ويب صغير لمراجعة الكتب يظهر كيفية استخدام مكتبة psycopg2، وهو محول قاعدة بيانات PostgreSQL الذي يسمح لك بالتفاعل مع قاعدة بيانات PostgreSQL الخاصة بك بلغة Python. ستستخدمه مع Flask لأداء المهام الأساسية، مثل الاتصال بخادم قاعدة بيانات، وإنشاء الجداول، وإدراج البيانات في الجدول، واسترجاع البيانات من الجدول.

المتطلبات

الخطوة 1 — إنشاء قاعدة بيانات PostgreSQL ومستخدم

في هذه الخطوة، ستقوم بإنشاء قاعدة بيانات تسمى flask_db ومستخدم قاعدة بيانات يُسمى sammy لتطبيق Flask الخاص بك.

أثناء تثبيت Postgres، تم إنشاء مستخدم نظام تشغيل يُسمى postgres ليتوافق مع مستخدم PostgreSQL الإداري postgres. يجب عليك استخدام هذا المستخدم لأداء المهام الإدارية. يمكنك استخدام sudo وتمرير اسم المستخدم مع الخيار -iu.

قم بتسجيل الدخول إلى جلسة تفاعلية لـ Postgres باستخدام الأمر التالي:

  1. sudo -iu postgres psql

سيتم منحك موجه PostgreSQL حيث يمكنك إعداد متطلباتك.

أولاً، قم بإنشاء قاعدة بيانات لمشروعك:

  1. CREATE DATABASE flask_db;

ملاحظة: يجب أن تنتهي كل عبارة PostgreSQL بفاصلة منقوطة، لذا تأكد من أن أمرك ينتهي بواحدة إذا كنت تواجه مشكلات.

بعد ذلك، قم بإنشاء مستخدم قاعدة بيانات لمشروعنا. تأكد من اختيار كلمة مرور آمنة:

  1. CREATE USER sammy WITH PASSWORD 'password';

ثم قم بمنح هذا المستخدم الجديد صلاحية إدارة قاعدة البيانات الجديدة الخاصة بك:

  1. GRANT ALL PRIVILEGES ON DATABASE flask_db TO sammy;

لتأكيد إنشاء قاعدة البيانات، احصل على قائمة القواعد البيانات عن طريق كتابة الأمر التالي:

  1. \l

سوف ترى flask_db في قائمة قواعد البيانات.

عند الانتهاء، اخرج من موجه PostgreSQL عن طريق كتابة:

  1. \q

تم تهيئة PostgreSQL الآن بحيث يمكنك الاتصال بمعلومات قاعدة البيانات الخاصة به وإدارتها عبر Python باستخدام مكتبة psycopg2. فيما يلي، ستقوم بتثبيت هذه المكتبة جنبًا إلى جنب مع حزمة Flask.

الخطوة 2 — تثبيت Flask و psycopg2

في هذه الخطوة، ستقوم بتثبيت Flask ومكتبة psycopg2 لتتفاعل مع قاعدة البيانات الخاصة بك باستخدام Python.

عند تنشيط بيئتك الافتراضية، استخدم pip لتثبيت Flask ومكتبة psycopg2:

  1. pip install Flask psycopg2-binary

بمجرد اكتمال التثبيت بنجاح، سترى سطرًا مماثلاً للتالي في نهاية الإخراج:

Output
Successfully installed Flask-2.0.2 Jinja2-3.0.3 MarkupSafe-2.0.1 Werkzeug-2.0.2 click-8.0.3 itsdangerous-2.0.1 psycopg2-binary-2.9.2

لديك الآن الحزم المطلوبة مثبتة على بيئتك الافتراضية. بعد ذلك، ستتصل بقاعدة بياناتك وتقوم بإعدادها.

الخطوة 3 — إعداد قاعدة بيانات

في هذه الخطوة، ستقوم بإنشاء ملف Python في دليل مشروع flask_app الخاص بك للاتصال بقاعدة البيانات flask_db، وإنشاء جدول لتخزين الكتب، وإدراج بعض الكتب مع التقييمات فيه.

أولاً، باستخدام بيئة البرمجة الخاصة بك مُفعلة، افتح ملفًا جديدًا يسمى init_db.py في دليل flask_app الخاص بك.

  1. nano init_db.py

سيقوم هذا الملف بفتح اتصال بقاعدة البيانات flask_db، وإنشاء جدول يسمى books، وملء الجدول باستخدام بيانات عينة. أضف الكود التالي إليه:

flask_app/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 (150) NOT NULL,'
                                 'author varchar (50) NOT NULL,'
                                 'pages_num integer NOT NULL,'
                                 'review text,'
                                 'date_added date DEFAULT CURRENT_TIMESTAMP);'
                                 )

# إدراج البيانات في الجدول

cur.execute('INSERT INTO books (title, author, pages_num, review)'
            'VALUES (%s, %s, %s, %s)',
            ('A Tale of Two Cities',
             'Charles Dickens',
             489,
             'A great classic!')
            )


cur.execute('INSERT INTO books (title, author, pages_num, review)'
            'VALUES (%s, %s, %s, %s)',
            ('Anna Karenina',
             'Leo Tolstoy',
             864,
             'Another great classic!')
            )

conn.commit()

cur.close()
conn.close()

احفظ وأغلق الملف.

في هذا الملف، تقوم أولاً بتوريد وحدة os التي ستستخدمها للوصول إلى متغيرات البيئة حيث ستقوم بتخزين اسم المستخدم وكلمة المرور الخاصة بقاعدة البيانات الخاصة بك بحيث لا تكون مرئية في كود المصدر الخاص بك.

تقوم بتوريد مكتبة psycopg2. ثم تقوم بفتح اتصال بقاعدة البيانات flask_db باستخدام دالة psycopg2.connect(). تحدد المضيف، الذي هو localhost في هذه الحالة. تمرر اسم قاعدة البيانات إلى المعلمة database.

تقوم بتوفير اسم المستخدم وكلمة المرور الخاصة بك عبر كائن os.environ، الذي يمنحك الوصول إلى متغيرات البيئة التي قمت بتعيينها في بيئة برمجية. ستقوم بتخزين اسم المستخدم لقاعدة البيانات في متغير بيئي يسمى DB_USERNAME وكلمة المرور في متغير بيئي يسمى DB_PASSWORD. يتيح لك ذلك تخزين اسم المستخدم وكلمة المرور خارج الشفرة المصدرية الخاصة بك، بحيث لا يتم تسريب معلوماتك الحساسة عند حفظ الشفرة المصدرية في التحكم بالمصدر أو رفعها إلى خادم على الإنترنت. حتى لو اكتسب المهاجم وصولًا إلى الشفرة المصدرية الخاصة بك، فلن يحصلوا على وصول إلى قاعدة البيانات.

تقوم بإنشاء مؤشر يسمى cur باستخدام الطريقة connection.cursor()، التي تسمح للشفرة البرمجية في Python بتنفيذ أوامر PostgreSQL في جلسة قاعدة البيانات.

تستخدم طريقة execute() للمؤشر لحذف جدول books إذا كان موجودًا بالفعل. يتجنب هذا الإجراء احتمال وجود جدول آخر يحمل نفس الاسم books، مما قد يؤدي إلى سلوك مربك (على سبيل المثال، إذا كانت لديه أعمدة مختلفة). هذا ليس الحال هنا، لأنك لم تقم بإنشاء الجدول بعد، لذلك لن يتم تنفيذ الأمر SQL. يرجى ملاحظة أن هذا سيحذف جميع البيانات الحالية كلما قمت بتنفيذ هذا الملف init_db.py. بالنسبة لأغراضنا، ستقوم بتنفيذ هذا الملف مرة واحدة فقط لبدء قاعدة البيانات، ولكن قد ترغب في تنفيذه مرة أخرى لحذف أي بيانات قمت بإدخالها والبدء من جديد بالبيانات النموذجية الأولية.

ثم تستخدم CREATE TABLE books لإنشاء جدول يحمل اسم books مع الأعمدة التالية:

  • id: معرف من نوع serial، وهو عبارة عن عدد صحيح يتزايد تلقائيًا. تمثل هذه العمود المفتاح الرئيسي الذي تحدده باستخدام كلمات PRIMARY KEY. ستقوم قاعدة البيانات بتعيين قيمة فريدة لهذا المفتاح لكل إدخال.
  • title: عنوان الكتاب من نوع varchar، وهو نوع حرفي ذو طول متغير مع حد. varchar (150) يعني أن العنوان يمكن أن يصل إلى 150 حرفًا. NOT NULL يشير إلى أن هذا العمود لا يمكن أن يكون فارغًا.
  • author: مؤلف الكتاب، مع حد يبلغ 50 حرفًا. NOT NULL يشير إلى أن هذا العمود لا يمكن أن يكون فارغًا.
  • pages_num: عدد صحيح يمثل عدد الصفحات في الكتاب. NOT NULL يشير إلى أن هذا العمود لا يمكن أن يكون فارغًا.
  • استعراض: استعراض الكتاب. نوع النص يدل على أنه يمكن أن يكون الاستعراض نصًا طويلاً بأي حجم.
  • date_added: تاريخ إضافة الكتاب إلى الجدول. تعيين DEFAULT القيمة الافتراضية للعمود إلى CURRENT_TIMESTAMP، وهو الوقت الذي تم فيه إضافة الكتاب إلى قاعدة البيانات. تمامًا مثل id، لا تحتاج إلى تحديد قيمة لهذا العمود، لأنه سيتم ملؤه تلقائيًا.

بعد إنشاء الجدول، تستخدم طريقة execute() للمؤشر لإدراج كتابين في الجدول، قصة مدينتين لتشارلز ديكنز، و آنا كارينينا لليو تولستوي. تستخدم علامة الاستبدال %s لتمرير القيم إلى البيان الجدي. psycopg2 يتعامل مع الإدراج في الخلفية بطريقة تمنع هجمات حقن SQL.

بمجرد الانتهاء من إدراج بيانات الكتب في الجدول، تستخدم connection.commit() الطريقة لتأكيد العملية وتطبيق التغييرات على قاعدة البيانات. ثم تقوم بتنظيف الأمور عن طريق إغلاق المؤشر بـ cur.close()، والاتصال بـ conn.close().

لتأسيس الاتصال بقاعدة البيانات، قم بتعيين المتغيرات البيئية DB_USERNAME و DB_PASSWORD بتشغيل الأوامر التالية. تذكر استخدام اسم المستخدم وكلمة المرور الخاصة بك:

  1. export DB_USERNAME="sammy"
  2. export DB_PASSWORD="password"

الآن، قم بتشغيل ملف init_db.py الخاص بك في الطرفية باستخدام الأمر python:

  1. python init_db.py

بمجرد انتهاء تنفيذ الملف دون وجود أخطاء، سيتم إضافة جدول books جديد إلى قاعدة البيانات flask_db.

قم بتسجيل الدخول إلى جلسة تفاعلية لـ Postgres للاطلاع على جدول books الجديد.

  1. sudo -iu postgres psql

اتصل بقاعدة البيانات flask_db باستخدام أمر \c:

  1. \c flask_db

ثم استخدم عبارة SELECT للحصول على عناوين الكتب والمؤلفين من جدول books:

  1. SELECT title, author FROM books;

سترى إخراجًا مثل الآتي:

        title         |      author
----------------------+------------------
 A Tale of Two Cities | Charles Dickens
 Anna Karenina        | Leo Tolstoy

أنهِ الجلسة التفاعلية بـ \q.

بعد ذلك، ستقوم بإنشاء تطبيق Flask صغير، والاتصال بقاعدة البيانات، واسترداد مراجعتي الكتاب اللتين أدخلتهما إلى قاعدة البيانات، وعرضهما على صفحة الفهرس.

الخطوة ٤ — عرض الكتب

في هذه الخطوة، ستقوم بإنشاء تطبيق Flask مع صفحة فهرس تسترد الكتب الموجودة في قاعدة البيانات، وتعرضها.

عند تفعيل بيئة البرمجة الخاصة بك وتثبيت Flask، افتح ملفًا يسمى app.py للتحرير داخل دليل flask_app:

  1. nano app.py

سيقوم هذا الملف بإعداد اتصال قاعدة البيانات الخاصة بك وإنشاء مسار Flask واحد لاستخدام هذا الاتصال. أضف الكود التالي إلى الملف:

flask_app/app.py
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)

احفظ وأغلق الملف.

هنا، تقوم بإستيراد وحدة os، ومكتبة psycopg2، وفئة Flask و render_template() من الحزمة flask. تقوم بإنشاء مثيل لتطبيق Flask تسميه app.

تقوم بتعريف وظيفة تسميها get_db_connection()، التي تفتح اتصالًا بقاعدة البيانات flask_db باستخدام اسم المستخدم وكلمة المرور التي تخزنها في متغيرات البيئة DB_USERNAME و DB_PASSWORD. تعيد الوظيفة كائن الاتصال conn الذي ستستخدمه للوصول إلى قاعدة البيانات.

ثم تقوم بإنشاء مسار رئيسي / ووظيفة عرض تسميها index() باستخدام مزيّن app.route(). في وظيفة العرض index()، تفتح اتصالًا بقاعدة البيانات باستخدام وظيفة get_db_connection()، تنشئ مؤشرًا، وتنفذ البيانات الفكرية SELECT * FROM books; للحصول على جميع الكتب الموجودة في قاعدة البيانات. تستخدم طريقة fetchall() لحفظ البيانات في متغير يسمى books. ثم تغلق المؤشر والاتصال. وأخيرًا، تعيد استدعاء وظيفة render_template() لتقديم ملف القالب الذي يسمى index.html مررًا له قائمة الكتب التي حصلت عليها من قاعدة البيانات في المتغير books.

لعرض الكتب التي تمتلكها في قاعدة البيانات الخاصة بك على صفحة الفهرس، ستقوم أولاً بإنشاء قالب أساسي، الذي سيحتوي على جميع رموز HTML الأساسية التي ستستخدمها القوالب الأخرى أيضًا لتجنب تكرار الشفرة. ثم ستقوم بإنشاء ملف القالب index.html الذي ستقوم بتقديمه في وظيفة index() الخاصة بك. لمعرفة المزيد حول القوالب، انظر إلى كيفية استخدام القوالب في تطبيق Flask.

قم بإنشاء مجلد يدعى templates، ثم افتح قالبًا جديدًا يُسمى base.html:

  1. mkdir templates
  2. nano templates/base.html

أضف الشفرة التالية داخل ملف base.html:

flask_app/templates/base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %} {% endblock %}- FlaskApp</title>
    <style>
        nav a {
            color: #d64161;
            font-size: 3em;
            margin-left: 50px;
            text-decoration: none;
        }

        .book {
            padding: 20px;
            margin: 10px;
            background-color: #f7f4f4;
        }

        .review {
                margin-left: 50px;
                font-size: 20px;
        }

    </style>
</head>
<body>
    <nav>
        <a href="{{ url_for('index') }}">FlaskApp</a>
        <a href="#">About</a>
    </nav>
    <hr>
    <div class="content">
        {% block content %} {% endblock %}
    </div>
</body>
</html>

احفظ وأغلق الملف.

يحتوي هذا القالب الأساسي على جميع تخطيط HTML الذي ستحتاج إليه لإعادة استخدامه في القوالب الأخرى. سيتم استبدال الكتلة title لتحديد عنوان لكل صفحة، وسيتم استبدال الكتلة content بمحتوى كل صفحة. شريط التنقل يحتوي على رابطين، أحدهما لصفحة الفهرس حيث تستخدم دالة المساعد url_for() لربطه بوظيفة العرض index()، والآخر لصفحة حول إذا اخترت تضمينها في تطبيقك.

بعد ذلك، افتح قالبًا يُسمى index.html. هذا هو القالب الذي أشرت إليه في ملف app.py:

  1. nano templates/index.html

أضف الشفرة التالية إليه:

flask_app/templates/index.html

{% extends 'base.html' %}

{% block content %}
    <h1>{% block title %} Books {% endblock %}</h1>
    {% for book in books %}
        <div class='book'>
            <h3>#{{ book[0] }} - {{ book[1] }} BY {{ book[2] }}</h3>
            <i><p>({{ book[3] }} pages)</p></i>
            <p class='review'>{{ book[4] }}</p>
            <i><p>Added {{ book[5] }}</p></i>
        </div>
    {% endfor %}
{% endblock %}

احفظ وأغلق الملف.

في هذا الملف، تمتد من القالب الأساسي، ويتم استبدال محتويات الكتلة content. تستخدم عنوانًا <h1> الذي يعمل أيضًا كعنوان.

تستخدم حلقة Jinja for loop في السطر {% for book in books %} للانتقال عبر كل كتاب في قائمة books. تعرض معرّف الكتاب، الذي هو العنصر الأول باستخدام book[0]. ثم تعرض عنوان الكتاب، والمؤلف، وعدد الصفحات، والمراجعة، وتاريخ إضافة الكتاب.

بينما تكون في الدليل flask_app وتكون البيئة الظاهرية مفعلة، قم بإعلام Flask عن التطبيق (app.py في هذه الحالة) باستخدام متغير البيئة FLASK_APP. ثم ضبط متغير البيئة FLASK_ENV إلى development لتشغيل التطبيق في وضع التطوير والحصول على وصول إلى مصحح الأخطاء. لمزيد من المعلومات حول مصحح الأخطاء في Flask، انظر كيفية التعامل مع الأخطاء في تطبيق Flask. استخدم الأوامر التالية للقيام بذلك:

  1. export FLASK_APP=app
  2. export FLASK_ENV=development

تأكد من ضبط متغيرات البيئة DB_USERNAME و DB_PASSWORD إذا لم تكن قد قمت بذلك بالفعل:

  1. export DB_USERNAME="sammy"
  2. export DB_PASSWORD="password"

بعد ذلك، قم بتشغيل التطبيق:

  1. flask run

مع تشغيل خادم التطوير، قم بزيارة الرابط التالي باستخدام متصفحك:

http://127.0.0.1:5000/

سترى الكتب التي قمت بإضافتها إلى قاعدة البيانات في المرة الأولى.

لقد قمت بعرض الكتب في قاعدة البيانات على صفحة الفهرس. الآن تحتاج إلى السماح للمستخدمين بإضافة كتب جديدة. ستقوم بإضافة مسار جديد لإضافة الكتب في الخطوة التالية.

الخطوة 5 — إضافة كتب جديدة

في هذه الخطوة، ستقوم بإنشاء مسار جديد لإضافة كتب جديدة ومراجعات إلى قاعدة البيانات.

ستقوم بإضافة صفحة تحتوي على نموذج ويب حيث يدخل المستخدمون عنوان الكتاب، واسم الكاتب، وعدد الصفحات، ومراجعة الكتاب.

اترك خادم التطوير يعمل وافتح نافذة أوامر جديدة.

أولاً، افتح ملفك app.py:

  1. nano app.py

لمعالجة النموذج الويب، ستحتاج إلى استيراد بعض الأشياء من حزمة flask:

  • كائن الطلب request العالمي للوصول إلى البيانات المقدمة.
  • وظيفة url_for() لتوليد عناوين URL.
  • وظيفة redirect() لتوجيه المستخدمين إلى صفحة الفهرس بعد إضافة كتاب إلى قاعدة البيانات.

أضف هذه الاستيرادات إلى السطر الأول في الملف:

flask_app/app.py

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

# ...

ثم أضف المسار التالي في نهاية ملف app.py:

flask_app/app.py

# ...


@app.route('/create/', methods=('GET', 'POST'))
def create():
    return render_template('create.html')

احفظ وأغلق الملف.

في هذا المسار، تمر بالتصويبة ('GET', 'POST') إلى المعلمة methods للسماح بالطلبات GET و POST على حد سواء. تُستخدم الطلبات GET لاسترجاع البيانات من الخادم، بينما تُستخدم الطلبات POST لنشر البيانات إلى مسار معين. بشكل افتراضي، يُسمح فقط بالطلبات GET. عندما يُطلب المستخدم لأول مرة مسار /create باستخدام طلب GET، سيتم تقديم ملف قالب يُسمى create.html. فيما بعد، ستقوم بتحرير هذا المسار للتعامل مع الطلبات POST عندما يقوم المستخدمون بملء وتقديم النموذج الويب لإضافة كتب جديدة.

افتح القالب الجديد create.html:

  1. nano templates/create.html

أضف الكود التالي إليه:

flask_app/templates/create.html
{% extends 'base.html' %}

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

        <p>
            <label for="author">Author</label>
            <input type="text" name="author"
                   placeholder="Book author">
            </input>
        </p>

        <p>
            <label for="pages_num">Number of pages</label>
            <input type="number" name="pages_num"
                   placeholder="Number of pages">
            </input>
        </p>
        <p>
        <label for="review">Review</label>
        <br>
        <textarea name="review"
                  placeholder="Review"
                  rows="15"
                  cols="60"
                  ></textarea>
        </p>
        <p>
            <button type="submit">Submit</button>
        </p>
    </form>
{% endblock %}

احفظ وأغلق الملف.

قمت بتمديد القالب الأساسي، وضبط عنوان كعنوان، واستخدام علامة <form> مع السمة method المضبوطة على post للإشارة إلى أن النموذج سيُرسل طلب POST.

لديك حقل نصي بالاسم title، الذي ستستخدمه للوصول إلى بيانات العنوان في مسار /create الخاص بك.

لديك حقل نصي للمؤلف، وحقل رقمي لعدد الصفحات، ومنطقة نصية لمراجعة الكتاب.

وأخيرًا، لديك زر Submit في نهاية النموذج.

الآن، مع تشغيل الخادم التطويري، استخدم متصفحك للانتقال إلى مسار /create:

http://127.0.0.1:5000/create

سترى صفحة إضافة كتاب جديد مع حقل إدخال لعنوان الكتاب، واحد للمؤلف، واحد لعدد الصفحات في الكتاب، منطقة نصية لمراجعة الكتاب، وزر Submit.

إذا قمت بملء النموذج وأرسلته، مرسلًا طلب POST إلى الخادم، لن يحدث شيء لأنك لم تتعامل مع طلبات POST على مسار /create.

افتح app.py لتتعامل مع الطلب POST الذي يقدمه المستخدم:

  1. nano app.py

عدل المسار /create ليظهر على النحو التالي:

flask_app/app.py

# ...

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

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

    return render_template('create.html')

احفظ وأغلق الملف.

تتعامل مع طلبات POST داخل شرط if request.method == 'POST'. تستخرج العنوان، والمؤلف، وعدد الصفحات، والمراجعة التي يقدمها المستخدم من كائن request.form.

تفتح قاعدة بيانات باستخدام وظيفة get_db_connection()، وتنشئ مؤشرًا. ثم تنفذ عبارة SQL INSERT INTO لإدراج العنوان، والمؤلف، وعدد الصفحات، والمراجعة التي قدمها المستخدم إلى جدول books.

تؤكد العملية وتغلق المؤشر والاتصال.

وأخيرًا، تعيد توجيه المستخدم إلى صفحة الفهرس حيث يمكنه رؤية الكتاب الجديد المضاف أسفل الكتب الموجودة بالفعل.

مع تشغيل خادم التطوير، استخدم متصفحك للانتقال إلى مسار /create:

http://127.0.0.1:5000/create

املأ النموذج ببعض البيانات وقم بإرساله.

سيتم توجيهك إلى صفحة الفهرس حيث سترى مراجعة كتابك الجديدة.

بعد ذلك، ستقوم بإضافة رابط إلى صفحة الإنشاء في شريط التنقل. افتح base.html:

  1. nano templates/base.html

عدل الملف ليظهر على النحو التالي:

flask_app/templates/base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{% block title %} {% endblock %} - FlaskApp</title>
    <style>
        nav a {
            color: #d64161;
            font-size: 3em;
            margin-left: 50px;
            text-decoration: none;
        }

        .book {
            padding: 20px;
            margin: 10px;
            background-color: #f7f4f4;
        }

        .review {
                margin-left: 50px;
                font-size: 20px;
        }

    </style>
</head>
<body>
    <nav>
        <a href="{{ url_for('index') }}">FlaskApp</a>
        <a href="{{ url_for('create') }}">Create</a>
        <a href="#">About</a>
    </nav>
    <hr>
    <div class="content">
        {% block content %} {% endblock %}
    </div>
</body>
</html>

احفظ وأغلق الملف.

هنا، أضف رابطًا <a> جديدًا إلى شريط التنقل يشير إلى الصفحة الخاصة بالإنشاء.

قم بتحديث صفحة الفهرس وسترى الرابط الجديد في شريط التنقل.

لديك الآن صفحة تحتوي على نموذج ويب لإضافة مراجعات الكتب الجديدة. لمزيد من المعلومات حول نماذج الويب، انظر كيفية استخدام نماذج الويب في تطبيق Flask. لطريقة أكثر تقدمًا وأمانًا لإدارة نماذج الويب، انظر كيفية استخدام والتحقق من صحة نماذج الويب باستخدام Flask-WTF.

الاستنتاج

لقد بنيت تطبيق ويب صغير لمراجعات الكتب يتواصل مع قاعدة بيانات PostgreSQL. لديك وظائف قاعدة بيانات أساسية في تطبيق Flask الخاص بك، مثل إضافة بيانات جديدة إلى قاعدة البيانات، واسترداد البيانات، وعرضها على الصفحة.

إذا كنت ترغب في قراءة المزيد حول Flask، تحقق من الدروس الأخرى في سلسلة Flask.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-a-postgresql-database-in-a-flask-application