Quantcast
Channel: Planet Python
Viewing all articles
Browse latest Browse all 22462

بايثون العربي: نشر مشروع جانغو على منصة PythonAnywhere

$
0
0

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

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

اما الخدمة الاخرى التي سنستخدمها هي GitHub وهي خدمة إستضافة الأكواد البرمجية ومعظم المبرمجين يمتلكون حساب على هذه الخدمة وقد جاء دورنا الأن لإمتلاك حساب على هذا الأخير .

ثلاثة اماكن ستكون مهمة بالنسبة إليك : جهاز الكمبيوتر الخاص بك الذي سيكون مكان للتطوير والتجريب وعندما تكون مسرورا بالتغييرات ستحمل نسخة من البرنامج إلى  GitHub وسيكون موقعك على PythonAnywhere وستقوم بتحديثه من خلال موقع GitHub.

Git

جت هو برنامج حاسوب لإدراة الإصدارت (يُطلق على هذه العملية اسم “إدارة النٌُسخ” أيضا) وهو أحد برامج إدارة وتعقب التغييرات التي تطرأ على الملفات  تمت برمجته ليكون سريعا وهو يستخدم بقوة من طرف المبرمجون .

تثبيت Git

على الويندوز

يمكنك تحميل برنامج Git من الموقع الرسمي وتتم عملية التثبيت على خطى (Next… Next ) ماعدا محطة واحدة وهي المحطة الخامسة المسماة “ضبط مسار البيئة” إختر من الخيار السفلي تشغيل Git  وما يرتبط بها من ادوات يونكس من خلال سطر الأوامر الخاص بالويندوز اما غير ذلك فدع الامور كما هي يكون أحسن .

على اللينكس

في حالة عدم وجود برنامج Git مسبقا على نظامك فيمكن الحصول عليه من خلال كتابة الأمر التالي :


sudo apt-get install git

إنشاء مستودع Git الخاص بنا 

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


$ git init
Initialized empty Git repository in ~/pyarab/.git/
$ git config --global user.name "أكتب هنا إسمك "
$ git config --global user.email عنوان البريد الإلكتروني

تهيئة مستودع Git هو عملية نقوم بها مرة واحدة فقط على كل مشروع وبالتالي لن تقوم بإدخال إسمك وعنوان بريدك الإلكتروني كل مرة .

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


*.pyc
__pycache__
myvenv
db.sqlite3
/static
.DS_Store

ثم قم بحفظ الملف تحت إسم gitignore. داخل مجلد pyarab .

ملاحظة 1  : النقطة أمام إسم الملف مباشرة ضرورية ، وإذا كانت لديك أي مشاكل في إنشاء هكذا ملفات عندئذ قم إختر ميزة الحفظ تحت إسم الموجودة في المحرر .

ملاحظة 2 : من بين الملفات التي قمنا بمنع تعقبها هو ملف db.sqlite3 وهو ملف الخاص بقاعدة البيانات المكان الذي ستخزن فيه جميع المواضيع ولكننا لا نريد أن نتعقب التغييرات الحاصلة في هذا الملف وإضافته إلى المستودع وذلك بسبب أن موقعنا أو مشروعنا على منصة PythonAnywhere سيستعمل قاعدة بيانات من نوع أخر ويمكن ان تكون تلك القاعدة من نوع SQLite مثل الموجودة على جهازنا المحلي ولكن عادة سوف تستخدم قاعدة بيانات من نوع MySQL والتي تتحمل الكثير من الزوار على غير SQLite، من جهة أخرى فبمنعنا من تعقب ورفع نسخة ملف قاعدة البيانات علىGitHub  فإن هذا يعني أن جميع المواضيع التي أنشأنها ستبقى حبيسة جهازنا المحلي وسنقوم مرة أخرى برفع تلك المواضيع على المنصة والقاعدة الجديدتين … عمل متعب نوعا ما أليس كذلك ؟ ولكن عليك أن تفكر بطريقة إيجابية حيث سيبقى ملف قاعدة البيانات المحلي كقاعدة جيدة للتجريب والتطوير وبالتالي لا خوف على مواضيع المدونة المرفوعة من الضياع أو التلف .

إنه من الجيد أن نستخدم أمر git status قبل الأمر git add أو كلما وجدت نفسك غير متأكد من التغييرات الحاصلة وهذا من شانه أن يوقف المفاجئة مثل تعديل خاطئء أو إضافة ملفات مهمة لا تريد تعقبها وهنا يأتي دور أمرgit status وهو يقوم بعرض جميع المعلومات حول كل من الملفات الغير المتقعبة أو المعدلة والكثير من الأمور :


$ git status
On branch master

Initial commit

Untracked files:
(use "git add <file>..." to include in what will be committed)

.gitignore
blog/
manage.py
mysite/

nothing added to commit but untracked files present (use "git add" to track)

وأخيرا ولحفظ التغييرات نقوم بتنفيذ الأمر التالي :


