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

الصفحات

دليل شامل عن خطوات انشاء موقع ويب باستخدام بايثون Flask

A comprehensive guide on how to create a website using Python and Flask، how to create a website using Python and Flask، شرح برمجة تطبيق ويب لإنشاء مدونة باستخدام بايثون Flask، بايثون، Flask، مدونة ويب، تطوير ويب، برمجة، HTML، CSS، SQLite، برمجة مدونة ويب باستخدام بايثون Flask، إنشاء واجهة مستخدم لمدونة ويب باستخدام Flask، حفظ بيانات المدونة باستخدام SQLite، تطوير تطبيقات الويب باستخدام بايثون، تعلم برمجة Flask، كيفية برمجة تطبيق ويب، إنشاء مدونة باستخدام بايثون Flask، واجهة المستخدم، حفظ البيانات، برمجة مدونة ويب باستخدام بايثون Flask: دليل شامل مع الأكواد، برمجة موقع ويب باستخدام بايثون Flask، إنشاء واجهة مستخدم، حفظ بيانات المدونة باستخدام SQLite، تعلم برمجة Flask، برمجة، HTML، CSS، SQLite،
 


دليل شامل عن خطوات انشاء موقع ويب باستخدام بايثون Flask


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


خطوات برمجة موقع ويب باستخدام بايثون Flask :



* تثبيت Flask والمكتبات الأخرى:
قبل البدء، يجب تثبيت Flask والمكتبات الأخرى اللازمة.
الأكواد:
    pip install Flask flask-sqlalchemy
--

2. إنشاء بنية المشروع :
    * يجب إنشاء بنية المشروع التي تتضمن ملفات بايثون وقوالب HTML.
    * مثال على بنية المشروع:

blog/
├── app.py
├── templates/
│   ├── index.html
│   ├── post.html
│   ├── create.html
└── instance/
    └── blog.db

--

* إعداد قاعدة البيانات :
يجب إعداد قاعدة بيانات لتخزين بيانات المدونة، مثل عناوين المقالات ومحتواها.
الأكواد (app.py) :

        

Python

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy

    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
    db = SQLAlchemy(app)

    class Post(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(100))
        content = db.Column(db.Text)

    with app.app_context():
        db.create_all()


4. إنشاء واجهة المستخدم :
    * يجب إنشاء واجهة مستخدم لعرض المقالات وإنشاء مقالات جديدة.

    * الأكواد (templates/index.html) :
html
    <!DOCTYPE html>
    <html>
    <head>
        <title>مدونتي</title>
    </head>
    <body>
        <h1>مدونتي</h1>
        {% for post in posts %}
            <h2><a href="/post/{{ post.id }}">{{ post.title }}</a></h2>
        {% endfor %}
        <a href="/create">إنشاء مقال جديد</a>
    </body>
    </html>
   
--

* الأكواد (templates/post.html):

html
    <!DOCTYPE html>
    <html>
    <head>
        <title>{{ post.title }}</title>
    </head>
    <body>
        <h1>{{ post.title }}</h1>
        <p>{{ post.content }}</p>
    </body>
    </html>

--

* الأكواد (templates/create.html) :

        

<!DOCTYPE html>
    <html>
    <head>
        <title>إنشاء مقال جديد</title>
    </head>
    <body>
        <h1>إنشاء مقال جديد</h1>
        <form method="POST" action="/create">
            <label>العنوان:</label><br>
            <input type="text" name="title"><br><br>
            <label>المحتوى:</label><br>
            <textarea name="content"></textarea><br><br>
            <input type="submit" value="نشر">
        </form>
    </body>
    </html>
 

   
5. برمجة وظائف التطبيق :
    * يجب برمجة وظائف التطبيق، مثل عرض المقالات وإنشاء مقالات جديدة.
    * الأكواد (app.py):

        


    from flask import render_template, request, redirect, url_for

    @app.route('/')
    def index():
        posts = Post.query.all()
        return render_template('index.html', posts=posts)

    @app.route('/post/<int:id>')
    def post(id):
        post = Post.query.get(id)
        return render_template('post.html', post=post)

    @app.route('/create', methods=['GET', 'POST'])
    def create():
        if request.method == 'POST':
            title = request.form['title']
            content = request.form['content']
            new_post = Post(title=title, content=content)
            db.session.add(new_post)
            db.session.commit()
            return redirect(url_for('index'))
        return render_template('create.html')

    if __name__ == '__main__':
        app.run(debug=True)

  
