جنگولرن
4.03K subscribers
301 photos
79 videos
32 files
575 links
آموزش Django و بستگان
-مفاهیم پر کاربرد پایتون
-مفاهیم مهندسی نرم افزار
-آشنایی با تجربه حرفه ای ها
-آشنایی با راهکارهای حرفه ای ها برای افزایش پرفورمنس
و...

جهت تبلیغ دایرکت کانال پیام بدید
Download Telegram
مدل درست نوشتاری آدرس (URL)

ساختار URL طبق RFC 3986 تعریف شده و در بخش 2.3 تنها مشخص می‌کند چه کاراکترهایی مجاز هستند:

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"


در نتیجه، استفاده از خط تیره (-) یا زیرخط (_) مجاز است، اما RFC هیچ سبک خاصی مثل kebab-case یا snake_case را اجباری نکرده است. با این حال، در عمل kebab-case به‌دلیل خوانایی بهتر و سازگاری بیشتر با موتورهای جستجو، به استاندارد رایج‌تری تبدیل شده است.

ایرادات متداول در آدرس‌ها:

1. استفاده از حروف بزرگ — باعث ناسازگاری و تفسیر متفاوت مسیرها می‌شود.
2. استفاده از فاصله — نیاز به encode دارد و خوانایی لینک را پایین می‌آورد.
3. فینگلیش یا ترکیب زبان‌ها — ناهماهنگی زبانی و افت سئو ایجاد می‌کند.
4. کاراکترهای خاص و نامعمول — نیازمند encode و منبع خطا هستند.
5. استفاده از زیرخط (snake_case) — خوانایی کمتر و شناسایی ضعیف‌تر توسط موتورهای جستجو دارد.
6. استفاده از اعداد یا کدهای نامفهوم — مسیر را غیرتوصیفی و گیج‌کننده می‌کند.
7. ترکیب بی‌هدف حروف و اعداد — فهم و نگهداری آدرس را دشوار می‌سازد.
8. مسیرهای بسیار طولانی یا دارای اسلش‌های اضافی — باعث پیچیدگی و خطای روتینگ می‌شود.

نمونه‌های درست:

https://example.com/page
https://example.com/user-profile/settings
https://example.com/{kebab-case}/{sub-address-directories}


نمونه‌های نادرست:

 https://example.com/AboutUs
https://example.com/my page
https://example.com/kharid-drel
https://example.com/page@1!
https://example.com/user_profile
https://example.com/x92d1/page
https://example.com/a1b2c3


در نهایت، درست‌نویسی در URL فقط به رعایت قواعد RFC محدود نمی‌شود؛ ممکن است یک آدرس از نظر فنی معتبر باشد، اما از نظر تجربه کاربری یا سئو کاملاً نادرست به حساب آید.

نکته: برخی آدرس‌های سرویس‌ها ممکن است از نظر خوانایی مناسب به نظر نرسند، اما این موضوع معمولاً به دلایل فنی، امنیتی یا نیاز به عملکرد خاص (مثل شناسایی منحصربه‌فرد درخواست‌ها یا جلوگیری از پیش‌بینی مسیرها) به‌صورت عمدی طراحی شده است.(مثل کوتاه کننده های آدرس)

✍🏻 @thealibigdeli_channel
103👍2
توی لوپ بی‌نهایت یادگیری نیوفتید ...

احتمالاً تا حالا ۱ میلیارد این رو شنیدید؛ ولی هیچکس نمی‌گه که یعنی چی ؟ مثالش چیه؟ چطوری ؟
حتی می‌تونم بگم شاید چون خودشون هم متوجه نشدند.

یکی از دوستان خودم که اتفاقاً توی زمینه کاری خودش سنیور هم هست، داره AI یاد می‌گیره!
بهش میگم؛ بسه برو کد بزن.
میگه من هنوز اونقدر یاد نگرفتم که بتونم پروژه بزنم (منابع رو خودم بهش دادم و ۱/۳ کتاب اول رو تموم کرده)
میگم اگر قرار شده به حرف من گوش بدی؛ بهونه نیار آخر این هفته فقط پروژه بزن؛ حق خوندن نداری!

