مشاركة حلول: بناء أول تطبيق flask

عمل رائع وسرعة ممتازة يا كمال في انجاز المهام :+1:

1 Like

شكرا استاذ ياسر ^^

1 Like
from flask import Flask

app = Flask(__name__)


@app.route('/say-hello/<name>')
def say_hello(name):
    return ('Hello ' + name)


app.run()

لدي سؤال
كيف تم الربط بين الراوت say-hello والداله say_hello بالرغم من اختلاف كتابتهم والنتيجة تظهر صحيحة على المتصفح ؟

1 Like

نعم يا أحمد، السطر التالي

@app.route('/say-hello/<name>')

هو من يقوم بالربط بين دالة بايثون وبين الـ route، ولا يشترط أن يكون يحتوي على نفس الكلمة

يعني ممكن تستعمل أي كلمة أخرى لعمل الـ route، مثل:

@app.route('/alalaf/<name>')

بهذا السطر يمكنك الدخول على المتصفح وفتح الرابط http://127.0.0.1/alalaf/ahmed وستظهر لك النتيجة Hello ahmed

هل داله route تقوم بتنفيذ الداله التي اسفل منها مباشرة وبهذا يكون الربط ؟

2 Likes

نعم لأنها تعتبر decorator (زخرفة للدالة)

في بايثون لو تريد عمل decorator تستعمل الـ @

اعتبرها دالة تأكل دالة أخرى، هذه تفاصيل حولها:

كيف يعمل هذا الكود ؟ decorator

3 Likes
from flask import Flask
app = Flask(__name__)
@app.route('/say_hello/<x>')
def say_hello(x):
    return 'hello' + x
app.run()

1 Like

عمل رائع :+1:

from flask import Flask

app = Flask(__name__)

@app.route('/say-hello/<name>')
def say_hello(name):
    return ('Hello ' + name)


app.run()
1 Like

عمل ممتاز، أريج :+1:

2 Likes

مشكور أستاذ :blush:

1 Like
from flask import Flask
app = Flask(__name__)

@app.route('/say-hello/<x>')
def hello(x):
    return 'Hello %s' %x

app.run()
1 Like

كالعادة عمل رائع يا ابرار :+1:

1 Like

السؤال هنا لماذا علينا كتابة’ +’ ليضهر المدخل X

from flask import Flask
app = Flask(__name__)


@app.route('/sayhello/<x>')
def sayhello(x):
    return ('hello: ' , x)


app.run()
1 Like
from flask import Flask


app = Flask(__name__)
@app.route("/manaa")
def home ():
    return "hi"
@app.route("/ahmed")
def we ():
    return "how are you"
app.run ()
1 Like

ببساطة x هو مجرد متغير يستقبله فلاسك حينما تقوم بفتح الرابط /sayhello/bassam

يعني ممكن تكتب name أو أي شيء آخر بدل x

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

لكن المطلوب أن تقوم بجعل التطبيق يستقبل أي اسم يكتب في الرابط، مثلا لو أكتب الرابط

http://localhost/sayhello/yaser

يطلع hello yaser

ولو أكتب

http://localhost/sayhello/mohammed

يطلع heloo mohammed

وهكذا

1 Like

شكراً استاذ يا سر ولاكن ليس هذا هو المقصود
انا ابديت استغرابي ان كان هنلك فرق بين ’ + ’ و ’ , 'التي طالما تعودنا استخدام الثانية

1 Like

حياك ي بسام @BassamMsmar، مثل ما تعرف انه عندنا في لغات البرمجة functions او ما نطلق عليها الدوال وهذه الدوال بإمكاننا تمرير لها ما يسمى بالـ Parameters و بإمكاننا الإطلاق عليها المعاملات

فمثلاً عندما نقوم بإنشاء دالة تطبع إسم الشخص نقوم بالتالي:

def print_name(name):
  print (name)
  return

ومن ثم نقوم بإستدعاء الدالة بالشكل التالي مع تمرير إسم الشخص المطلوب طباعته:

print_name('Bassam')