6. تشغيل التطبيق :
    * يمكن تشغيل التطبيق باستخدام الأمر التالي :
    python app.py

مميزات استخدام Flask :
* سهولة الاستخدام: Flask هو إطار عمل بسيط وسهل التعلم.
* مرونة عالية: Flask يسمح بتخصيص التطبيق بسهولة.
* مجتمع نشط: Flask لديه مجتمع نشط من المطورين الذين يقدمون الدعم والتحديثات.


الاضافات لتخصيص موقع ويب باستخدام بايثون Flask


إليك المزيد من الأكواد للتخصيص والإضافات التي يمكنك إضافتها إلى مدونة Flask :

1. إضافة تصميم CSS :

لإنشاء ملف CSS، قم بإنشاء مجلد static في جذر مشروعك، ثم قم بإنشاء ملف style.css داخله.
مثال على static/style.css:

        

CSS

body {
    font-family: sans-serif;
    margin: 20px;
}

h1, h2 {
    color: #333;
}

a {
    text-decoration: none;
    color: #007bff;
}

a:hover {
    text-decoration: underline;
}

form {
    margin-top: 20px;
}

label {
    display: block;
    margin-bottom: 5px;
}

input[type="text"], textarea {
    width: 100%;
    padding: 10px;
    margin-bottom: 10px;
    border: 1px solid #ccc;
}

input[type="submit"] {
    background-color: #007bff;
    color: white;
    padding: 10px 20px;
    border: none;
    cursor: pointer;
}



* قم بتضمين ملف CSS في قوالب HTML :
HTML

<head>
    <title>مدونتي</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>

--

2. إضافة وظيفة التعديل والحذف :
قم بتعديل app.py لإضافة وظائف التعديل والحذف :

        

Python

@app.route('/post/<int:id>/edit', methods=['GET', 'POST'])
def edit(id):
    post = Post.query.get(id)
    if request.method == 'POST':
        post.title = request.form['title']
        post.content = request.form['content']
        db.session.commit()
        return redirect(url_for('post', id=post.id))
    return render_template('edit.html', post=post)

@app.route('/post/<int:id>/delete')
def delete(id):
    post = Post.query.get(id)
    db.session.delete(post)
    db.session.commit()
    return redirect(url_for('index'))



* قم بإنشاء قالب edit.html :

        

HTML

<!DOCTYPE html>
<html>
<head>
    <title>تعديل المقال</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
    <h1>تعديل المقال</h1>
    <form method="POST" action="/post/{{ post.id }}/edit">
        <label>العنوان:</label><br>
        <input type="text" name="title" value="{{ post.title }}"><br><br>
        <label>المحتوى:</label><br>
        <textarea name="content">{{ post.content }}</textarea><br><br>
        <input type="submit" value="تحديث">
    </form>
</body>
</html>

* قم بتعديل post.html لإضافة روابط التعديل والحذف :
HTML

<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
<a href="/post/{{ post.id }}/edit">تعديل</a>
<a href="/post/{{ post.id }}/delete">حذف</a>

--




3. إضافة وظيفة البحث:
* قم بتعديل app.py لإضافة وظيفة البحث :

        

Python

@app.route('/search', methods=['GET', 'POST'])
def search():
    if request.method == 'POST':
        query = request.form['query']
        posts = Post.query.filter(Post.title.contains(query) | Post.content.contains(query)).all()
        return render_template('search.html', posts=posts, query=query)
    return render_template('search.html', posts=[], query='')



* قم بإنشاء قالب search.html :

        

HTML

<!DOCTYPE html>
<html>
<head>
    <title>البحث</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
    <h1>البحث</h1>
    <form method="POST" action="/search">
        <input type="text" name="query" placeholder="ابحث عن مقال...">
        <input type="submit" value="بحث">
    </form>
    {% if query %}
        <h2>نتائج البحث عن "{{ query }}":</h2>
        {% for post in posts %}
            <h2><a href="/post/{{ post.id }}">{{ post.title }}</a></h2>
        {% endfor %}
    {% endif %}
