-
المساهمات
156 -
تاريخ الانضمام
-
تاريخ آخر زيارة
إجابات الأسئلة
-
إجابة Haroun Taha سؤال في خطأ RuntimeError: working outside of request context في فلاسك Flask؟ كانت الإجابة المقبولة
المشكلة في تعريف ال decorator بشكل خاطئ يجب ان يتعامل مع الطلب request الذي يأتي من الدالة update_task يجب حذف دالة validate_request وأيضاً يجب جلب الطلب داخل الdecorator وتعريفه ويوجد في Flask دالة flask.request.get_json تقوم بفحص هل الطلب json أم لا وترجع قيمة bool اذا كانت False سوف يتم عرض خطأ 404 بشكل التالي:
def validate_request(func): @functools.wraps(func) def decorator_func(*args, **kwargs): json = flask.request.get_json() # أم لا Json التحقق من نوع الطلب الواصل if not json: flask.abort(404) return func(*args, **kwargs) return decorator_func @app.route('/api/v1/random', methods=['POST']) @validate_request # هنا وضع المُزخرف وسوف يتعامل مع الطلب def update_task(task_id): # ...
-
إجابة Haroun Taha سؤال في كيف أحصل على الsalary من داخل صفحة الوظيفة web scraping كانت الإجابة المقبولة
يجب عليك أن تجلب رابط صفحة من <a> لكل job ومن ثم تجلب صفحة الjob وتأخذ منها الSalary وهذه العملية تحصل داخل حلقة الfor هكذا تجلب الرابط :
for item in items: item = item.find('a', class_="css-o171kl") page_job = item['href'] response = requests.get(page_job) soup_page = BeautifulSoup(response.content,"html.parser") بعد ذلك داخل الصفحة من soup_page تجلب الsalary هذه الفكرة بكل بساطة.
-
إجابة Haroun Taha سؤال في كيفية إستدعاء كل ملفات Python الموجودة داخل مجلد معين؟ كانت الإجابة المقبولة
من خلال الأمر الfrom لإستدعاء الحزمة Foo والعلامة star * بعد import لإستدعاء جميع ال Modules داخل Foo :
from Foo import *
-
إجابة Haroun Taha سؤال في بيئة عمل دجانغو ضمن PyCharm كانت الإجابة المقبولة
تستطيع تثبيت حزمة Django من خلال PyCharm من خلال الterminal في الجزء السفلي من البرنامج PyCharm
بعد ذلك الأمر
pip install django
بعد ذلك لإنشاء مشروع Django استخدم الأمر:
django-admin startproject NameProject لا تنسى تفعيل البيئةالإفتراضية, واقرأ البدء مع إطار العمل جانغو لإنشاء تطبيق ويب للإستفادة أكثر في البدء في إنشاء مشروع Django.
-
إجابة Haroun Taha سؤال في بعض المواقع لا استطيع عمل Web Scraping عليها مالسبب؟ كانت الإجابة المقبولة
بالطبع أغلب المواقع ذات الأمان العالي تقوم بفحص زائر الصفحة هل هو قادم من Script برمجي أم من متصفح تستخدم هذه المواقع حماية عن طريق الإعتماد على نوع المتصفح User-Agent مثال للUser-Agent لمتصفح firefox :
USER_AGENT = "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1" فنحن نقوم بالإحتيال على الموقع الذي نريد سحب البيانات منه بإخباره برمجياً أننا قادمون من متصفح للإنترنت فعندها لا يقوم بمنع عملية التصفح وسحب البيانات هذه طريقة للتخطي.
هناك اُطر عمل لسحب البيانات تساعد على تخطي فحص ال User-Agent مثل إطار العمل Scrapy.
-
إجابة Haroun Taha سؤال في فلاسك ام دجانغو ؟ كانت الإجابة المقبولة
فلاسك تجربة جميلة للبداية في بايثون في مجال تطوير الويب وبعدها إنتقل لجانغو كبير وشامل نعم تعلمه وإعمل مشاريع عليه سوف يقوي فرصك بسوق العمل بشكل عام في أي مجال وإستمر بدون توقف, بالنسبة لسؤالك هل دجانقو اقصر مدة في مرحلة التطوير للمشروع نعم صحيح بسبب التسهيلات التي يُقدمها إطار العمل ولا يعني أنه أسهل بالعكس ثري بالوحدات الخارجية والضمنية بالنسبة ل FastAPI ما زال إطار عمل حديث ولم يسبق التعامل معه.
قم بالإطلاع على اسئلة سابقة:
وايضاً المقالة التالية فإنه يوجد بها قسم يشرح مقارنة بين دجانغو وفلاسك :
-
إجابة Haroun Taha سؤال في الفرق بين let و var في جافا سكريبت كانت الإجابة المقبولة
الكلمة let يتعرف عليها مفسر اللغة على المستوى المحلي للدالة او ال block اي انه إذا تم تعريف متغيّر let داخل دالة فبمجرد خروج المفسر من الدالة لن تستطيع الوصول له الكلمة var تُعرف متغيّر على المستوى العام globally اي ان المتغيّر يعمل على مستوى الملف كامل , اُنظر لأسئلة سابقة مشابهة لسؤالك
اقرأ ايضاً عن var , let
-
إجابة Haroun Taha سؤال في كيفية استخدام UUID في جانفو Django؟ كانت الإجابة المقبولة
لِما لا تنشئ مُعرف فريد الى Model User مباشرة , دون إنشاء MyModel ومن ثم وضع بداخله حقل UUIDField ومن ثم إعطائه ل Model User ! هذا ليس منطقي أنت هنا:
unique_id = MyModel() في الحقيقة أنت تنشئ نسخة منه كل مرة تُخزن في unique_id فئة من نوع Class Model <NumberOfAddressInMemory> example الحل هو إنشاء UUID مباشرة في Model User وحذف الفئة MyModel هكذا :
class User(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) اذا كنت لا تُريد حذف الفئة MyModel وتريد علاقة بين الفئة User والفئة MyModel فيمكنك إنشاء علاقة ForeignKey بين الفئتين هكذا سيرتبط كل User مع MyModel مع UUID مختلف بالشكل التالي :
class User(models.Model): unique_id = models.ForeignKey(MyModel, on_delete=models.CASCADE)
-
إجابة Haroun Taha سؤال في كيفية الوصول إلى بيانات طلب من نوع PUT في جانغو Django؟ كانت الإجابة المقبولة
صحيح سوف تستعمل QueryDict عند إجراء طلب من نوع PUT سوف تقوم باستدعاء QueryDict من django.http ومن ثم تمرير لها متن الطلب أو البيانات التي بداخله request.body حينها سوف تحصل على بيانات الطلب الذي من نوع PUT ومن ثم جلب البيانات من المفتاح الذي تُريده الذي هو في سؤالك description من دالة get كما في الكود التالي :
from django.http import QueryDict def request_put(request): put = QueryDict(request.body) description = put.get('description') ...
-
إجابة Haroun Taha سؤال في كيفية تحديث أكثر من حقل field دفعة واحدة في نموذج Model في جانغو Django؟ كانت الإجابة المقبولة
إذا كنت تريد عمل تحديث على instance من هذا النموذج MyModel وتعديل اكثر من حقل دفعة واحدة ولديك قاموس بأسماء كل حقل والقيمة التي تريد تعديلها عليك استخدام دالة update لأنها تقبل قاموس يجب ان يكون بنفس الحقول للكائن او الObject المُراد التعديل عليه ولكن يجب ان تكون تعلم ما هو المعرف او pk الخاص بالكائن للتحديث عليه حسناً الأمر في جانغو Django سيكون كالتالي :
MyModel.objects.filter(pk=pk).update(**values) # القاموس التي تحتوي البيانات المراد تعديلها values
-
إجابة Haroun Taha سؤال في كيفية إستخدام custom widget لحقل واحد فقط في جانغو Django؟ كانت الإجابة المقبولة
حسناً سنقوم بتحويل DateTimeField الى checkbox في لوحة التحكم Django Admin كما طلبت اولاً قم بإنشاء ModelForm في ملف admin.py الذي يوجد به الModelAdmin الخاص بك وسوف نقوم بوصف التعديل على حقل ال DateTimeField في داخل الclass Meta التابع الى ال ModelForm سوف نقوم بإضافة widgets CheckboxInput ونقوم بإعطائه اسم الحقل الذي نريد تعديله الى checkbox وذلك على النحو التالي :
# in admin.py file from .models import MyModel from django import forms from django.contrib import admin from django.forms import CheckboxInput class MyModelForm(forms.ModelForm): class Meta: model = MyModel widgets = { 'field_name': CheckboxInput, } fields = '__all__' الأن سوف نُخبر Django Admin بهذا التعديل سنقوم بكتابة الModelAdmin تحت الكود السابق بالشكل التالي:
# in admin.py file from .models import MyModel from django import forms from django.contrib import admin from django.forms import CheckboxInput class MyModelForm(forms.ModelForm): class Meta: model = MyModel widgets = { 'field_name': CheckboxInput, } fields = '__all__' class MyModelAdmin(admin.ModelAdmin): form = MyModelForm # Django Admin إنشاء الفورم الى admin.site.register(MyModel, MyModelAdmin) # Django Admin في MyModel تسجيل الفورم الى مثال بصري للنتيجة :
قبل
بعد التعديل
-
إجابة Haroun Taha سؤال في الطلب request يُعيد الرمز 301 في جانغو Django كانت الإجابة المقبولة
سبب هذه النتيجة إعطائك الcurl نتيجة HTTP 301 هو مشكلة من (جهة العميل او المُرسل "انت") في إرسال الرابط وتكون المشكلة في الغالب ان الرابط المرسل غير صحيح http://example.com في Django يعتبر الروابط التي تُرسل من جهة العميل او المُرسل في حالتنا هو CURL تنتهي برمز " / " اي انه سيفترض أنك ستُرسل له الرابط عند الطلب كالتالي:
http://example.com/ وذلك لأن Django في ملف settings.py يوجد به معرف APPEND_SLASH = True قد لا يكون ظاهر ولكنه default in django settings.
-
إجابة Haroun Taha سؤال في كيفية تغير عنوان صفحة تسجيل الدخول الإفتراضي عند إستعمال login_required@ في جانغو Django؟ كانت الإجابة المقبولة
تُريد ان توجه المستخدم الى صفحة تسجيل معينة سنقوم بتحديد URL مخصص لتوجيه المستخدم لصفحة تسجيل الدخول هاد الlogin_required decorator@ يقوم بفحص المستخدم هل مُسجل دخول اذا لم يسجل دخوله سيحوله تلقائي للصفحة التي سيتم توجيهه لها سنقوم بعمل التالي اولاً تخصيص URL لصفحة تسجيل الدخول:
from myapp.views import login_page urlpatterns = [ path('auth/login-page', login_page, name='login_page'), ] سنقوم بعد ذلك بإنشاء دالة الlogin_page التي ستعمل على تحويل المستخدم لصفحة التسجيل التي تريد تحويله لها:
def login_page(request): if request.method == 'POST': ''' email = request.POST['email'] password = request.POST['password'] POST خطوات عملية تسجيل الدخول عند ارسال البيانات اذا كان الطلب .. .. ''' return render(request, 'auth/login.html') #وسيتم تحويل المستخدم الى الصفحة المخصصة لتسجيل الدخول GET في الحالة العادية عند طلب الرابط سيكون الطلب اخيراً سنُخبر الDjango ان اي عملية فحص من ال login_required ولم يكن المستخدم مُسجل دخول يتم تحويله الى الURL الذي قمنا بتخصيصه في الكود السابق سيتم ذلك في ملف settings.py تقوم بإضافة هذا المُعرف :
# in settings.py file LOGIN_URL = '/auth/login-page' وهكذا قمنا بتخصيص الURL الموجه لصفحة تسجيل دخول محددة.
-
إجابة Haroun Taha سؤال في خطأ could not create unique index عند التهجير migrating في جانغو Django كانت الإجابة المقبولة
اذا كنت تريد ان يكون uuid وان يكون هو PrimaryKey للجدول اي انه لا يمكن تكراره unique اكتب فقط primary_key=True يصبح unique عليك كتابة في class Product:
import uuid from django.db import models class Product(models.Model): uuid = models.UUIDField(primary_key=True, default=uuid.uuid4) من الممكن ايضاً وليس أكيد ان يكون لديك تعارض في البيانات السابقة في قاعدة البيانات لأنك تقوم بتغيير على هيكلية الجدول فعليك حينها حذف قاعدة البيانات ومن ثم احذف كل شيء باستثناء ملف init__.py__ في مجلد migration في جميع apps Django سأرفق بصورة اي الملفات التي سوف تُحذف لحذف قاعدة البيانات وملف الmigrations في app في مشروع بعد ذلك قم بعمل :
python manage.py makemigrations and python manage.py migrate
-
إجابة Haroun Taha سؤال في خطأ non-keyword arg after keyword arg عند إستعمال التابع filter في جانغو Django؟ كانت الإجابة المقبولة
دالة filter لا تقبل ان تمرر لها دالة كدالة ()is_active فالحالة التي لديك الافضل إنشاء حقل BooleanField في model Foo وقم بإعطائه default True هكذا:
class Foo(models.Model): is_active = models.BooleanField(default=True) ومن ثم لإرجاع الكائنات من Foo التي لديهم القيمة is_active = True نستعمل بدالة filter من Bar لفحص الكائنات المُرادة بتحديد قيمتها True هكذا:
Bar.objects.filter(foo__is_active=True) هكذا سيرجع لك الكائنات من model ال Foo التي قيمة is_active = True .
-
إجابة Haroun Taha سؤال في كيفية ربط مشروع React بجانغو Django؟ كانت الإجابة المقبولة
لا لا لن نقوم بتحويل مشروع الReact.js الى ملفات HTML منفصلين كلياً عن بعضهما ستقوم بإنشاء مجلد فارغ يوجد به مجلدين اسم المجلد الاول frontend وستضع به مشروع ال React.js اسم المجلد الثاني backend وستضع به مشروع ال Django حسناً لا استخدام لملفات الTemplates بالدجانغو نهائياً إنما طريقة التواصل بين الدجانغو والريأكت بإستخدام API أنظر الى الأجوبة التالية لتأخذ فكرة كيف عمل الAPI :
اذاً عليك تعلم كيف تنشئ API لل models داخل Django التي لديك من خلال تعلم:
Django-Rest-Framework من الناحية الاخرى تفتح مشروع الReact.js وتقوم بتشغيل السيرفر عند عرض الصفحة التي ستتواصل مع الDjango يجب ان تحتوي ميثود لطريقة إتصال فيURL HTTP في السرد التالي , نجلب البيانات من عنوان المحلي local كمثال /http://127.0.0.1:8000/api/teachers باستخدام JavaScript دالة ()fetch بعدها من دالة fetch تستعمل دالة then لتحويل الرد الى json وبعدها نتعامل مع البيانات المستلمة بأي شكل تريده تعرضها بقائمة تعرضها داخل الصفحة أي كان .كالمثال التالي داخل React.Js صفحة التي ستجلب البيانات من دجانغو:
// Function to collect data const getApiData = async () => { const response = await fetch( "http://127.0.0.1:8000/api/teachers/" ).then((response) => response.json()); // update the state setUsers(response); };
اذاً فقط سوف تتعلم Django REST framework لتتعلم كيف تنشئ API لتكون طريقة التواصل مع Django with React.js ومن ثم تضمينها داخل مشروع الدجانغو الخاص بك وتشغيل السيرفر ستظهر لك النتيجة كالمثال البصري التالي :
-
إجابة Haroun Taha سؤال في كيفية تغير قيمة حقل معين في queryset في جانغو Django؟ كانت الإجابة المقبولة
تمام تريد تغيير جميع الحقول verified الى True للكائنات التي تم الحصول عليها من الqueryset المرفقة.
بما ان الqueryset هي عبارة عن مصفوفة من الكائنات فسنقوم بعمل حلقة تكرار على هذه المصفوفة التي يوجد بها الكائنات. حسناً سنقوم قبل حلقة التكرار بعمل فحص هل ال queryset مصفوفة غير فارغة بإنشاء شرط كالتالي:
qs = MyModel.Objects.filter(...) if qs: # here implement for loop من ثم جلب جميع الكائنات من المصفوفة في حلقة التكرار for وفي كل حلقة سيجلب لك object سنصل الى verified من خلال الاوبجت object وإعطاء قيمة True الى verified ومن ثم لا ننسى تنفيذ ميثود save() لل object لكي يحفظ هذا التغيير في قاعدة البيانات كما في الكود التالي :
qs = MyModel.Objects.filter(...) if qs: for object in qs: object.verified = True object.save() وبهذا الشكل تم تغير قيمة الحقل verified إلى true في كل الكائنات التي تم الحصول عليها من خلال queryset السابقة.
اتمنى ان تكون قد فهمت الفكرة تحياتي .
-
إجابة Haroun Taha سؤال في كيفية جعل الإختيارات Choices تقتصر على الكائنات الموجودة في علاقة Relationship في جانغو Django؟ كانت الإجابة المقبولة
بالبداية انت لديك علاقة بين student وFavorite
عند الاختيار وعرض الخيارات هو بالتأكيد سوف يعرض جميع الخيارات Favorite لأنه كيف سيتم عرض العناصر المفضلة الخاصة بالطالب وهو الطالب لم ينشئ بعد ! كما أرى انت منشئ علاقة ForignKey تشاركية عند ال student و Favorite
فالأفضل حذف العلاقة من جدول او model ال Favorite ووضع العلاقة manyTomany في model ال student
favorite = models.ManyToManyField("Favorite", blank=True, null=True) في قواعد البيانات عند إنشاء علاقة manyTomany فإن Django في الخفاء في قاعدة البيانات سوف ينشئ جدول غير ظاهر يوجد به " Id student : Id favorite " وهكذا سيصبح التعامل افضل لك بإضافة وجلب بيانات ال Favorite الخاصة بكل student دون تعقيد .
ارجو ان تكون فهمت الفكرة.
-
إجابة Haroun Taha سؤال في كيفية إعادة توجيه المستخدم إلى الصفحة السابقة في جانغو Django؟ كانت الإجابة المقبولة
في ملف views.py في الدالة الموجهة للصفحة التي يوجد بها ال form هي نفسها الدالة المستقبلة لبيانات ال form ستضع ال URL الموجه لها في الaction الخاص بالform
<form action="{% url 'name_url' %}" method="post"> هذه الدالة في ملف الviews.py عند الحالة الطبيعي لعرض ال form تكون GET
سوف نفحص اذا كانت الطريقة لعرض الدالة POST :
def method(request): if request.method == 'POST': سوف نعمل إستلام للبيانات من ثم عمل الاجراء الذي تريده عليها او اي كان
وبعد الانتهاء سوف نرجع الموجه الى نفس الصفحة انظر للمثال التوضيحي للدالة :
def contact(request): if request.method == 'POST': name = request.POST.get('name') email = request.POST.get('email') message = request.POST.get('message') Contact.objects.create(name=name, email=email, message=message) return render(request, '/url/forms.html') # من الفورم ستنفذ هذا السطر وترجع على نفس الصفحة submit هنا اذا ضغطت "POST" بعد استلام البيانات من الفورم return render(request, '/url/forms.html') # اذن عند الضغط على عرض الفورم ستنفذ هذا السطر"GET" دون الدخول في الشرط سيكون عرض فقط للفورم ارجو ان تكون فهمت الفكرة تحياتي.
-
إجابة Haroun Taha سؤال في كيفية إزالة كل العلاقات من many-to-many في جانغو Django؟ كانت الإجابة المقبولة
فهمت منك أنك تريد حذف كل العلاقات الموجودة في MyModel
حسناً اذن امسح أي سطر يحتوي على
relations = models.ManyToManyField(MyOtherModel) or
relations = models.ForeignKey(MyOtherModel) هكذا اصبح لديك الMyModel لا يوجد به اي علاقة ترتبط به مع اي OtherMode
لا تنسى ان تنفذ الأمر makemigrations and migrate
ارجو ان تكون قد فهمت الفكرة تحياتي.
-
إجابة Haroun Taha سؤال في خطأ 'module' object has no attribute 'TextField' في جانغو Django؟ كانت الإجابة المقبولة
في حالة تستخدم الforms.ModelForm
يتم تعريف الTextField وحقل الإدخال بإستخدام forms.CharField بدلاً من forms.TextField مثال توضيحي :
full_name = forms.CharField(label=_(u'full name'), min_length=2, max_length=70) ارجو ان تكون وضحت المشكلة تحياتي.
-
إجابة Haroun Taha سؤال في كيفية إزالة رابط الحذف من لوحة Admin في جانغو Django؟ كانت الإجابة المقبولة
في ملف ال admin.py الخاص بال app
قم بتعريف class مورث بخصائص ال admin
ومن ثم سنقوم بعمل اعادة تعريف للدالة المسؤولة عن زر الحذف اسم الدالة has_delete_permission
نكتب داخلها ان ترجع قيمة false
من ثم إعطاء هذا ال class لدالة الadmin.site.register
مثال توضيحي داخل ملف admin.py:
from django.contrib import admin class DisableDeleteButtonAdmin(admin.ModelAdmin): def has_delete_permission(self, request, obj=None): # Disable delete return False admin.site.register(YourModel, DisableDeleteButtonAdmin) وهكذا اضمن لك انه تم الغاء تفعيل زر الحذف وتمت الاجابة على سؤالك
مثال بصري للنتيجة ..
قبل اضافة الكود :
بعد كتابة الكود :
ارجو ان تكون قد فهمت الطريقة تحياتي .