$ git add -A .
$ git commit -m "Pyarab app, first commit"
[...]
13 files changed, 200 insertions(+)
create mode 100644 .gitignore
[...]
create mode 100644 mysite/wsgi.py

رفع المشروع على GitHub

إفتح موقع GitHub وقم يتسجيل حساب جديد (وإذا كان لديك حساب بالفعل فهذا جيد) .

بعد ذلك قم بإنشاء مستودع جديد وسمه  بإسم ‘my-first-blog’  فقط تأكد من عدم الضغط على خيار ‘التهيئة مع ملف إقرأني ‘ وأترك كل من خيار .gitignore (قمنا بهذا يدويا ألا تتذكر) والرخصة فارغ.

إنشاء مستودع

إنشاء مستودع

ملاحظة 3 : إن إسم المستودع مهم جدا —يمكنك إختيار أي إسم للمستودع تريد– ولكننا ستحتاجه كثيرا وحتى لا تختلط عليك الامور حاول إختيار إسم سهل التذكر .

في الصفحة الموالية سيظهر لنا رابط نسخ المستودع ، إختر نسخة HTTPS قم بنسخه لأننا سنقوم بلصقه على الطرفية بعد قليل .

Screenshot from 2015-12-18 16:32:09

الأن سنقوم بدفع مستودع برنامج Git إلى مستودع GitHub.

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


$ git remote add origin https://github.com/<إسمك>/my-first-blog.git
$ git push -u origin master

قم بإدخال أسم المستخدم وكلمة المرور وسيظهر لك شيء مماثل :


Username for 'https://github.com': username
Password for 'https://username@github.com':
Counting objects: 6, done.
Writing objects: 100% (6/6), 200 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/hjwp/my-first-blog.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.

الأن أصبح الكود على مستودع github يمكنك الذهاب إلى هناك والتحقق من ذلك وأكيد سوف تجده هناك أليس هذا بشيء رائع.

إعداد المدونة على منصة PythonAnywhere

توجه إلى موقع PythonAnywhere وقم بإنشاء حساب مجاني الخاص بالمبتدئين .

ملاحظة 4 : عندما تختار إسم المستخدم إختره بعناية لأنه سيكون هو عنوان الرابط الخاص بمدونتك yourusername.pythonanywhere.com 

رفع الكود على موقع  PythonAnywhere

عند الإنتهاء من عملية التسجيل سوف يتم تحويلك إلى لوحة التحكم أو إلى موجه الأوامر ، قم بإختيار خيار موجه الأوامر الخاص ب Bash

وسيكون لك موجه الأوامر كما هو موجود على جهازك الكمبيوتر .

ملاحظة 5 : موقع  PythonAnywhere يستند على نظام لينكس فإذا كنت من مستخدمي الويندوز فستجد أن لوحة التحكم متغيرة تماما عن تلك الموجودة في جهازك.

الأن سنقوم بسحب الكود الموجود على موقع GitHub إلى منصة PythonAnywhere عبر نسخ المستودع عن طريق الأمر التالي :


$ git clone https://github.com/<إسم المستخدم الخاص بك على github>/my-first-blog.git

وللتأكد من نجاح العلمية جرب الأمر التالي : tree my-first-blog


$ tree my-first-blog
my-first-blog/
├── blog
│ ├── __init__.py
│ ├── admin.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py

إنشاء بيئة إفتراضية على PythonAnywhere

كما فعلنا سابقا على جهازنا الكمبيوتر تقوم مجددا بإنشاء بيئة إفتراضية على موقع PythonAnywhere وعلى موجه الأوامر نكتب الأوامر التالي :

$ cd my-first-blog

$ virtualenv --python=python3.4 myvenv
Running virtualenv with interpreter /usr/bin/python3.4
[...]
Installing setuptools, pip...done.

$ source myvenv/bin/activate

(mvenv) $ pip install django whitenoise
Collecting django
[...]
Successfully installed django-1.8.2 whitenoise-2.0

جمع الملفات الثابتة 

هل تتسائل الان ما هو whitenoise ولماذا قمنا بتثبيته ؟  هو أداة تقوم بخدمة ما يسمى بالملفات الثابتة ، والملفات الثابتة هي ملفات عادة لا نقوم بتغييرها أو تتضمن أكواد للتنفيذ مثل ملفات HTML أو CSS ، حيث أن هذه الأخيرة تعمل بشكل مغاير على السيرفرات بالمقارنة بما تقوم به على أجهزة الكمبيوتر المحلية ولهذا نحن بحاجة إلى أداة ك whitenoise للتعامل معهم .

سنتلكم عن الملفات الثابتة فيما بعد في هذا الدرس عندما نصل إلى كيفية إنشاء ملفات Css لمدونتنا .

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


(mvenv) $ python manage.py collectstatic

You have requested to collect static files at the destination
location as specified in your settings:

/home/edith/my-first-blog/static

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: yes

إختر نعم ودعه يمكل عمله .

إنشاء قاعدة البيانات 

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