</body>
</html>



* قم بإضافة نموذج البحث إلى index.html :
HTML

<form method="POST" action="/search">
    <input type="text" name="query" placeholder="ابحث عن مقال...">
    <input type="submit" value="بحث">
</form>

--

4. إضافة تعليقات:
تعديل نموذج قاعدة البيانات (app.py) :

        

Python

    class Comment(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        content = db.Column(db.Text)
        post_id = db.Column(db.Integer, db.ForeignKey('post.id'))
        post = db.relationship('Post', backref=db.backref('comments', lazy=True))


* تعديل صفحة المقال (templates/post.html) :

        

HTML

    <h1>{{ post.title }}</h1>
    <p>{{ post.content }}</p>

    <h2>التعليقات:</h2>
    {% for comment in post.comments %}
        <p>{{ comment.content }}</p>
    {% endfor %}

    <h2>إضافة تعليق:</h2>
    <form method="POST" action="/post/{{ post.id }}/comment">
        <textarea name="content"></textarea><br>
        <input type="submit" value="إضافة تعليق">
    </form>


* إضافة وظيفة التعليق (app.py) :
Python

    @app.route('/post/<int:id>/comment', methods=['POST'])
    def comment(id):
        content = request.form['content']
        new_comment = Comment(content=content, post_id=id)
        db.session.add(new_comment)
        db.session.commit()
        return redirect(url_for('post', id=id))

--

5. إضافة تصنيفات
* تعديل نموذج قاعدة البيانات (app.py) :

        

Python

    class Category(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(50))

    class Post(db.Model):
        # ... (بقية تعريف نموذج Post)
        category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
        category = db.relationship('Category', backref=db.backref('posts', lazy=True))


* تعديل نموذج إنشاء المقال (templates/create.html) :
HTML

    <label>التصنيف:</label><br>
    <select name="category_id">
        {% for category in categories %}
            <option value="{{ category.id }}">{{ category.name }}</option>
        {% endfor %}
    </select><br><br>

--

* تعديل وظيفة إنشاء المقال (app.py) :

        

Python

    @app.route('/create', methods=['GET', 'POST'])
    def create():
        categories = Category.query.all()
        if request.method == 'POST':
            # ... (بقية الكود)
            category_id = request.form['category_id']
            new_post = Post(title=title, content=content, category_id=category_id)
            # ... (بقية الكود)
        return render_template('create.html', categories=categories)
إضافة تصنيفات إلى صفحة المقال (templates/post.html):
HTML

    <p>التصنيف: {{ post.category.name }}</p>


6. إضافة نظام تسجيل الدخول :
* تثبيت Flask-Login :
    pip install Flask-Login

* تعديل app.py :

        

Python

    from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user

    login_manager = LoginManager()
    login_manager.init_app(app)
    login_manager.login_view = 'login'

    class User(UserMixin, db.Model):
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(50), unique=True)
        password = db.Column(db.String(100))

    @login_manager.user_loader
    def load_user(user_id):
        return User.query.get(int(user_id))

    @app.route('/login', methods=['GET', 'POST'])
    def login():
        # ... (كود تسجيل الدخول)

    @app.route('/logout')
    @login_required
    def logout():
        logout_user()
        return redirect(url_for('index'))

    @app.route('/create', methods=['GET', 'POST'])
    @login_required
    def create():
        # ... (كود إنشاء المقال)



* إنشاء قوالب تسجيل الدخول والتسجيل :
* تعديل قوالب المقالات لتتطلب تسجيل الدخول :
HTML
    {% if current_user.is_authenticated %}
        <a href="/post/{{ post.id }}/edit">تعديل</a>
    {% endif %}

--

7. استخدام محرر نصوص غني :
* تثبيت Flask-CKEditor :
    pip install Flask-CKEditor

* تعديل app.py :
Python
    from flask_ckeditor import CKEditor
    ckeditor = CKEditor(app)

--

* تعديل نموذج إنشاء المقال (templates/create.html) :
HTML
    <textarea name="content" class="ckeditor"></textarea>