بحث ادامه داشت؛ گفتم تو لوپ بی‌نهایت یادگیری نیوفت!
می‌گه؛ نه همین ۵ تا کتابی که گفتی و ۴ تا دوره‌ دانشگاه‌ها رو ببینم دیگه قوی شروع می‌کنم!

پرام ریخته؛ خب این خودش لوپ بی‌نهایت آموزش هست.
اینی که سنیور هست وضعش اینه؛ چه توقع داریم از کسی که تازه داره یاد میگیره ؟

الان اگر کسی ازم بپرسه؛ میگم باید این کتابها رو خوند و باید این دوره‌ها رو دید! و بله باید، ما n8n کار و ... نمی‌خوایم کسی میخوایم که بفهمه چرا و چطور داره کار انجام میشه!
حالا اگر بعداً n8n هم بلد بود که آفرین بهش!

چطوری میشه همه‌ی این منابع رو خوند و توی لوپ بی‌نهایت آموزش هم نیوفتاد ؟

اولاً که این داستان که کلاً برای لوپ آموزش نیوفتادن، می‌گن باید همه چیز رو توی کار تجربه کنی که احمقانه‌ترین حرف دنیاس!
مثال بزنم ؟
فرض کن برنامه‌نویس embedded هستی و قراره یکی از ماژول‌های یک دستگاه توی اتاق عمل رو بنویسی؛ اگر خوب آموزش ندیده باشی و بخوای توی کار یادبگیری شاید جون ۱۰۰۰ نفر رو بگیری تا کد درست رو تحویل بدی.
باید کتاب بخونی، آموزش ببینی، بحث کنی (حتی اشتباه کنی تا یادگیری کامل بشه) و این خاصیت تا آخر عمر تا لحظه‌ای که دست به کیبورد میزنی باید تو وجودت باشه!

اما به این معنی هم نیست که تا روزی که همه چیز رو یاد نگرفتی دست به کیبورد نزنی، تجربه نکنی و ...
۱ فصل کتاب خوندی ؟ کد بزن، نه همون کدی که توی کتاب بود.
مطلب کوچیکی بوده حتی یک کد احمقانه هم ازش در نمیاد؟
اشکالی نداره، از LLM بخواه بهت چندتا پروژه واقعی معرفی کنه که چیزی که یادگرفتی داخلش هست؛ برو و اون سورس کدها رو بخون.
پیدا نشد ؟ از خود LLM بخواه بهت نمونه کد بده و ...

بالاخره بعد از مطلب ۵-۶ ام می‌تونی یک چیز حتی احمقانه و خنده‌دار باهاش بزنی.

اینکه می‌گیم توی لوپ بی‌نهایت یادگیری نیوفت، این نیست که:
۱- کلا یادگیری از کتاب و آموزش رو بذاری کنار
۲- اینم نیست که بگی، این کتاب تموم بشه بعدش حتماً کد میزنم؛ حتی همون ۱ دونه کتابم می‌تونه لوپ بی‌نهایت یادگیری باشه

خلاصه؛ تا همونجا که یادگرفتی رو کد بزن. حتی اگر امروز فقط و فقط
print("Hello World!")
رو یادگرفتی، وقتی خودت کد بزنی، شروع می‌کنی به پرسیدن:
اینکه اگر () نباشه چی می‌شه؟ اگر " نباشه چی؟ یا اگر متن رو عوض کنم چطور؟ و ...

و این مهمترین نکته یادگیری هست!

✍🏻 @per3onal
👏23👍93🆒1
تا حالا شده به ویرایش یه آبجکت در پنل ادمین جنگو لینک بدید؟

فرض کن من یه مدل دارم به اسم Product
که توی یه اپ به اسم shop هست.
با فرض اینکه آیدی Product م 14 باشه.
لینک ویرایش ش توی ادمین جنگو این میشه:
http://127.0.0.1:8000/admin/shop/product/14/change/

اگه با یوزر ادمین توی وردپرس لاگین باشید، دکمه ویرایش همه جا هست و مستقیم میره برای ویرایش.
برای همچین چیزی توی پروژه جنگو به درد میخوره.


حالا چطور لینک بدیم؟
میدونیم که بهتره از تمپلت تگ url و اسم url استفاده کنیم.
اما اسمش چیه؟
اینجوریه:
<a href="{% url 'admin:shop_product_change' product.id %}" target="_blank">Edit Product</a>

