البرمجة

بناء تطبيق لاختصار الروابط بـ Flask

بناء تطبيق لاختصار الروابط باستعمال لغة بايثون وإطار العمل Flask – الجزء الأول

مقدّمة

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

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

نبذة عن Flask

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

نظرة عامة على التطبيق

الوظائف الأساسية للتطبيق:

  1. واجهة إدخال رابط طويل.

  2. توليد رابط مختصر فريد.

  3. إعادة توجيه الرابط المختصر إلى الرابط الأصلي عند النقر عليه.

  4. تخزين البيانات في قاعدة بيانات.

  5. إعداد صفحة لعرض الإحصائيات (سيتم التطرق إليها في الجزء الثاني).

بيئة العمل والأدوات المطلوبة

الأداة الوصف
Python 3.10 أو أحدث لغة البرمجة الأساسية للتطبيق
Flask إطار العمل لبناء تطبيق الويب
SQLite قاعدة بيانات خفيفة وسهلة الاستخدام
SQLAlchemy مكتبة ORM لتسهيل التعامل مع قواعد البيانات
Werkzeug مكتبة مرافقة لـ Flask تحتوي على أدوات لإدارة الطلبات والاستجابات

للبدء، يجب التأكد من تنصيب بايثون ثم إعداد بيئة افتراضية باستخدام الأوامر التالية:

bash
python -m venv env source env/bin/activate # لنظام Linux أو macOS env\Scripts\activate # لنظام Windows

بعد تفعيل البيئة الافتراضية، يتم تنصيب المتطلبات الأساسية:

bash
pip install flask sqlalchemy

إعداد هيكلية المشروع

يُفضّل تقسيم المشروع إلى عدة ملفات لتنظيم الكود وجعل الصيانة أسهل. ستكون هيكلية المشروع كالتالي:

arduino
url_shortener/ │ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── routes.py │ ├── utils.py │ └── templates/ │ └── index.html ├── static/ │ └── style.css ├── run.py ├── config.py └── requirements.txt

إعداد ملف التشغيل الرئيسي run.py

python
from app import create_app app = create_app() if __name__ == "__main__": app.run(debug=True)

إنشاء التطبيق وتهيئته – ملف __init__.py

python
from flask import Flask from flask_sqlalchemy import SQLAlchemy import os db = SQLAlchemy() def create_app(): app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///shortener.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db.init_app(app) from .routes import main app.register_blueprint(main) with app.app_context(): db.create_all() return app

إنشاء نموذج البيانات – ملف models.py

python
from . import db from datetime import datetime class URL(db.Model): id = db.Column(db.Integer, primary_key=True) original_url = db.Column(db.String(500), nullable=False) short_url = db.Column(db.String(10), unique=True, nullable=False) created_at = db.Column(db.DateTime, default=datetime.utcnow) clicks = db.Column(db.Integer, default=0)

هذا النموذج يحدد الجداول التي سيتم إنشاؤها في قاعدة البيانات. يحتوي على الحقول التالية:

  • original_url: الرابط الأصلي.

  • short_url: الرابط المختصر.

  • created_at: تاريخ الإضافة.

  • clicks: عدد النقرات على الرابط المختصر.

وظائف مساعدة – ملف utils.py

python
import string import random def generate_short_url(length=6): characters = string.ascii_letters + string.digits return ''.join(random.choice(characters) for _ in range(length))

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

تعريف المسارات والوظائف الرئيسية – ملف routes.py

python
from flask import Blueprint, render_template, request, redirect, flash from .models import URL from .utils import generate_short_url from . import db main = Blueprint('main', __name__) @main.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': original_url = request.form['original_url'] existing_url = URL.query.filter_by(original_url=original_url).first() if existing_url: short_url = existing_url.short_url else: short_url = generate_short_url() while URL.query.filter_by(short_url=short_url).first() is not None: short_url = generate_short_url() new_url = URL(original_url=original_url, short_url=short_url) db.session.add(new_url) db.session.commit() return render_template('index.html', short_url=short_url) return render_template('index.html') @main.route('/') def redirect_to_original(short_url): url = URL.query.filter_by(short_url=short_url).first_or_404() url.clicks += 1 db.session.commit() return redirect(url.original_url)

واجهة المستخدم – ملف index.html

html
html> <html lang="ar"> <head> <meta charset="UTF-8"> <title>اختصار الروابطtitle> <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}"> head> <body> <div class="container"> <h1>خدمة اختصار الروابطh1> <form method="POST"> <input type="text" name="original_url" placeholder="أدخل الرابط هنا" required> <button type="submit">اختصر الرابطbutton> form> {% if short_url %} <p>الرابط المختصر: <a href="{{ short_url }}">{{ request.host_url }}{{ short_url }}a>p> {% endif %} div> body> html>

ملاحظات إضافية حول الأمان والاعتمادية

  • يجب التحقق من صحة الرابط المدخل قبل اختصاره باستخدام أدوات مثل validators.

  • من الأفضل الحد من تكرار اختصار نفس الرابط أكثر من مرة.

  • يمكن توسيع النموذج لتضمين مستخدمين وتخصيص الروابط بناءً على الحساب.

جدول يوضح مراحل عمل التطبيق

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

الخلاصة التقنية للجزء الأول

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

المصادر

  1. Flask Documentation – https://flask.palletsprojects.com

  2. SQLAlchemy ORM Documentation – https://docs.sqlalchemy.org