اختار الكاتب صندوق الصناديق المفتوحة والمجانية لتلقي تبرع كجزء من برنامج كتابة من أجل التبرعات.
مقدمة
في تطبيقات الويب، عادةً ما تحتاج إلى قاعدة بيانات، وهي مجموعة منظمة من البيانات. تستخدم قاعدة البيانات لتخزين البيانات الدائمة والتي يمكن استرجاعها وتلاعبها بكفاءة. على سبيل المثال، في تطبيق وسائل التواصل الاجتماعي، لديك قاعدة بيانات يتم تخزين بيانات المستخدم (المعلومات الشخصية، المنشورات، التعليقات، المتابعين) فيها بطريقة يمكن تلاعبها بكفاءة. يمكنك إضافة بيانات إلى قاعدة بيانات، واسترجاعها، وتعديلها، أو حذفها، اعتمادًا على متطلبات وشروط مختلفة. في تطبيق الويب، قد تكون هذه المتطلبات هي إضافة مستخدم جديد للمنشور، أو حذف المنشور، أو حذف حسابهم، والذي قد يحذف أو لا يحذف منشوراتهم. ستعتمد الإجراءات التي تقوم بها لتلاعب البيانات على الميزات الخاصة بتطبيقك. على سبيل المثال، قد لا ترغب في أن يتمكن المستخدمون من إضافة منشورات بدون عناوين.
Flask هو إطار عمل ويب خفيف لغة Python يوفر أدوات وميزات مفيدة لإنشاء تطبيقات الويب بلغة Python. PostgreSQL، أو Postgres، هو نظام إدارة قواعد البيانات العلائقية يوفر تنفيذًا للغة الاستعلام SQL. إنه متوافق مع المعايير ويحتوي على العديد من الميزات المتقدمة مثل المعاملات الموثوقة وتوازن الفرز بدون قفل القراءة.
في هذا البرنامج التعليمي، سوف تقوم ببناء تطبيق ويب صغير لمراجعة الكتب يظهر كيفية استخدام مكتبة psycopg2
، وهو محول قاعدة بيانات PostgreSQL الذي يسمح لك بالتفاعل مع قاعدة بيانات PostgreSQL الخاصة بك بلغة Python. ستستخدمه مع Flask لأداء المهام الأساسية، مثل الاتصال بخادم قاعدة بيانات، وإنشاء الجداول، وإدراج البيانات في الجدول، واسترجاع البيانات من الجدول.
المتطلبات
-
بيئة برمجة Python 3 محلية. اتبع البرنامج التعليمي لتوزيعك في سلسلة كيفية تثبيت وإعداد بيئة برمجة محلية لـ Python 3. في هذا البرنامج التعليمي، يُطلق على دليل المشروع اسم
flask_app
. -
فهم المفاهيم الأساسية لـ Flask، مثل المسارات، وظائف العرض، والقوالب. إذا لم تكن ملمًا بـ Flask، فتحقق من كيفية إنشاء تطبيق ويب أولي باستخدام Flask و Python و كيفية استخدام القوالب في تطبيق Flask.
-
فهم المفاهيم الأساسية لـ HTML. يمكنك مراجعة سلسلة الدروس لدينا حول كيفية بناء موقع ويب باستخدام HTML للحصول على المعرفة الأساسية.
-
تم تثبيت PostgreSQL على جهازك المحلي، ولديك وصول إلى موجه PostgreSQL. اتبع كيفية تثبيت واستخدام PostgreSQL على Ubuntu 20.04 لإعداد قاعدة بيانات PostgreSQL الخاصة بك.
الخطوة 1 — إنشاء قاعدة بيانات PostgreSQL ومستخدم
في هذه الخطوة، ستقوم بإنشاء قاعدة بيانات تسمى flask_db
ومستخدم قاعدة بيانات يُسمى sammy
لتطبيق Flask الخاص بك.
أثناء تثبيت Postgres، تم إنشاء مستخدم نظام تشغيل يُسمى postgres
ليتوافق مع مستخدم PostgreSQL الإداري postgres
. يجب عليك استخدام هذا المستخدم لأداء المهام الإدارية. يمكنك استخدام sudo
وتمرير اسم المستخدم مع الخيار -iu
.
قم بتسجيل الدخول إلى جلسة تفاعلية لـ Postgres باستخدام الأمر التالي:
سيتم منحك موجه PostgreSQL حيث يمكنك إعداد متطلباتك.
أولاً، قم بإنشاء قاعدة بيانات لمشروعك:
ملاحظة: يجب أن تنتهي كل عبارة PostgreSQL بفاصلة منقوطة، لذا تأكد من أن أمرك ينتهي بواحدة إذا كنت تواجه مشكلات.
بعد ذلك، قم بإنشاء مستخدم قاعدة بيانات لمشروعنا. تأكد من اختيار كلمة مرور آمنة:
ثم قم بمنح هذا المستخدم الجديد صلاحية إدارة قاعدة البيانات الجديدة الخاصة بك:
لتأكيد إنشاء قاعدة البيانات، احصل على قائمة القواعد البيانات عن طريق كتابة الأمر التالي:
سوف ترى flask_db
في قائمة قواعد البيانات.
عند الانتهاء، اخرج من موجه PostgreSQL عن طريق كتابة:
تم تهيئة PostgreSQL الآن بحيث يمكنك الاتصال بمعلومات قاعدة البيانات الخاصة به وإدارتها عبر Python باستخدام مكتبة psycopg2
. فيما يلي، ستقوم بتثبيت هذه المكتبة جنبًا إلى جنب مع حزمة Flask.
الخطوة 2 — تثبيت Flask و psycopg2
في هذه الخطوة، ستقوم بتثبيت Flask ومكتبة psycopg2
لتتفاعل مع قاعدة البيانات الخاصة بك باستخدام Python.
عند تنشيط بيئتك الافتراضية، استخدم pip
لتثبيت Flask ومكتبة psycopg2
:
بمجرد اكتمال التثبيت بنجاح، سترى سطرًا مماثلاً للتالي في نهاية الإخراج:
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
الخاص بك.
سيقوم هذا الملف بفتح اتصال بقاعدة البيانات flask_db
، وإنشاء جدول يسمى books
، وملء الجدول باستخدام بيانات عينة. أضف الكود التالي إليه:
احفظ وأغلق الملف.
في هذا الملف، تقوم أولاً بتوريد وحدة 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
بتشغيل الأوامر التالية. تذكر استخدام اسم المستخدم وكلمة المرور الخاصة بك:
الآن، قم بتشغيل ملف init_db.py
الخاص بك في الطرفية باستخدام الأمر python
:
بمجرد انتهاء تنفيذ الملف دون وجود أخطاء، سيتم إضافة جدول books
جديد إلى قاعدة البيانات flask_db
.
قم بتسجيل الدخول إلى جلسة تفاعلية لـ Postgres للاطلاع على جدول books
الجديد.
اتصل بقاعدة البيانات flask_db
باستخدام أمر \c
:
ثم استخدم عبارة SELECT
للحصول على عناوين الكتب والمؤلفين من جدول books
:
سترى إخراجًا مثل الآتي:
title | author
----------------------+------------------
A Tale of Two Cities | Charles Dickens
Anna Karenina | Leo Tolstoy
أنهِ الجلسة التفاعلية بـ \q
.
بعد ذلك، ستقوم بإنشاء تطبيق Flask صغير، والاتصال بقاعدة البيانات، واسترداد مراجعتي الكتاب اللتين أدخلتهما إلى قاعدة البيانات، وعرضهما على صفحة الفهرس.
الخطوة ٤ — عرض الكتب
في هذه الخطوة، ستقوم بإنشاء تطبيق Flask مع صفحة فهرس تسترد الكتب الموجودة في قاعدة البيانات، وتعرضها.
عند تفعيل بيئة البرمجة الخاصة بك وتثبيت Flask، افتح ملفًا يسمى app.py
للتحرير داخل دليل flask_app
:
سيقوم هذا الملف بإعداد اتصال قاعدة البيانات الخاصة بك وإنشاء مسار Flask واحد لاستخدام هذا الاتصال. أضف الكود التالي إلى الملف:
احفظ وأغلق الملف.
هنا، تقوم بإستيراد وحدة 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
:
أضف الشفرة التالية داخل ملف base.html
:
احفظ وأغلق الملف.
يحتوي هذا القالب الأساسي على جميع تخطيط HTML الذي ستحتاج إليه لإعادة استخدامه في القوالب الأخرى. سيتم استبدال الكتلة title
لتحديد عنوان لكل صفحة، وسيتم استبدال الكتلة content
بمحتوى كل صفحة. شريط التنقل يحتوي على رابطين، أحدهما لصفحة الفهرس حيث تستخدم دالة المساعد url_for()
لربطه بوظيفة العرض index()
، والآخر لصفحة حول إذا اخترت تضمينها في تطبيقك.
بعد ذلك، افتح قالبًا يُسمى index.html
. هذا هو القالب الذي أشرت إليه في ملف app.py
:
أضف الشفرة التالية إليه:
احفظ وأغلق الملف.
في هذا الملف، تمتد من القالب الأساسي، ويتم استبدال محتويات الكتلة content
. تستخدم عنوانًا <h1>
الذي يعمل أيضًا كعنوان.
تستخدم حلقة Jinja for
loop في السطر {% for book in books %}
للانتقال عبر كل كتاب في قائمة books
. تعرض معرّف الكتاب، الذي هو العنصر الأول باستخدام book[0]
. ثم تعرض عنوان الكتاب، والمؤلف، وعدد الصفحات، والمراجعة، وتاريخ إضافة الكتاب.
بينما تكون في الدليل flask_app
وتكون البيئة الظاهرية مفعلة، قم بإعلام Flask عن التطبيق (app.py
في هذه الحالة) باستخدام متغير البيئة FLASK_APP
. ثم ضبط متغير البيئة FLASK_ENV
إلى development
لتشغيل التطبيق في وضع التطوير والحصول على وصول إلى مصحح الأخطاء. لمزيد من المعلومات حول مصحح الأخطاء في Flask، انظر كيفية التعامل مع الأخطاء في تطبيق Flask. استخدم الأوامر التالية للقيام بذلك:
تأكد من ضبط متغيرات البيئة DB_USERNAME
و DB_PASSWORD
إذا لم تكن قد قمت بذلك بالفعل:
بعد ذلك، قم بتشغيل التطبيق:
مع تشغيل خادم التطوير، قم بزيارة الرابط التالي باستخدام متصفحك:
http://127.0.0.1:5000/
سترى الكتب التي قمت بإضافتها إلى قاعدة البيانات في المرة الأولى.
لقد قمت بعرض الكتب في قاعدة البيانات على صفحة الفهرس. الآن تحتاج إلى السماح للمستخدمين بإضافة كتب جديدة. ستقوم بإضافة مسار جديد لإضافة الكتب في الخطوة التالية.
الخطوة 5 — إضافة كتب جديدة
في هذه الخطوة، ستقوم بإنشاء مسار جديد لإضافة كتب جديدة ومراجعات إلى قاعدة البيانات.
ستقوم بإضافة صفحة تحتوي على نموذج ويب حيث يدخل المستخدمون عنوان الكتاب، واسم الكاتب، وعدد الصفحات، ومراجعة الكتاب.
اترك خادم التطوير يعمل وافتح نافذة أوامر جديدة.
أولاً، افتح ملفك app.py
:
لمعالجة النموذج الويب، ستحتاج إلى استيراد بعض الأشياء من حزمة flask
:
- كائن الطلب
request
العالمي للوصول إلى البيانات المقدمة. - وظيفة
url_for()
لتوليد عناوين URL. - وظيفة
redirect()
لتوجيه المستخدمين إلى صفحة الفهرس بعد إضافة كتاب إلى قاعدة البيانات.
أضف هذه الاستيرادات إلى السطر الأول في الملف:
ثم أضف المسار التالي في نهاية ملف app.py
:
احفظ وأغلق الملف.
في هذا المسار، تمر بالتصويبة ('GET', 'POST')
إلى المعلمة methods
للسماح بالطلبات GET و POST على حد سواء. تُستخدم الطلبات GET لاسترجاع البيانات من الخادم، بينما تُستخدم الطلبات POST لنشر البيانات إلى مسار معين. بشكل افتراضي، يُسمح فقط بالطلبات GET. عندما يُطلب المستخدم لأول مرة مسار /create
باستخدام طلب GET، سيتم تقديم ملف قالب يُسمى create.html
. فيما بعد، ستقوم بتحرير هذا المسار للتعامل مع الطلبات POST عندما يقوم المستخدمون بملء وتقديم النموذج الويب لإضافة كتب جديدة.
افتح القالب الجديد create.html
:
أضف الكود التالي إليه:
احفظ وأغلق الملف.
قمت بتمديد القالب الأساسي، وضبط عنوان كعنوان، واستخدام علامة <form>
مع السمة method
المضبوطة على post
للإشارة إلى أن النموذج سيُرسل طلب POST.
لديك حقل نصي بالاسم title
، الذي ستستخدمه للوصول إلى بيانات العنوان في مسار /create
الخاص بك.
لديك حقل نصي للمؤلف، وحقل رقمي لعدد الصفحات، ومنطقة نصية لمراجعة الكتاب.
وأخيرًا، لديك زر Submit في نهاية النموذج.
الآن، مع تشغيل الخادم التطويري، استخدم متصفحك للانتقال إلى مسار /create
:
http://127.0.0.1:5000/create
سترى صفحة إضافة كتاب جديد مع حقل إدخال لعنوان الكتاب، واحد للمؤلف، واحد لعدد الصفحات في الكتاب، منطقة نصية لمراجعة الكتاب، وزر Submit.
إذا قمت بملء النموذج وأرسلته، مرسلًا طلب POST إلى الخادم، لن يحدث شيء لأنك لم تتعامل مع طلبات POST على مسار /create
.
افتح app.py
لتتعامل مع الطلب POST الذي يقدمه المستخدم:
عدل المسار /create
ليظهر على النحو التالي:
احفظ وأغلق الملف.
تتعامل مع طلبات POST داخل شرط if request.method == 'POST'
. تستخرج العنوان، والمؤلف، وعدد الصفحات، والمراجعة التي يقدمها المستخدم من كائن request.form
.
تفتح قاعدة بيانات باستخدام وظيفة get_db_connection()
، وتنشئ مؤشرًا. ثم تنفذ عبارة SQL INSERT INTO
لإدراج العنوان، والمؤلف، وعدد الصفحات، والمراجعة التي قدمها المستخدم إلى جدول books
.
تؤكد العملية وتغلق المؤشر والاتصال.
وأخيرًا، تعيد توجيه المستخدم إلى صفحة الفهرس حيث يمكنه رؤية الكتاب الجديد المضاف أسفل الكتب الموجودة بالفعل.
مع تشغيل خادم التطوير، استخدم متصفحك للانتقال إلى مسار /create
:
http://127.0.0.1:5000/create
املأ النموذج ببعض البيانات وقم بإرساله.
سيتم توجيهك إلى صفحة الفهرس حيث سترى مراجعة كتابك الجديدة.
بعد ذلك، ستقوم بإضافة رابط إلى صفحة الإنشاء في شريط التنقل. افتح base.html
:
عدل الملف ليظهر على النحو التالي:
احفظ وأغلق الملف.
هنا، أضف رابطًا <a>
جديدًا إلى شريط التنقل يشير إلى الصفحة الخاصة بالإنشاء.
قم بتحديث صفحة الفهرس وسترى الرابط الجديد في شريط التنقل.
لديك الآن صفحة تحتوي على نموذج ويب لإضافة مراجعات الكتب الجديدة. لمزيد من المعلومات حول نماذج الويب، انظر كيفية استخدام نماذج الويب في تطبيق Flask. لطريقة أكثر تقدمًا وأمانًا لإدارة نماذج الويب، انظر كيفية استخدام والتحقق من صحة نماذج الويب باستخدام Flask-WTF.
الاستنتاج
لقد بنيت تطبيق ويب صغير لمراجعات الكتب يتواصل مع قاعدة بيانات PostgreSQL. لديك وظائف قاعدة بيانات أساسية في تطبيق Flask الخاص بك، مثل إضافة بيانات جديدة إلى قاعدة البيانات، واسترداد البيانات، وعرضها على الصفحة.
إذا كنت ترغب في قراءة المزيد حول Flask، تحقق من الدروس الأخرى في سلسلة Flask.