القائمة الرئيسية

الصفحات

كيفية برمجة تطبيق إنشاء قوائم تشغيل الموسيقى باستخدام Python Django

Django، مشروع كامل، تطوير ويب Python، تطبيقات ويب موسيقية، مهارات البرمجة، رحلة التعلم، إمكانيات Django، الخطوات التالية، بناء المستقبل، Python Django، تطوير تطبيقات ويب، قوائم تشغيل الموسيقى، برمجة الويب، دليل شامل، خطوة بخطوة، مشروع عملي، PythonAnywhere، استضافة Python، نشر Django PythonAnywhere، Heroku، PaaS، نشر Django Heroku، Procfile، requirements.txt، Django deployment، نشر ويب، خوادم الويب، Heroku، PythonAnywhere، Gunicorn، Nginx، اختبار الويب، تفاعل المستخدم، إنشاء قوائم تشغيل، إضافة أغاني، تشغيل الموسيقى، Django development server، اختبار التطبيق، تشغيل محلي، Django admin، تسجيل النماذج، واجهة إدارة سهلة الاستخدام، Django admin، مستخدم مشرف، إدارة قاعدة البيانات، Django migrations، إنشاء الجداول، تحديث قاعدة البيانات، Django urls، ربط العناوين بطرق العرض، أسماء URL، تنظيم عناوين URL، Django templates، HTML، CSS، JavaScript، عرض البيانات، حلقات التكرار، منطق القالب، Django forms، معالجة بيانات النموذج، التحقق من صحة البيانات، نماذج HTML، Django views، منطق التطبيق، معالجة الطلبات، استرداد البيانات، عرض القوالب، Django models، قواعد البيانات، ORM، تعريف الجداول، علاقات قواعد البيانات، Python، pip، virtual environment، Django installation، Python Django، تطوير تطبيقات ويب، قوائم تشغيل الموسيقى، إدارة الموسيقى، واجهة مستخدم ويب، نماذج Django، قواعد البيانات، قوالب Django، طرق العرض Django، عناوين URL Django، مصادقة المستخدم، تحميل الموسيقى، تشغيل الموسيقى، نشر تطبيقات Django، Heroku، PythonAnywhere، برمجة تطبيق إنشاء قوائم تشغيل الموسيقى باستخدام، Python Django، برمجة تطبيق إنشاء قوائم تشغيل الموسيقى باستخدام Python Django، How to code music playlist creation app in Python Django، كيفية برمجة تطبيق إنشاء قوائم تشغيل الموسيقى باستخدام  Python Django، تطوير ويب Python، جانغو، templates، HTML، CSS، JavaScript،




كيفية برمجة تطبيق إنشاء قوائم تشغيل الموسيقى باستخدام Python Django



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


الخطوات الأساسية لتطوير تطبيق قوائم تشغيل الموسيقى Django


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

1. تهيئة بيئة التطوير وتثبيت Django:





# التأكد من تثبيت Python
python --version

# تثبيت pip (إذا لم يكن مثبتًا)
# (عادةً ما يأتي مع Python)

# إنشاء بيئة افتراضية (موصى به)
python -m venv music_playlist_env
source music_playlist_env/bin/activate  # لنظام Linux/macOS
# music_playlist_env\Scripts\activate  # لنظام Windows

# تثبيت Django
pip install Django
django-admin --version

# إنشاء مشروع Django جديد
django-admin startproject music_playlist_app
cd music_playlist_app

# إنشاء تطبيق Django داخل المشروع
python manage.py startapp playlist
python manage.py startapp music


--

* شرح الكود :

- إنشاء بيئة افتراضية لعزل تبعيات المشروع.
- تثبيت إطار عمل Django باستخدام مدير الحزم pip.
- إنشاء مشروع Django جديد باسم music_playlist_app.
- الانتقال إلى دليل المشروع.
- إنشاء تطبيقين Django: playlist لإدارة قوائم التشغيل و music لإدارة ملفات الموسيقى.

2. تصميم نماذج البيانات (Models):

* (ملف music_playlist_app/playlist/models.py):




Python

from django.db import models
from django.contrib.auth.models import User