--

8. نشر المدونة على الإنترنت:
* Heroku :
- إنشاء حساب على Heroku.
- تثبيت Heroku CLI.
- إنشاء ملف requirements.txt يحتوي على المكتبات المستخدمة.
- إنشاء ملف Procfile يحتوي على الأمر لتشغيل التطبيق.
- استخدام Git لنشر التطبيق على Heroku.
* PythonAnywhere:
- إنشاء حساب على PythonAnywhere.
- إنشاء مشروع Flask جديد.
- رفع ملفات المشروع إلى PythonAnywhere.
- تكوين إعدادات التطبيق على PythonAnywhere.

طريقة اضافة الامان الى تسجيل دخول موقع ويب 


 إليك بعض الأكواد التي يمكنك إضافتها لتعزيز أمان نظام تسجيل الدخول في تطبيق Flask :

1. تجزئة كلمات المرور:

بدلاً من تخزين كلمات المرور كنصوص عادية، يجب تجزئتها باستخدام 
خوارزمية قوية مثل bcrypt أو scrypt :
* تثبيت bcrypt :
pip install bcrypt

* تعديل app.py :

        

Python

import bcrypt

def hash_password(password):
    salt = bcrypt.gensalt()
    hashed_password = bcrypt.hashpw(password.encode('utf-8'), salt)
    return hashed_password

def check_password(password, hashed_password):
    return bcrypt.checkpw(password.encode('utf-8'), hashed_password)

@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        hashed_password = hash_password(password)
        new_user = User(username=username, password=hashed_password)
        db.session.add(new_user)
        db.session.commit()
        return redirect(url_for('login'))
    return render_template('register.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        user = User.query.filter_by(username=username).first()
        if user and check_password(password, user.password):
            login_user(user)
            return redirect(url_for('index'))
        flash('اسم المستخدم أو كلمة المرور غير صحيحة')
    return render_template('login.html')


2. الحماية من هجمات القوة الغاشمة :
يمكنك استخدام مكتبة Flask-Limiter للحد من عدد محاولات تسجيل الدخول الفاشلة :
* تثبيت Flask-Limiter :
pip install Flask-Limiter

* تعديل app.py :
Python

from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

limiter = Limiter(
    app,
    key_func=get_remote_address,
    default_limits=["5 per minute"]
)

@app.route('/login', methods=['GET', 'POST'])
@limiter.limit("5 per minute")
def login():
    # ... (كود تسجيل الدخول)

--

3. الحماية من هجمات CSRF:
توفر Flask حماية مدمجة من هجمات CSRF باستخدام Flask-WTF.
* تثبيت Flask-WTF :
pip install Flask-WTF

* تعديل app.py :

Python

from flask_wtf.csrf import CSRFProtect

csrf = CSRFProtect(app)
إضافة حقل CSRF إلى نماذج HTML:
HTML

<form method="POST" action="/login">
    {{ form.csrf_token }}
    </form>

--

4. استخدام HTTPS:
يجب استخدام HTTPS لتشفير الاتصال بين المستخدم والخادم.
يمكنك الحصول على شهادة SSL مجانية من Let's Encrypt.
يمكنك نشر تطبيقك على خدمات مثل Heroku أو PythonAnywhere التي توفر HTTPS تلقائيًا.

5. تحديث المكتبات:
تأكد من تحديث جميع المكتبات المستخدمة إلى أحدث الإصدارات لإصلاح الثغرات الأمنية.

6. إضافة ميزات أمان إضافية:
- المصادقة الثنائية (2FA): يمكنك استخدام مكتبات مثل Flask-Security-Too لإضافة 2FA.
- سياسة كلمات المرور القوية: يمكنك فرض سياسة كلمات مرور قوية على المستخدمين.
- تسجيل الدخول باستخدام OAuth: يمكنك السماح للمستخدمين بتسجيل الدخول
 باستخدام حساباتهم على Google أو Facebook.

* ملاحظات:
هذه الأكواد هي مجرد أمثلة، ويجب تعديلها لتناسب احتياجاتك.
يجب دائمًا إجراء اختبارات أمان شاملة للتأكد من أن تطبيقك آمن.



جدول المحتويات