دقت کردی؟
اسم اپ admin ع
بعد اسم url ترکیب اسم اپ خودمون + اسم مدل + عملیاتی که میخواهیم انجام بدیم.

از کجا اینارو میاره؟
وقتی داری توی admin.py مدل هارو رجیستر میکنی، از اونجا بر میداره.

توی کدهای جنگو دنبال کلاس AdminSite بگرد و متد get_urls رو ببین. این تیکه ازش:
        # Add in each model's views, and create a list of valid URLS for the
# app_index
valid_app_labels = []
for model, model_admin in self._registry.items():
urlpatterns += [
path(
"%s/%s/" % (model._meta.app_label, model._meta.model_name),
include(model_admin.urls),
),
]
if model._meta.app_label not in valid_app_labels:
valid_app_labels.append(model._meta.app_label)
👏115👍4
Forwarded from mr peary
Media is too big
VIEW IN TELEGRAM
⭕️💢کافه جنگو💢⭕️

آموزش جنگو پایتون
جلسه : اول
موضوع این جلسه: مفاهیم پایه ای پایتون و شیءگرایی در پایتون

رشته: فنی پایه 11 کتب جدید

پایه: 11 فنی و 11 و 12 کاردانش

درس: وب

سطح: متوسط

مدرس: مهندس حاتمی

🔻🔻🔻🔻🔻🔻

#کافه_دانش
#کافه_جنگو
#جلسه_1
#سطح_متوسط_پیشرفته
#توسعه_وب
#یادگیری_مفاهیم_وب
#دبیرخانه_کشوری_رایانه
#مستقر_در_استان_زنجان
#کانال_شاد_دبیرخانه_رایانه
@Yvt_computer
#کافه_دانش
t.me/Zncd_ir_Cafe
#آدرس_سایت_دبیرخانه_رایانه
ZNCD.ir

🔺🔺🔺🔺🔺🔺
5👍2
جنگولرن
⭕️💢کافه جنگو💢⭕️ آموزش جنگو پایتون جلسه : اول موضوع این جلسه: مفاهیم پایه ای پایتون و شیءگرایی در پایتون رشته: فنی پایه 11 کتب جدید پایه: 11 فنی و 11 و 12 کاردانش درس: وب سطح: متوسط مدرس: مهندس حاتمی 🔻🔻🔻🔻🔻🔻 #کافه_دانش #کافه_جنگو #جلسه_1 #سطح_متوسط_پیشرفته…
این ویدئو رو برای همکاران آموزش و پرورش ساختم.
کلاس به صورت آنلاین بود.
بیش از 50 نفر در کلاس شرکت داشتن. و استقبال خوبی شد، خداروشکر.

لینک آپارت این ویدئو:
https://www.aparat.com/v/lbw6z84

ویدئو جلسه اول - آپارات
سال آینده ظاهرا قراره پایتون و جنگو به کلاس 11 رشته شبکه و نرم افزار رایانه، فنی و حرفه ای اضافه بشه.

توی این ویدئو که برای همکاران هنرستانی برگزار شد، مروری سریع بر پایتون داشتیم. و در مورد توابع و مفهوم شی گرایی صحبت کردیم.
سعی کردم مطالبی که توی این قسمت مطرح کردم، بیشتر ارتباط با جنگو رو داشته باشه.
توی این دوره قراره بر اساس کتاب Django 5 By Example پیش بریم. ولی مفاهیمی فراتر از کتاب رو قطعا پوشش خواهیم داد.
تمرکز این دوره بر پرسش و پاسخ خواهد بود. که بتونیم به همکاران راهنمایی بدیم.


اگه نکته ای یا انتقادی دارید، توی کامنت ها بنویسید لطفا
👏112
This media is not supported in your browser
VIEW IN TELEGRAM
این ویدئو کوتاه رو ببینید.

کد پایتونی که اجرا میشه، داره جمع همه‌ عدد های توی یه tuple تو در تو رو حساب میکنه.

تاپلش مثل یه Linked List ع

نکته خیلی خاصی نداره. ولی جالب بود.
👍3🆒21
میدونی squashmigrations توی جنگو چکار میکنه؟