class Playlist(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    description = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

class Song(models.Model):
    title = models.CharField(max_length=255)
    artist = models.CharField(max_length=255)
    audio_file = models.FileField(upload_to='music/')

    def __str__(self):
        return f"{self.title} - {self.artist}"

class PlaylistSong(models.Model):
    playlist = models.ForeignKey(Playlist, on_delete=models.CASCADE)
    song = models.ForeignKey(Song, on_delete=models.CASCADE)
    added_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = ('playlist', 'song')

    def __str__(self):
        return f"{self.song.title} in {self.playlist.name}"


--

* (ملف music_playlist_app/music/models.py):

 تم تعريف نموذج Song في playlist/models.py

* شرح الكود:

- تعريف ثلاثة نماذج Django:
- Playlist: يمثل قائمة تشغيل مملوكة لمستخدم، تحتوي على اسم ووصف
 وتاريخ الإنشاء. يرتبط بمستخدم عبر علاقة ForeignKey.
- Song: يمثل أغنية، تحتوي على عنوان وفنان وملف صوتي.
 يتم تخزين الملفات الصوتية في دليل music/.
- PlaylistSong: جدول وسيط لربط قوائم التشغيل بالأغاني، يحتوي على تاريخ الإضافة 
ويضمن عدم تكرار الأغنية في نفس القائمة التشغيلية عبر unique_together.
- استخدام ForeignKey لإنشاء علاقات بين الجداول في قاعدة البيانات.
- استخدام FileField لتحميل وتخزين ملفات الموسيقى.
- تعريف طريقة __str__ لكل نموذج لتمثيل الكائنات بشكل واضح.

3. إنشاء طرق العرض (Views):

* (ملف music_playlist_app/playlist/views.py):





Python

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from .models import Playlist, Song, PlaylistSong
from .forms import Playlist Form, AddSongForm

@login_required
def playlist_list(request):
playlists = Playlist.objects.filter(user=request.user).order_by('-created_at')
return render(request, 'playlist/playlist_list.html', {'playlists': playlists})

@login_required
def create_playlist(request):
if request.method == 'POST':
form = PlaylistForm(request.POST)
if form.is_valid():
playlist = form.save(commit=False)

                playlist.user = request.user
                playlist.save()
                return redirect('playlist_detail', playlist_id=playlist.id)
        else:
            form = PlaylistForm()
        return render(request, 'playlist/create_playlist.html', {'form': form})

@login_required
def playlist_detail(request, playlist_id):
    playlist = get_object_or_404(Playlist, id=playlist_id, user=request.user)
    playlist_songs = PlaylistSong.objects.filter(playlist=playlist).select_related('song')
    add_song_form = AddSongForm()
    return render(request, 'playlist/playlist_detail.html', {
        'playlist': playlist,
        'playlist_songs': playlist_songs,
        'add_song_form': add_song_form,
    })








@login_required
def delete_playlist(request, playlist_id):
    playlist = get_object_or_404(Playlist, id=playlist_id, user=request.user)
    if request.method == 'POST':
        playlist.delete()
        return redirect('playlist_list')
    return render(request, 'playlist/delete_playlist_confirm.html', {'playlist': playlist})

@login_required
def add_song_to_playlist(request, playlist_id):
    playlist = get_object_or_404(Playlist, id=playlist_id, user=request.user)
    if request.method == 'POST':
        form = AddSongForm(request.POST, request.FILES)
        if form.is_valid():
            title = form.cleaned_data['title']
            artist = form.cleaned_data['artist']
            audio_file = form.cleaned_data['audio_file']

            song, created = Song.objects.get_or_create(title=title, artist=artist, defaults={'audio_file': audio_file})

            if not PlaylistSong.objects.filter(playlist=playlist, song=song).exists():
                PlaylistSong.objects.create(playlist=playlist, song=song)
                return redirect('playlist_detail', playlist_id=playlist_id)
            else:
                form.add_error(None, "This song is already in the playlist.")
    else:
        form = AddSongForm()
    return render(request, 'playlist/add_song_to_playlist.html', {'form': form, 'playlist': playlist})

@login_required
def remove_song_from_playlist(request, playlist_id, song_id):
    playlist = get_object_or_404(Playlist, id=playlist_id, user=request.user)
    song = get_object_or_404(Song, id=song_id)
    playlist_song = get_object_or_404(PlaylistSong, playlist=playlist, song=song)
    if request.method == 'POST':
        playlist_song.delete()
        return redirect('playlist_detail', playlist_id=playlist_id)
    return render(request, 'playlist/remove_song_confirm.html', {'playlist': playlist, 'song': song})


--

* شرح الكود :
- playlist_list: يعرض قائمة بجميع قوائم التشغيل الخاصة بالمستخدم الحالي، مرتبة حسب تاريخ الإنشاء.
- create_playlist: يعرض نموذجًا لإنشاء قائمة تشغيل جديدة. عند إرسال النموذج
 (POST)، يتم التحقق من صحة البيانات، وإنشاء قائمة التشغيل للمستخدم الحالي،
 ثم يتم إعادة توجيهه إلى صفحة تفاصيل قائمة التشغيل.
- playlist_detail: يعرض تفاصيل قائمة تشغيل محددة، بما في ذلك 
الأغاني الموجودة فيها ونموذجًا لإضافة أغنية جديدة.
 يستخدم get_object_or_404 لجلب قائمة التشغيل والتأكد من أنها مملوكة للمستخدم الحالي.
- delete_playlist: يعرض صفحة تأكيد لحذف قائمة تشغيل. عند إرسال النموذج
 (POST)، يتم حذف قائمة التشغيل ثم يتم إعادة توجيهه إلى قائمة قوائم التشغيل.
- add_song_to_playlist: يعرض نموذجًا لتحميل أغنية جديدة وإضافتها
 إلى قائمة التشغيل المحددة. عند إرسال النموذج (POST)، يتم التحقق من صحة
 البيانات والملف، وإنشاء كائن Song إذا لم يكن موجودًا بالفعل، ثم إنشاء كائن
 PlaylistSong لربط الأغنية بالقائمة التشغيلية. يتم التحقق من عدم وجود الأغنية بالفعل في القائمة.
- remove_song_from_playlist: يعرض صفحة تأكيد لإزالة أغنية 
من قائمة تشغيل. عند إرسال النموذج (POST)، يتم حذف كائن PlaylistSong ثم 
يتم إعادة توجيهه إلى صفحة تفاصيل قائمة التشغيل.
- استخدام الديكور @login_required لضمان وصول المستخدمين المسجلين فقط إلى هذه طرق العرض.
- استخدام render لعرض القوالب HTML مع البيانات المطلوبة.
- استخدام redirect لإعادة توجيه المستخدم إلى صفحة أخرى بعد إجراء عملية.
- استخدام get_object_or_404 لجلب كائن أو إرجاع خطأ 404 إذا لم يتم العثور عليه.
- استخدام select_related('song') لتحسين أداء الاستعلام عن طريق
 جلب بيانات الأغنية المرتبطة مرة واحدة.
- استخدام get_or_create لإنشاء كائن Song إذا لم يكن موجودًا بالفعل.
- استخدام add_error لإضافة أخطاء مخصصة إلى النموذج.




4. إنشاء نماذج Django Forms:

* (ملف music_playlist_app/playlist/forms.py):




Python

from django import forms
from .models import Playlist, Song

class PlaylistForm(forms.ModelForm):
    class Meta:
        model = Playlist
        fields = ['name', 'description']

class AddSongForm(forms.Form):
    title = forms.CharField(max_length=255, label='Song Title')
    artist = forms.CharField(max_length=255, label='Artist Name')
    audio_file = forms.FileField(label='Audio File')

    def clean_audio_file(self):
        audio_file = self.cleaned_data['audio_file']
        if not audio_file.name.endswith(('.mp3', '.wav', '.ogg')):
            raise forms.ValidationError("Only .mp3, .wav, and .ogg files are allowed.")
        return audio_file



--

* شرح الكود :
- PlaylistForm: نموذج Django يعتمد على نموذج Playlist، 
ويسمح للمستخدم بإدخال اسم ووصف لقائمة التشغيل.
- AddSongForm: نموذج Django لرفع أغنية جديدة، يحتوي على حقول
 لعنوان الأغنية واسم الفنان وملف الصوت.
- clean_audio_file: طريقة مخصصة للتحقق من صحة الملف الصوتي،
 للتأكد من أنه أحد التنسيقات المدعومة.

5. تصميم قوالب HTML (Templates):

إنشاء دليل templates داخل تطبيق
 playlist: music_playlist_app/playlist/templates/playlist/

* (ملف music_playlist_app/playlist/templates/playlist/playlist_list.html):
HTML

{% extends 'base.html' %}

{% block content %}
    <h1>My Playlists</h1>
    <a href="{% url 'create_playlist' %}">Create New Playlist</a>
    <ul>
        {% for playlist in playlists %}
            <li>
                <a href="{% url 'playlist_detail' playlist_id=playlist.id %}">{{ playlist.name }}</a>
                (Created at: {{ playlist.created_at }})
                <form method="post" action="{% url 'delete_playlist' playlist_id=playlist.id %}" style="display: inline;">
                    {% csrf_token %}
                    <button type="submit">Delete</button>
                </form>
            </li>
        {% empty %}
            <li>No playlists yet.</li>
        {% endfor %}
    </ul>
{% endblock %}
--

*(ملف music_playlist_app/playlist/templates/playlist/create_playlist.html):
HTML

{% extends 'base.html' %}
{% block content %}
    <h1>Create New Playlist</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">Create</button>
    </form>
{% endblock %}
--

* (ملف music_playlist_app/playlist/templates/playlist/playlist_detail.html):





HTML

{% extends 'base.html' %}

{% block content %}
    <h1>{{ playlist.name }}</h1>
    <p>{{ playlist.description }}</p>
    <h2>Songs in this Playlist</h2>
    <ul>
        {% for playlist_song in playlist_songs %}
            <li>
                {{ playlist_song.song.title }} - {{ playlist_song.song.artist }}
                <audio controls src="{{ playlist_song.song.audio_file.url }}"></audio>
                <form method="post" action="{% url 'remove_song_from_playlist' playlist_id=playlist.id song_id=playlist_song.song.id %}" style="display: inline;">
                    {% csrf_token %}
                    <button type="submit">Remove</button>
                </form>
            </li>
        {% empty %}
            <li>No songs in this playlist yet.</li>
        {% endfor %}
    </ul>

    <h2>Add New Song</h2>
    <form method="post" enctype="multipart/form-data" action="{% url 'add_song_to_playlist' playlist_id=playlist.id %}">
        {% csrf_token %}
        {{ add_song_form.as_p }}
        <button type="submit">Add Song</button>
    </form>
    <br>
    <a href="{% url 'playlist_list' %}">Back to Playlists</a>
{% endblock %}


--

* (ملف music_playlist_app/playlist/templates/playlist/delete_playlist_confirm.html):
HTML

{% extends 'base.html' %}

{% block content %}
    <h1>Delete Playlist</h1>
    <p>Are you sure you want to delete "{{ playlist.name }}"?</p>
    <form method="post">
        {% csrf_token %}
        <button type="submit">Yes, Delete</button>
        <a href="{% url 'playlist_list' %}">No, Go Back</a>
    </form>
{% endblock %}
--

إنشاء ملف base.html (في دليل music_playlist_app/templates/) 
لتضمين الهيكل الأساسي:
HTML

<!DOCTYPE html>
<html>
<head>
    <title>Music Playlist App</title>
</head>
<body>
    <nav>
        {% if user.is_authenticated %}
            <span>Welcome, {{ user.username }}!</span>
            <a href="{% url 'playlist_list' %}">My Playlists</a>
            <a href="{% url 'logout' %}">Logout</a>
        {% else %}
            <a href="{% url 'login' %}">Login</a>
            <a href="{% url 'register' %}">Register</a>
        {% endif %}
    </nav>
    <hr>
    <div class="content">
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>
--

* شرح الكود:
- استخدام لغة قوالب Django لعرض البيانات الديناميكية من طرق العرض.
- استخدام علامات % لمنطق القالب (مثل for للتكرار و if للشروط).
- استخدام علامات {{ }} لعرض المتغيرات.
- استخدام علامة {% url 'view_name' arguments %} لإنشاء عناوين
 URL بناءً على أسماء طرق العرض في urls.py.
- استخدام {% csrf_token %} لتضمين رمز CSRF لحماية النماذج من هجمات تزوير الطلبات عبر المواقع.
- استخدام {{ form.as_p }} لعرض حقول النموذج كفقرات HTML.
- استخدام عنصر <audio> لتشغيل ملفات الموسيقى.
- استخدام الوراثة ({% extends 'base.html' %} و
 {% block content %}) لإنشاء هيكل صفحة متسق.

6. تعريف عناوين URL (URLs):

* (ملف music_playlist_app/playlist/urls.py):

Python

from django.urls import path
from . import views

urlpatterns = [
    path('', views.playlist_list, name='playlist_list'),
    path('create/', views.create_playlist, name='create_playlist'),
    path('<int:playlist_id>/', views.playlist_detail, name='playlist_detail'),
    path('<int:playlist_id>/delete/', views.delete_playlist, name='delete_playlist'),
    path('<int:playlist_id>/add_song/', views.add_song_to_playlist, name='add_song_to_playlist'),
    path('<int:playlist_id>/remove_song/<int:song_id>/', views.remove_song_from_playlist, name='remove_song_from_playlist'),
]
--

* (ملف music_playlist_app/music_playlist_app/urls.py):

    from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('playlists/', include('playlist.urls')),
    path('accounts/', include('django.contrib.auth.urls')), # عناوين URL المضمنة لتسجيل الدخول والخروج وما إلى ذلك
    path('accounts/register/', include('users.urls')), # إذا قمت بإنشاء تطبيق users للتسجيل
]
--