يمكننا تهيئة قاعدة البيانات على السيرفر بنفس الأمر الذي قمنا به سابقا على جهاز الكمبيوتر من خلال اﻷمرين التاليين :

(mvenv) $ python manage.py migrate
Operations to perform:
[...]
Applying sessions.0001_initial... OK

(mvenv) $ python manage.py createsuperuser

نشر المدونة بإعتبارها تطبيق ويب 

الان الكود موجود على موقع PythonAnywhere ، البيئة الإفتراضية جاهزة ، الملفات الثابتة مجموعة وأخير قاعدة البيانات مهيئة ونحن جاهزون للنشر كتطبيق الويب.

قم بالعودة إلى صفحة لوحة التحكم الخاصة بموقع PythonAnywhere بالضغط على شعار الموقع ثم إضغط على تبويب الويب  وأخيرا إضغط على إضافة تطبيق ويب جديد.

بعد التأكيد على إسم النطاق إخترالإعدادات اليدوية  (ملاحظة ليس خيار جانغو) في مربع الحوار بعد ذلك إختر بايثون 3.4 ثم Next  لأنها العملية .

ملاحظة 6 : تأكد من إختيارك لخيار الأعدادات اليدوية وليس خيار جانغو 

إعداد البيئة الإفتراضية 

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

Screenshot from 2015-12-18 17:02:03

في قسم البيئة الإفتراضية إضغط على النص الأحمر الذي يقول ‘أدخل مسار البيئة الإفتراضية ‘ وقم بإدخال المسار التالي :

/home/<إسم المستخدم>/my-first-blog/myvenv/

بعد ذلك إضغط على الزر الأزرق لحفظ المسار .

إعداد ملف WSGI

يعمل جانغو بإستخدام بروتوكول WSGI هو بروتوكول يقدم خدمة إستضافة مواقع بايثون وطبعا يقوم موقع PythonAnywhere بدعمه ، والطريقة التي سنقوم بها بإعداد PythonAnywhere حتى يتعرف على مدونتنا المبرمجة بجانغو هي بتعديل إعدادات ملف WSGI .

إضغط على رابط إعدادات ملف  WSGI (في قسم الأكواد  ) وهو على شكل

/var/www/pyarab_pythonanywhere_com_wsgi.py

وسيأخذك إلى المحرر ، قم بحذف جميع محتويات الملف وقم بإستبدالها بمايلي :


import os
import sys

path = '/home/<إسم المستخدم>/my-first-blog'
if path not in sys.path:
sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = DjangoWhiteNoise(get_wsgi_application())

مهمة هذا الملف هو إخبار PythonAnywhere أين يقبع تطبيق الويب الخاص بنا وما هو إسم ملف إعدادات جانغو كما يقوم أيضا بتعيين أداة الخاصة بالملات الثابتة whitenoise

قم بالحفظ ثم عد إلى صفحة الويب .

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

نصائح لحل بعض المشاكل المتوقعة 

إذا وجد أي مشاكل أو أخطاء عند محاولة زيارة موقعك فإن المكان الأول الذي سنتجه إليه مباشرة هو سجل الأخطاء وستجد رابط إليه في صفحة تبويب الويب  ، تحقق من وجود أي رسائل أخطاء هناك  والرسائل الحديثة ستجدها في الأسفل و من الأخطاء الشائعة نذكر منها :

  • نسيان أحد الخطوات التي قمنا بها على موجه الاوامر : إنشاء البيئة الأفتراضية ، تفعيلها ، تثبيت جانغو عليها ، جمع الملفات الثابتة ، قاعدة البيانات .
  • إرتكاب خطأ عند تعيين مسار البيئة الأفتراضية على تبويب الويب وعادة ما ستجد خطا ملون باللون الأحمر في حالة وجود خطأ مثل هذا .
  • إرتكاب خطأ عند تعديل ملف إعدادات WSGI .
  • هل قمت بتعيين نفس نسخة بايثون للبيئة الإفتراضية و تطبيق الويب كلاهما يجب أن يكونوا على نسخة بايثون 3.4 .

ولمزيد من الأخطاء الشائعة على موقع PythonAnywhere قم بزيارة الرابط التالي (إنجليزي ):

general debugging tips on the PythonAnywhere wiki.

وتذكر أيضا أننا هنا في حالة أي أخطاء .

وأخيرا أصبحنا على الهواء مباشرة 

الصفحة الرئيسة لمدونتك ينبغي أن تقول ‘مرجبا  بك على جانغو’  تماما كما حدث على جهازنا المحلي حاول أن تضيف admin/ في أخر الرابط ويتنقل إلى صفحة مدير المدونة قم بتسجيل الدخول وسترى أنه بإمكانك إضافة مجموعة من المواضيع على السيرفر .

إلى هنا أكون قد إنتهيت من هذا الدرس لأعود مرة (لن أطيل هذه المرة بإذن الله) أخرى ولنكمل سلسلة بناء مدونة بإستخدام جانغو وبايثون.


Viewing all articles
Browse latest Browse all 22462

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>