النتيجة سيتم طباعة الإسم Bassam كما تعرف
image

جميل إلى هنا متفقين :ok_hand:

الأن لنفترض أنك تريد أن تقوم بإعطاء الدالة لقبك أيضاً لتقوم بطباعته، طبعاً تستطيع كتابة إسمك الكامل هكذا

print_name('Bassam Msmar')

لكننا لا نريد أن نقوم بذلك ونريد أن نقوم بإضافة اللقب بشكل منفصل، لذا قد تقول لنقم بإضافه اللقب بعلامة + بالشكل التالي:

print_name('Bassam' + 'Msmar')

جميل، ستجد أن هذه هي النتيجة:
image

اها تم قبول علامة + وطباعة الإسمين لكن ماذا عن إضافة اللقب بإستخدام الفاصلة , بدلاً من الـ + ماذا ستكون النتيجة؟

طيب لنجرب كتابة هذا الكود:

print_name('Bassam', 'Msmar')

النتيجة:

أوووبس لدينا مشكلة:

تقول لنا المشكلة بأن الدالة print_name تأخذ argument واحد لكنها وجدت اننا أعطيناها 2!

أولاً ما الفرق بين الـ argument و الـ parameter؟

الـ parameter هو المتغير الذي تقوم بتعريفة في الدالة عند إنشاءها مثلاً في الكود ادناة المتغير name الذي بداخل القوسين هو الـ parameter في الدالة

def print_name(name):

بينما الـ argument هي الـ data التي نقوم بتمريرها في الدالة عند إستدعائها فمثلاً في الكود أدناة إسمك هو الـ argument

print_name('Bassam')

اوكي لنعود لمشكلتنا

يقول لنا الـ compiler بأنه هناك خطأ وبأننا قمنا بتمرير إثنين arguments للدالة print_name، وهذا ليس شئ متوقع حسب تعريفنا للدالة في بدأية البرنامج، فقد قمنا بتعريفها بـ parameter واحد والذي هو name

def print_name(name):

لذا يجب علينا إما ان نتقيد بهذا الشئ وتمرير argument واحد عند إستدعاء الدالة هكذا

print_name('Bassam')

أو نقوم بتعديل الدالة وإضافة parameter أخر للقب في تعريف الدالة حتى نستطيع تمرير الإثنين الـ arguments، لنقم بذلك بالشكل التالي:

def print_name(name, surname):
  print (name + surname)
  return

print_name('Bassam', 'Msmar')