* (إذا قمت بإنشاء تطبيق users للتسجيل، ملف music_playlist_app/users/urls.py):
Python

from django.urls import path
from . import views
urlpatterns = [
    path('', views.register, name='register'),
]
--

* (ملف music_playlist_app/users/views.py - مثال بسيط للتسجيل):
Python

from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import login

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('playlist_list')
    else:
        form = UserCreationForm()
    return render(request, 'users/register.html', {'form': form})
--

* شرح الكود:

- ربط عناوين URL بأنماط محددة بطرق العرض المناسبة.
- استخدام متغيرات المسار (<int:playlist_id>) لتمرير المعرفات إلى طرق العرض.
- استخدام include لتضمين عناوين URL من تطبيقات أخرى (playlist.urls).
- استخدام django.contrib.auth.urls لتضمين عناوين URL المضمنة لإدارة المصادقة.
- تسمية عناوين URL باستخدام name='...' لتسهيل الرجوع إليها في
 القوالب باستخدام علامة {% url '...' %}.

7. ترحيل قاعدة البيانات:

python manage.py makemigrations playlist music users # إذا كان لديك تطبيق users
python manage.py migrate
--

* شرح الكود:

- إنشاء ملفات ترحيل بناءً على تغييرات النماذج.
- تطبيق الترحيلات لإنشاء الجداول في قاعدة البيانات.

