?? ??? ?? ????? ?
We comply with Telegram's guidelines:
- No financial advice or scams
- Ethical and legal content only
- Respectful community
Join us for market updates, airdrops, and crypto education!
Last updated 6 months, 1 week ago
[ We are not the first, we try to be the best ]
Last updated 8 months, 3 weeks ago
FAST MTPROTO PROXIES FOR TELEGRAM
ads : @IR_proxi_sale
Last updated 4 months, 3 weeks ago
✅سوال پایتونی
آیا روشی که توی خط 8 متد super رو صدا زدیم درست است؟
این کد ارور میده؟
✅سوال پایتونی
این کد رو اجرا کنیم، نتیجه ش چی میشه؟
اعتراف می کنم خودم نمی دونستم.
از صبح داشتم یک پروژه رو review
میکردم که بنا به مشکلات از یک فریمورک به فریمورک دیگه جابجا شده؛ اما بعد از جابجایی یک سری بخشهای پروژه باگ داره و من وارد شدم برای کد ریویو (امروز صبح روز اول کارم بود)
دسترسی به کدهای قدیمی هم گرفتم، میبینم تست نویسی برای این باگ تو زبان و فریمورک قبلی انجام شده ولی این سمت توی تستها نیست !
بنظرتون مشکل از کجاست ؟
مدیرفنی یا تیملید بکند.
یک درس بزرگی که حتی قبل از ورود به دنیای بکند و بخاطر عادت به سورس کد خوندن گرفتم این بود که
Intégration test
اولویت بالاتری داره از
Unit test
واقعیت هم همین هست، unit test
برای راحتی خودمون و دولوپر بعدی هست و intégration
test
برای راحتی و بدون باگ بودن استفادههای client
خیلی تیمها (ایرانی و خارجی) که intégration test
نمینویسند متاسفانه ولی اونهایی هم که مینویسند مثل کدهای امروز من دقیقاً از آنچه که فریمورک ارائه میده استفاده میکنند.
این کاملاً خطا هست، برای مدیر فنی ٫ تیم لید منظورم هست. الان سوالتون اینه که چرا ؟
توی این پروژه اگر intégration test
ها میومد سرور رو روی یک thread
جدا اجرا میکرد و بعد با استفاده از پکیج دیگری مثل requests
درخواست میزد به api
هاش بنظرتون بهتر نمیشد ؟
اگر این اتفاق افتاده بود الان که فریمورک عوض شده نیاز به باز نویسی تستها نبود، یعنی ما فقط برای اجرای سرور روی thread دیگر دستورات رو عوض میکردیم و تستها رو اجرا میکردیم.
وقتی دارم از بیرون به سیستم نگاه میکنم برام چه فرقی داره که چه زبان برنامهنویسی یا چه فریمورکی استفاده شده؛ همونطور که برای یوزر من فرقی نداره.
خواستم بگم حواستون به این نکته باشه، intégration test
باید جوری باشه که فارغ از فریمورک و زبان قابل اجرا باشه.
متاسفانه کدهای جدید این تیم هم این خطا رو داره و باز وابسته شده به فریمورک
✅دوره غیر رایگان ساخت فروشگاه اینترنتی با جنگو آپدیت شد.
قسمت های زیر اضافه شدند:
فصل هفتم
✔️ریفکتور کدهای پرداخت
فصل هشتم
✔️فرم ورود با رمز عبور
✔️فرم ثبت نام کاربر
✔️آماده سازی ارسال ایمیل فعالسازی
✔️تولید توکن فعالسازی ایمیل
✔️فعالسازی حساب کاربر
✔️آماده سازی ورود با موبایل
✔️ورود موفق با کد یکبار مصرف
چند قسمت از این دوره رو اینجا ببینید:
https://t.me/djangolearn_ir/531
https://t.me/djangolearn_ir/533
https://t.me/djangolearn_ir/573
https://t.me/djangolearn_ir/676
https://t.me/djangolearn_ir/724
https://t.me/djangolearn_ir/808
لینک دوره در دانشجویار:
https://www.daneshjooyar.com/project-django/
جزوه جلسه ۱۰ با تشکر از اقا مهدی
آپدیت کردن چند آبجکت به صورت همزمان در #جنگو
فریمورک #django قابلیت آپدیت کردن دیتاها رو به روش ها مختلف داره که خیلی ها یا ازش بی خبر ان یا استفاده نمیکنن. بیایید ببینیم هر کدوم رو کجا استفاده کنی بهتره :)
مدل فرضی:
class Records(models.Model):
name = models.Charfield()
balance = models.InetegerField()
country =models.CharField()
خب فرض کنید ما یک هدیه به مناسب عید نو روز میخواییم به کاربرا بدیم، مثلا میخاییم نفری ۲ هزار تومن هدیه بدیم D:
حالا چند روش وجود داره.
روش اول ( نوب):
```
users = Records.objects.all()
for user in users:
user.balanc = user.balance + 2
user.save()
```
خیلی ساده و البته درب و داغون در خیلی جهات. مشکل اول اینه که ما رو همه کاربرا حلقه میزنیم و هر بار آپدیت رو روی کاربرا صدا میزنیم یعنی برای هر یوزر یک درخواست اپدیت به دیتابیس میره که اگه ۱ میلیون یوزر داشته باشیم ۱ میلیون درخواست میره :).
( تو اینه پست به اینکه باید از F استفاده کنید یا کانکارنسی و اینا هندل کنید اشاره نمیکنم، پستها قبلی بخونید)
حالا روش بهتر چیه؟
روش بهتر:
user = Records.objects.update(balance=F("balance") + 2 )
همینقدر ساده :)
سناریو دوم: با بکاند یک بازی خفن رو داریم توسعه میدیم، داخل این بازی هر هفته یک ایونت اتفاق میوفته که افرادی که اون رو تموم کنن در آخر هفته یک تایتل به کنار اسمشون اضافه میشه و همچنین اگه امتیاز بالاتر از ۱۰ کسب کرده باشن به بالانس پول داخل گیمشون هم ۱۰۰ تا گلد اضافه میشه.
حالا بیایید فقط کوئری آپدیت این بهش ببینیم، فرض کنید این کوئری آخر هفته اجرا میشه. ( این فیلدا تو مدل فرض نداریم دیگه خودتون فرض کنید هست ?❤️)
```
users = Records objects.fileter(done_weekly=True)
for user in users:
user.name = "Grunt " + user.name
if user.weekly_score >= 10:
user.balance = user.balance + 100
user.save()
```
خب همینطور که خیلی معلومه مشکلات فراوان داخلش هست. بزرگترین مشکلش اینه که هر بار برای هر کاربر یک درخواست آپدیت میدیم که میشهه همون مشکل بالا، آما آیا این بار میشه از روش بالا استفاده کرد و اینو فیکسش کرد؟ نه
روش بالا زمانی کاربرد داره که فیلدها قراره یک مقداری ثابتی به همشون داده بشه، اینجا بعضی ها ۱۰۰ تا گلد میگیرن بعضی ها نه پس کار نمیکنه، اینجا ما میتونیم از فانکشن bulk_update جنگو استفاده کنیم.
همون حلقه بالا رو میزنید با این تفاوت که داخلش .save رو صدا نمیزنید و تمام آبجکتها رو داخل مموری آپدیت میکنید و بعد همچین حرکتی میزنید:
Records.objects.bulk\_update(updated\_users\_list)
و تموم همرو با هم آپدیت میکنید با یک درخواست اینجا حتی میتونید یک قدم جلوتر برید و با اضافه کردن updated_fields به ورودی فانشکن و مشخص کردن اینکه دقیقا دوتا فیلد بالانس و نام فقط قرار آپدیت بشه بهترش کنید!
از این به بعد بهتر آپدیت کنید :)
✅شبیه ساز درگاه های بانکی ایران
بعد از بررسی ها و خوندن پرسش و پاسخ های دوستان توی گروه های جنگو
متوجه شدم که محیط sandbox یا test زرین پال و pay.ir از یه تایمی به بعد دیگه غیرفعال شدن
✔️و متاسفانه داکیومنت هاشون رو آپدیت نکردن و همه رو به اشتباه انداختن
سایت banktest.ir زحمت کشیده و درگاه پرداخت بعضی بانکهارو شبیه سازی کرده
البته من ترجیح میدم خودم یه شبیه ساز بنویسم
توی زرین پال یه نکته هم دیدم ولی همه فرایند پرداخت رو باهاش تست نکردم. شاید اگه یه مرچنت کد داشته باشیم بتونم باهاش پرداخت واقعی انجام بدیم. یه کالکشن postman توی next زرین پال هست که یه مرچنت کد داره و ریکوئست دادم جواب میداد.
✔️البته وقتی درگاه پرداخت مستقیم از بانک ها میگیریم، آی پی سرور رو میخوان و از هر آی پی نمیشه request داد. ولی شاید زرین پال اینو چک نمیکنه
آپدیت:
خدایا توبه ? انصافا سرویس دهنده رو ببین. انگار هر کی استخدام شده یه داکیومنت ساخته
سایت زرین پال رو که باز میکنی. لینک توسعه دهندگان مستندات pdf گذاشته که برای سال 1393 هست و توضیحات وب سرویس WSDL یا SOAP هست:
https://www.zarinpal.com/pg/services/WebGate/wsdl
نمونه کد جنگو برای سال 1395 هست و سرویس REST هست و آدرس ها اینجوری هستن (اینجا سندباکس کار میکنه):
https://www.zarinpal.com/pg/rest/WebGate/PaymentRequest.json
حالا توی گوگل سرچ کن 'داکیومنت زرین پال' دو تا سایت داره با توضیحات متفاوت و آدرس ها اینجوری هستن (توی این جدیده سندباکس کار نمیکنه):
https://api.zarinpal.com/pg/v4/payment/request.json
✅معرفی پکیج az-iranian-bank-gateways
از گیت هاب علی زاهدی
✔️اتصال جنگو به درگاه بانک های مختلف
اتصال به بانک های ایرانی
درگاه پرداخت بانک ملی ایران،بانک سامان، بانک ملت، درگاه پرداخت زرین پال و ...
لینک github:
https://github.com/ali-zahedi/az-iranian-bank-gateways
✅برای یه پروژه برنامه نویسی قطعا مدیریت پکیجها یکی از مهمترین نکات و مواردی هست که باید بهش حواسمون باشه.
✔️فایل pdf رو مطالعه کنید.
مطلبی از لینکدین Mohammad Amin Amjadi
برای یه پروژه برنامه نویسی قطعا مدیریت پکیجها یکی از مهمترین نکات و مواردی هست که باید بهش حواسمون باشه.
اگر پکیجها آپدیت نباشن میتونه باعث مشکلات امنیتی و ... بشه.
از اون طرف اگر مدیریت پکیجهامون نادرست باشه میتونه جلوی امکان بیلد پروژه رو هم بگیره حتی.
توی این پست سعی کردم برای پروژههای پایتونی نکاتی رو پیرامون pip بگم که چرا نباید ازش استفاده کنیم و در ادامه نحوه استفاده از poetry رو برای ستاپش، استفاده، dockerfile و pre-commit رو هم آوردم.
امیدوارم که مفید باشه.
#django#python Django Lifecycle
این پکیج چیه کاربردش چیه؟
تفاوت اصلی میان Django Lifecycle و سیگنالها (Signals) در Django این است که Django Lifecycle یک رویکرد ساختارمندتر و اصولیتر را برای مدیریت چرخه عمر اجزا فراهم میکند. با استفاده از Django Lifecycle، شما میتوانید کدهای مربوط به هر مرحله از چرخه عمر را به صورت مستقیم در کلاسهای مدل یا دیگر اجزا تعریف کنید و این اجزا را به یک مدل متصل کنید. این اجازه را به شما میدهد که کدهای مربوط به هر مرحله را در یک مکان مرتبط و خوانا نگه دارید و از تفکیک بخشها بهرهمند شوید.
مثالی از این بخش:
به عنوان مثال، فرض کنید که میخواهید هر زمان که یک مدل از نوع Post ایجاد یا بهروزرسانی میشود، یک عملیات خاصی انجام دهید. با استفاده از Django Lifecycle، میتوانید این عملیات را به صورت مستقیم در مدل Post تعریف کنید، به عنوان مثال:
```
from django.db import models
from django_lifecycle import LifecycleModel, hook
class Post(LifecycleModel):
title = models.CharField(max_length=100)
content = models.TextField()
@hook(BEFORE\_UPDATE, when="content", has\_changed=True)
def update\_history(cls, old\_instance, instance, field\_name):
History.objects.create(
post=instance,
old\_content=old\_instance.content,
new\_content=instance.content
)
post = Post.objects.create(title="Title", content="Content")
post.content = "Updated Content"
post.save()
```
در این مثال، یک مدل به نام Post تعریف شده است که از کلاس LifecycleModel ارثبری کرده است. با استفاده از دکوراتور hook، یک عملیات update_history برای مدل تعریف شده است. این عملیات هر زمان که محتوای یک نمونه از مدل تغییر میکند، یک رکورد جدید به جدول History اضافه میکند که تاریخچه تغییرات محتوا را ثبت میکند.
اطلاعات بیشتر راجبش:
?? ??? ?? ????? ?
We comply with Telegram's guidelines:
- No financial advice or scams
- Ethical and legal content only
- Respectful community
Join us for market updates, airdrops, and crypto education!
Last updated 6 months, 1 week ago
[ We are not the first, we try to be the best ]
Last updated 8 months, 3 weeks ago
FAST MTPROTO PROXIES FOR TELEGRAM
ads : @IR_proxi_sale
Last updated 4 months, 3 weeks ago