لاحظ أضفت أثنين parameters الي هم (name, surname) وبعدين مررت إثنين arguments الي هم (‘Bassam’, 'Msmar)

لنقم الأن بتجربة البرنامج بالتعديلات الجديدة ونشوف اذا بتظهر لنا نفس المشكلة

النتيجة
image

ممتاز كما تلاحظ الأن البرنامج إشتغل بشكل طبيعي وقبل تمرير الأثنين الـ arguments.


الفرق بين علامة + وبين الفاصلة ,

مثل ما شفت خلال الذي مررنا به اعلاة بأنه عندنا إستخدمنا علامة + لم تظهر لنا مشكلة بانه قمنا بإستخدام أكثر من argument واحد بينما عندما قمنا بإستخدام الفاصلة ظهرت المشكلة.

أي كان علامة + تقوم فقط بربط النصوص أو دمجها وإعتبارها كنص واحد (أي عنصر واحد او argument واحد)

print_name('Bassam' + 'Msmar')

بينما الفاصلة تقوم بإعتبار كل نص منفصل بحد ذاته وإعتبارة كـ argument يجب أن يقابله parameter في الدالة المعرفة مسبقاً.

print_name('Bassam', 'Msmar')

ليش كل الكلام الذي فوق؟

ممكن أكون طولت عليك بس أحببت أن تكون الأمور واضحة بخصوص الدوال وما يتم تمريره لها حتى تكون ملم عن الموضوع بشكل كامل.

الـ print هي دالة

الكود الذي نستخدمة لطباعة النصوص في بايثون هو عبارة عن دالة نقوم فيها بتمرير النص الذي نريد طباعته كـ argument وهي بدورها تقوم بتنفيذ اللازم لكتابة النص في الشاشة.

لنقم بتجربة الـ + والفاصلة , في هذه الدالة:

تجربة الـ +

print('Bassam' + 'Msmar')

النتيجة
image

جميل تم طباعة الإسم واللقب ولم نواجة مشكلة.

تجربة الفاصلة ,

print('Bassam' , 'Msmar')

النتيجة:
image

جميل تم طباعة الإسم واللقب ولم نواجة مشكلة.

لكن هناك فرق بين النتيجتين، هل لاحظته؟

تلاحظ عند إستخدامنا للفاصلة بأنه تم وضع مسافة بين الإسم واللقب بينما عند إستخدامنا للـ + جاء اللقب ملتصق بالإسم.

ماهو السبب؟
السبب هو لأن علامة + قامت بأخذ النص الأول وربطته بالنص الثاني وتم تمرير النص كـ argument واحد للدالة print وبدورها قامت بطباعته كعنصر واحد.

بينما في الحالة الثانية قامت الفاصلة بفصل الإسمين وإرسالهما للدالة كإثنين arguments وليس واحد وقامت الدالة بمنطق معين بدمج هذين النصين وفصلهما بمسافة وطباعتهما.


الأن أصبحت تعرف الفرق بين الـ + والفاصلة وطريقة تعامل الدالة print مع النصوص بوجود أحد هاذين العنصرين، لنعود للكود الخاص بك

from flask import Flask
app = Flask(__name__)

@app.route('/sayhello/<x>')
def sayhello(x):
    return ('hello: ' , x)

app.run()

في الدالة التي كتبتها قمت بعمل فاصلة عند إرجاع القيمة

return ('hello: ' , x)

والوضع الأن غير مختلف مع طريقة تعامل الـ return مع ما تقوم بتمريرة بداخلها سوا بال + او بالفاصلة.

عشان تحدد أي منهما تستخدم جاوب عن الأسئلة التالية:

السؤال الأول:

هل تريد أن تقوم بدمج الإسم بجوار كلمة hello: وإرجاعة كقيمة واحدة؟

إذا نعم فعليك إستخدام علامة + بالشكل التالي:

return ('hello: ' + x)

الأن خلاصة الدالة sayhello وما سيتم إرجاعة منها هو hello: mohammed في حال ما إن إستدعيناها بالشكل التالي:

sayhello('mohammed')

السؤال الثاني:

هل تريد إرجاع عنصرين بشكل منفصل؟

إذا نعم فعليك إستخدام علامة الفاصلة بالشكل التالي:

return ('hello: ' , x)

الأن خلاصة الدالة sayhello وما سيتم إرجاعة منها هو قيمتين، القيمة الأولى hello: والقيمة الثانية هي القيمة المخزنة بداخل المتغير x لنقل mohammed في حال ما إستدعيت الدالة بالشكل التالي:

sayhello('mohammed')

الخلاصة:

علامة الفاصلة:

تقوم بتحديد الـ arguments التي يتم تمريرها للدالة وفي حالة دالة print تقوم بأخذ هذه القيم المنفصلة وتحويلها إلى نصوص وطباعتها وعمل مسافة بين كل قيمة وأخرى.

علامة +:

تقوم بعمل concatenate (ربط أو دمج) للنصوص وتمريرها كـ argument واحد وفي حالة دالة print تقوم بطباعة ذلك النص كيف ما كان بدون أي تدخل بإدراج أي مسافة.

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

6 Likes

ياخي انت ايش يسموك
مبدع …!!
قليل في حقك
انتم رواد التعليم في اليمن القادم اذ الم يكن في الوطن العربي كله
فهمتها ومن اول مرة
ولا أضن اني بانساها ماحييت :blush::blush::rose:
الشكر كل الشكر لك استاذ/ محمد الأستاذ / ياسر
وكل القائمين على الموقع :pray:

3 Likes