8. إنشاء مستخدم مشرف (Superuser):

python manage.py createsuperuser
--
# اتبع التعليمات لإدخال اسم المستخدم والبريد الإلكتروني وكلمة المرور
إنشاء حساب مستخدم مشرف للوصول إلى واجهة إدارة Django (/admin/).

9. تسجيل النماذج في واجهة الإدارة (admin.py):

* (ملف music_playlist_app/playlist/admin.py):
Python

from django.contrib import admin
from .models import Playlist, Song, PlaylistSong
admin.site.register(Playlist)
admin.site.register(Song)
admin.site.register(PlaylistSong)
--

* شرح الكود:
- تسجيل نماذج Playlist و Song و PlaylistSong في واجهة إدارة Django. 
- هذا يسمح لك بإدارة البيانات الخاصة بك بسهولة من خلال واجهة ويب تلقائية.

10. تشغيل خادم التطوير:

python manage.py runserver
--

* شرح الكود:

بدء تشغيل خادم تطوير Django المحلي. يمكنك الوصول إلى التطبيق الخاص بك 
عن طريق فتح متصفح الويب والانتقال إلى http://127.0.0.1:8000/.

11. اختبار التطبيق:

* الخطوات:
- قم بزيارة http://127.0.0.1:8000/playlists/ في متصفحك.
- قم بتسجيل مستخدم جديد (http://127.0.0.1:8000/accounts/register/) وتسجيل الدخول (http://127.0.0.1:8000/accounts/login/).
- أنشئ قوائم تشغيل جديدة.
- أضف أغاني إلى قوائم التشغيل عن طريق تحميل ملفات MP3 أو WAV أو OGG.
- قم بعرض تفاصيل قائمة التشغيل وتشغيل الأغاني باستخدام عنصر <audio>.
- قم بتعديل وحذف قوائم التشغيل والأغاني.
- قم بزيارة واجهة الإدارة (http://127.0.0.1:8000/admin/) باستخدام 
بيانات المستخدم المشرف وتحقق من البيانات.

12. نشر التطبيق (Deployment):

يعتمد نشر تطبيق Django على بيئة الاستضافة التي تختارها.
 فيما يلي خطوات عامة لنشر بسيط باستخدام Heroku أو PythonAnywhere كمثالين:

أ. النشر على Heroku:
* الخطوات:
- تثبيت Heroku CLI: اتبع التعليمات على موقع Heroku لتثبيت 
Heroku Command Line Interface على جهازك.
- إنشاء حساب Heroku: قم بإنشاء حساب مجاني على موقع Heroku.
- تسجيل الدخول إلى Heroku CLI: افتح سطر الأوامر وقم بتشغيل heroku login.
- تجميد التبعيات: أنشئ ملف requirements.txt يحتوي على جميع حزم Python المطلوبة لتطبيقك:
pip freeze > requirements.txt

- إنشاء ملف Procfile في الجذر الرئيسي للمشروع (بنفس مستوى manage.py):
web: gunicorn music_playlist_app.wsgi --log-file -

- إنشاء ملف .gitignore: قم بتضمين الملفات التي لا تريد تحميلها إلى Heroku (مثل بيئة venv).
- إنشاء تطبيق Heroku: في سطر الأوامر، انتقل إلى جذر مشروع Django وقم بتشغيل:
heroku create your-app-name  # استبدل your-app-name باسم فريد لتطبيقك

- تكوين قاعدة البيانات: ستحتاج إلى استخدام قاعدة بيانات Heroku Postgres. قم بتشغيل:
heroku addons:create heroku-postgresql:hobby-dev

- تكوين متغيرات البيئة: قم بتكوين متغير DJANGO_SETTINGS_MODULE:
heroku config:set DJANGO_SETTINGS_MODULE=music_playlist_app.settings

وقم بتكوين متغير SECRET_KEY الخاص بـ Django.
- تطبيق الترحيلات على قاعدة بيانات Heroku:

heroku run python manage.py migrate
heroku run python manage.py createsuperuser # إذا كنت بحاجة إلى مستخدم مشرف على Heroku

- دفع الكود إلى Heroku:

git init
git add .
git commit -m "Initial deploy"
git push heroku main
--




- فتح التطبيق في المتصفح:
heroku open

ب. النشر على PythonAnywhere:

* الخطوات:
- إنشاء حساب PythonAnywhere: قم بإنشاء حساب مجاني أو مدفوع على موقع PythonAnywhere.
- تحميل الكود: استخدم SSH أو واجهة الويب لتحميل ملفات مشروع Django 
الخاص بك إلى PythonAnywhere.
- إنشاء بيئة افتراضية: قم بإنشاء بيئة افتراضية Python باستخدام وحدة التحكم
 PythonAnywhere وقم بتثبيت Django والتبعيات الخاصة بك باستخدام
 pip install -r requirements.txt.
- تكوين تطبيق الويب: انتقل إلى علامة التبويب "Web" على لوحة تحكم 
PythonAnywhere وأضف تطبيق ويب جديدًا. حدد "Django" كإطار 
عمل واختر مسار مشروعك والبيئة الافتراضية.
- تكوين ملف WSGI: قم بتعديل ملف WSGI (عادةً ما يكون موجودًا في /var/www/your_username_pythonanywhere_com_wsgi.py)
 للإشارة إلى إعدادات Django الخاصة بك بشكل صحيح.
- تكوين قاعدة البيانات: يمكنك استخدام قاعدة بيانات SQLite المضمنة أو إعداد قاعدة بيانات MySQL على PythonAnywhere. قم بتحديث إعدادات DATABASES في ملف settings.py.
- تطبيق الترحيلات: قم بتشغيل ترحيلات Django باستخدام وحدة التحكم PythonAnywhere:

python manage.py migrate
python manage.py createsuperuser # إذا كنت بحاجة إلى مستخدم مشرف

- تكوين الملفات الثابتة: قم بتجميع الملفات الثابتة وتشغيل collectstatic:
  python manage.py collectstatic

وقم بتكوين خدمة الملفات الثابتة في قسم "Web" على PythonAnywhere.
إعادة تحميل تطبيق الويب: بعد إجراء التغييرات، قم بإعادة تحميل تطبيق
 الويب من لوحة تحكم PythonAnywhere.
هذه مجرد أمثلة بسيطة للنشر. قد تتطلب بيئات النشر الأكثر تعقيدًا تكوينًا إضافيًا لخوادم
 الويب (مثل Nginx أو Apache) وخوادم تطبيقات WSGI (مثل Gunicorn أو uWSGI).
لقد قمت الآن ببناء ونشر تطبيق ويب كامل لإنشاء قوائم تشغيل الموسيقى
 باستخدام Python Django. يمكنك الاستمرار في تطوير هذا التطبيق بإضافة
 المزيد من الميزات مثل البحث عن الموسيقى، ومشاركة قوائم التشغيل، وتوصيات الموسيقى، والمزيد.

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

أنت الان في اول موضوع
جدول المحتويات