وقتی زیاد makemigrations می کنی (مثلا فیلد جدید اضافه میکنی) باعث میشه یه فایل migration ساخته بشه و فولدر migrations شلوغ بشه.

دستور squashmigrations همه مایگریشن هارو یکی میکنه.

عکسارو ببین. من این دستور رو نوشتم:
python manage.py squashmigrations shop 0003

و باعث شد یه مایگریشن جدید بسازه. و جنگو بهم گفته وقتی مطمئن شدی درسته، میتونی فایل های قبلی رو خودت حذف کنی.

دقت کن:
اگه پروژه ت در حال توسعه با چند نفره، باید مراقب باشی چون squash ممکنه روی هم‌ تیمی‌ هات تاثیر بذاره.

راستی اون replaces مشخص کرده چه اتفاقی افتاده.
پس طبق چیزی که داکیومنت جنگو گفته، بعد از اینکه مطمئن شدی همه migrate کردن و اوکیه. میتونی فایل های مایگریشن قبلی رو حذف کنی و اون replaces هم باید پاک کنی.

و بعدش اگه مایگریشنی dependency داشت به قبلی ها، باید به این جدیده وصلش کنی.

سخت تر شد؟ 😁
به نظرم که بد نیست.
پیشنهاد شما چیه؟
102👍1
Python Positional-Only Parameters

اینو توی کتاب Fluent Python دیده بودم.
با مثال یادش بگیریم:
def hello(a, b, /):
print(a, b)

توی تعریف تابع hello از اسلش استفاده کردم. این اسلش کارش برعکس ستاره است تقریبا
کاربرد * اینجوری بود
def bye(a, *, b):
print(a, b)

حالا بخواهیم دو تا تابع رو اجرا کنیم:
hello('salam', 'ali') #ok
bye('bye', b='ali') #ok

hello(a='salam', b='ali') #error
hello(a='salam', 'ali') #error
hello('salam', b='ali') #error
bye('bye', 'ali') #error


متوجه شدی دیگه؟
اگه از اسلش استفاده کنیم، نباید keyword رو موقع صدا زدن استفاده کنیم.
ولی ستاره میگه، وقتی میخوای صدا بزنی، باید حتما keyword رو بنویسی.

اگه میدونستی 👎🏻 بده لطفا
👍11👎61
کلاس های تو در تو در پایتون یا inner class یا nested class

توی پایتون میشه یه کلاس رو توی کلاس دیگه تعریف کرد، اینجوری مثلا:
class Car:
def __init__(self, name, engine_type):
self.name = name
self.engine = self.Engine(engine_type)

class Engine:
def __init__(self, engine_type):
self.type = engine_type

def start(self):
print(f"{self.type} engine is starting...")

اینجوری استفاده کنیم:
my_car = Car("405", "tu5")
print(my_car.name) #405
my_car.engine.start() # tu5 engine is staring

این حرکت زیاد مرسوم نیست، ولی مثلا برای این کدهای بالا، کلاس Engine تا Car وجود نداشته باشه، قابل استفاده نیست. و یه جورایی صراحتا مشخص کردیم که کلاس Engine وابسته اس به Car.

استفاده ش توی جنگو رو که می دونید کجاهاس؟
توی مدل ها، توی فرم ها و... وقتی یه سری تنظیمات رو توی Meta تعریف می کنیم.
البته، توی جنگو مثل کدی که بالا نوشتم استفاده نشده، این تیکه کد از سورس جنگوعه و داره از Meta استفاده میکنه:
class ModelBase(type):
"""Metaclass for all models."""

def __new__(cls, name, bases, attrs, **kwargs):
super_new = super().__new__

# Also ensure initialization is only performed for subclasses of Model
# (excluding Model class itself).
parents = [b for b in bases if isinstance(b, ModelBase)]
if not parents:
return super_new(cls, name, bases, attrs)

# Create the class.
module = attrs.pop("__module__")
new_attrs = {"__module__": module}
classcell = attrs.pop("__classcell__", None)
if classcell is not None:
new_attrs["__classcell__"] = classcell
attr_meta = attrs.pop("Meta", None)
# Pass all attrs without a (Django-specific) contribute_to_class()
# method to type.__new__() so that they're properly initialized
# (i.e. __set_name__()).

اون attr_meta داره تنظیمات رو بر میداره و...
1🆒1