بناء تطبيق لاختصار الروابط باستعمال لغة بايثون وإطار العمل Flask – الجزء الأول
مقدّمة
في عالم الإنترنت المتسارع، حيث تتداول ملايين الروابط يومياً عبر الشبكات الاجتماعية، والمدونات، والبريد الإلكتروني، أصبح من الضروري وجود أدوات لتقليص حجم الروابط الطويلة والمعقدة إلى روابط قصيرة يسهل تذكرها ومشاركتها. استخدام أدوات لاختصار الروابط لا يقتصر فقط على تسهيل المشاركة، بل يتيح أيضاً تتبع الأداء من خلال الإحصائيات وتحليلات النقرات.
هذا المقال يتناول المرحلة الأولى من بناء تطبيق لاختصار الروابط باستخدام لغة بايثون وإطار العمل Flask. سيركز هذا الجزء على الهيكلية الأساسية للتطبيق، إنشاء قاعدة البيانات، إعدادات السيرفر المحلي، وفهم كيفية التعامل مع الطلبات (HTTP Requests) بطريقة ديناميكية.
نبذة عن Flask
Flask هو إطار عمل ويب (Web Framework) مصغّر وخفيف الوزن تم تطويره بلغة بايثون. يتميّز ببساطته ومرونته، ما يجعله مثالياً لإنشاء تطبيقات الويب الصغيرة إلى المتوسطة. لا يفرض Flask بنية صارمة على المبرمج، ويتيح له حرية التحكم الكامل في كيفية تنظيم التطبيق.
نظرة عامة على التطبيق
الوظائف الأساسية للتطبيق:
-
واجهة إدخال رابط طويل.
-
توليد رابط مختصر فريد.
-
إعادة توجيه الرابط المختصر إلى الرابط الأصلي عند النقر عليه.
-
تخزين البيانات في قاعدة بيانات.
-
إعداد صفحة لعرض الإحصائيات (سيتم التطرق إليها في الجزء الثاني).
بيئة العمل والأدوات المطلوبة
| الأداة | الوصف |
|---|---|
| Python 3.10 أو أحدث | لغة البرمجة الأساسية للتطبيق |
| Flask | إطار العمل لبناء تطبيق الويب |
| SQLite | قاعدة بيانات خفيفة وسهلة الاستخدام |
| SQLAlchemy | مكتبة ORM لتسهيل التعامل مع قواعد البيانات |
| Werkzeug | مكتبة مرافقة لـ Flask تحتوي على أدوات لإدارة الطلبات والاستجابات |
للبدء، يجب التأكد من تنصيب بايثون ثم إعداد بيئة افتراضية باستخدام الأوامر التالية:
bashpython -m venv env
source env/bin/activate # لنظام Linux أو macOS
env\Scripts\activate # لنظام Windows
بعد تفعيل البيئة الافتراضية، يتم تنصيب المتطلبات الأساسية:
bashpip install flask sqlalchemy
إعداد هيكلية المشروع
يُفضّل تقسيم المشروع إلى عدة ملفات لتنظيم الكود وجعل الصيانة أسهل. ستكون هيكلية المشروع كالتالي:
arduinourl_shortener/
│
├── app/
│ ├── __init__.py
│ ├── models.py
│ ├── routes.py
│ ├── utils.py
│ └── templates/
│ └── index.html
├── static/
│ └── style.css
├── run.py
├── config.py
└── requirements.txt
إعداد ملف التشغيل الرئيسي run.py
pythonfrom app import create_app
app = create_app()
if __name__ == "__main__":
app.run(debug=True)
إنشاء التطبيق وتهيئته – ملف __init__.py
pythonfrom 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
pythonfrom . 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
pythonimport 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
pythonfrom 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
htmlhtml>
<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، بالإضافة إلى إمكانية توليد روابط مختصرة عشوائية مع خاصية التوجيه التلقائي. سيتضمن الجزء الثاني تحسينات مثل تتبع الإحصائيات، تصميم واجهة أكثر تطوراً، ودعم لحسابات المستخدمين ومزيد من عناصر الأمان.
المصادر
-
Flask Documentation – https://flask.palletsprojects.com
-
SQLAlchemy ORM Documentation – https://docs.sqlalchemy.org

