راهنمای سریع *args و **kwargs در پایتون

مدت‌ها بود که سعی داشتم تا یک مطلب به زبان انگلیسی را در مدیوم منتشر کنم. اما با وجود آنکه دانش نسبتا خوبی از قواعد انگلیسی و Writing داشتم، همیشه بیخیال ماجرا می‌شدم. اما امروز تصمیم‌م قطعی شد و یک مطلب هر چند کوتاه (حدود ۳۰۰ کلمه) اما کاربردی را در مدیوم منتشر کردم.

A Quick Guide on *args & **kwargs in Python

ساخت یک وب اپلیکیشن ساده با استفاده از فلَسک

در میان میکروفریمورک‌های دنیای وب می‌توان گفت که فلسک یکی از محبوب‌ترین آن‌هاست. به همین دلیل تصمیم گرفتم تا یک مطلب کوتاه و در عین حال کاربردی برای شروع کار با فلَسک را بنویسم. برای مطالعه این مطلب به نوشته «ایجاد یک وب اپلیکیشن ساده با پایتون و فلاسک» مراجعه کنید.

کار با JSON در پایتون + ویدیو

داشتن درک خوبی از JSON و شیوه کار کردن با اون می‌تونه برای تبدیل شدن به یک توسعه‌دهنده مؤثر خیلی کمک بکنه. JSON یک فرمت متنی برای نمایش داده هستش. JSON مخفف کلمات JavaScript Object Notation به معنای نشانه‌گذاری شیء جاوااسکریپت هستش که همون انگلیسی‌ش بهتره!

ادامه…

کاربرد _ در پایتون + ویدیو

شاید خیلی از توسعه‌دهنده‌های پایتون خبری از وجود _ به عنوان یک ابزار مهم نداشته باشند. در واقع خودم یکی از اون‌ها بودم. خب باید بگم که این علامت ( _ ) که به انگلیسی میشه Undrescore در جاهای مختلفی از برنامه کاربرد داره. بیایید به کاربردهاش یه نگاهی بندازیم.

کاربرد اول: استفاده در مفسر پایتون

آخرین دستوری که منجر به یه خروجی شده چیه؟ حالا اون خروجی دقیقا چیه؟ اگه می‌خواید به اون مقدار دسترسی داشته باشید کافیه که توی خود مفسر تعاملی پایتون عملگر _ رو وارد بکنید. مثلا:

>>> a = 20
>>> a
20
>>> _
20
>>> _ - 10
10

کاربرد دوم: نادیده گرفتن مقادیر

زمانی که بخواید یه مقداری یا مقادیری رو در برای انتساب‌های جمعی نادیده بگیرید می‌تونید از ـ استفاده کنید. برای روشن شدن قضیه به کد زیر نگاه کنید:

a, _, b = (1, 2, 3) # a = 1, b = 3
print(a, b)

مقدار ۲ در هیچ متغیری ذخیره نمیشه. اگر هم از یک علامت ستاره قبل از آندرسکور استفاده کنید یک بازه از مقادیر رو بیخیال میشه:

a, *_, b = (7, 6, 5, 4, 3, 2, 1)
print(a, b)

کاربرد سوم: استفاده در حلقه‌ها

می‌تونید بجای استفاده از متغیر در یک حلقه for از یک آندرسکور استفاده کنید:

for _ in 'Arastoo':
    print( _ )

کاربرد چهارم: جدا کردن ارقام

وقتی می‌خواید یه مقدار عددی بزرگ رو در یک متغیر قرار بدید، اگه نمی‌تونید که درست از تعداد ارقام متوجه بشید می‌تونید با _ اون‌ها رو از هم جدا بکنید. البته این تنها یک موضوع ظاهریه و چیزی رو توی متغیر غیر از عدد واقعی ذخیره نمیکنه:

million = 1_000_000
binary = 0b_0010
octa = 0o_64
hexa = 0x_23_ab

کاربرد پنجم: مهمترین مورد: نام گذاری

چهار حالت برای نام‌گذاری متغیر با استفاده از _ وجود دارد:

  • استفاده از _ قبل از نام متغیر
  • استفاده از _ بعد از نام متغیر
  • استفاده از دو _ قبل از نام متغیر
  • استفاده از دو _ قبل و بعد از نام متغیر

استفاده از _ قبل از نام متغیر

class Test:

    def __init__(self):
        self.name = "datacamp"
        self._num = 7

obj = Test()
print(obj.name)
print(obj._num)

در قواعد پایتون ذکر شده که برای خصوصیاتی که می‌خواهید Private باشند از یک _ قبل از نام آن‌ها استفاده کنید. البته این موضوع در روند اجرا کاری انجام نمی‌دهد اما اگر بخواهید اصولی کد بنویسید باید این موضوع را در نظر داشته باشید.

البته برای توابع می‌شود از چنین قابلیتی حتی در روند اجرا نیز استفاده کرد. به تکه کد زیر نگاه کنید:

def func():
    return "datacamp"

def _private_func():
    return 7

حالا اگه بخوام که تابع رو توی یه ماژول دیگه import بکنم با تابع func مشکلی نخواهد داشت ولی تابع _private_func رو نمیتونم import بکنم:

>>> from my_functions import *
>>> func()
'datacamp'
>>> _private_func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name '_private_func' is not defined

البته اگه شیوه import کردن رو تغییر بدم و مستقیم از نام تابع همراه با ماژول استفاده بکنم همچین قابلیتی غیرفعال میشه:

>>> import my_functions
>>> my_functions.func()
'datacamp'
>>> my_functions._private_func()
7

ظاهرا تنها زمانی که بخواید به صورت غیر مستقیما (تکنیکالی اینم اشتباهه) از تابع استفاده کنید به شما خطا میده.

استفاده از _ بعد از نام متغیر

زمانی که مجبور باشید از یک نام برای متغیر استفاده بکنید که همزمان اون نام کلمه کلیدی پایتون هستش می‌تونید یک _ به آخرش اضافه کنید:

>>> def function(class):
  File "<stdin>", line 1
    def function(class):
                 ^
SyntaxError: invalid syntax
>>> def function(class_):
...     pass

استفاده از دو _ قبل از نام متغیر

تصور کنید که شما دو کلاس دارید که هر دو یک خصوصیت با یک اسم دارند. حالا شما یک کلاس سوم هم دارید که از هر دو کلاس قبلی میخواد ارث‌بری بکنه، زمانی که بخواد به هر دو خصوصیت دسترسی داشته باشه به مشکل بر می‌خوره چرا که نمی‌تونه همزمان از دو خصوصیت با یک نام استفاده بکنه. پایتون برای حل این مشکل با تکنیک name mangling از ما پذیرایی میکنه.

مثال:

class Sample():

    def __init__(self):
        self.a = 1
        self._b = 2
        self.__c = 3
obj1 = Sample()

برای دسترسی داشتن به خصوصیات a و b و c چه کاری انجام می‌دهید:

print(obj1.a)
print(obj1._b)
print(obj1.__c)

حالا اگر برنامه رو اجرا بکنید با مشکل روبرو می‌شید. چرا که ما عضوی به اسم __c رو نداریم. بجاش پایتون می‌آد اون عضور رو _Sample__c معرفی میکنه. یعنی ترکیبی از نام کلاس و خود خصوصیت. اینطوری دیگه مشکلی پیش نمیاد.

برای درک بهتر قضیه پیشنهاد میکنم ویدیو اول این مطلب رو ببینید.

استفاده از دو _ قبل و بعد از نام متغیر

توی پایتون به متدهایی که به شکل زیر هستند میگیم متدهای جادویی یا داندر متد. این دستورات ابزارهای پیشفرض پایتونی هستند.

class Sample():

    def __init__(self):
        self.__num__ = 7

obj = Sample()
obj.__num__

بهتره هیچوقت برای اسم گذاری‌هامون از این سبک استفاده نکنیم چرا که ممکنه با دستورات اصلی پایتون اشتباه گرفته بشن.

منبع

https://www.datacamp.com/community/tutorials/role-underscore-python

اولین قدم‌ها برای ورود به دنیای پایتون

چطوری میشه یه برنامه‌نویس خوب پایتون بود؟ یا بهتر بگم «چگونه وارد پروسه یادگیری پایتون شویم»؟ مطمئنا پاسخ دادن به چنین سوالاتی یک جواب مشخص و معین نداره، اما من قصد دارم با استفاده از تجربیات شخصی و منابع موجود به این سوالات در قالب یک مقاله پاسخ بدم و قدم به قدم شما رو با روال وارد شدن به دنیای برنامه‌نویسی پایتون آشنا بکنم.

۱. پایتون چیست؟

پایتون یا Python یک زبان برنامه‌نویسی شئ‌گرا، پویا و تفسیری است، از آنجایی که پایتون انعطاف‌پذیری بالایی دارد، می‌تواند در پروژه‌های بزرگ و کوچک به خوبی استفاده شود. بر خلاف چیزی که لوگو الان پایتون است، هدف سازنده اصلی پایتون -گیدو وان روسوم- از این نامگذاری اشاره به گروه کمدی بریتانیایی Monty Python بوده است. تقریبا می‌شود گفت که پایتون در تمام فیلدهای کامپیوتری استفاده می‌شود اما حضور برجسته پایتون را می‌شود در فیلدهای زیر مشاهده کرد:

  • برنامه‌نویسی علمی، ریاضیات، تحلیل داده و…
  • طراحی و توسعه اپلیکیشن‌های مبتنی بر وب و GUI
  • یادگیری ماشین و هوش مصنوعی

در حال حاضر پایتون در شرکت‌های بزرگ جهان مورد استفاده قرار می‌گیرد، از این موارد می‌شود به یوتیوب، دراپ‌باکس و رِدایت اشاره کرد. جدای از این موارد غول‌هایی چون اینستاگرام و پینترست نیز برای توسعه وبسایت‌های خود از فریمورک جنگو که یکی از فریمورک‌های پایتون است، استفاده می‌کنند.

بعضی وقت‌ها از بس که پایتون ساده هستش، قدرتش دست کم گرفته میشه 🙂

پایتون زبانی Strong Type است، به این معنا که نوع‌های داده‌ای به درستی بررسی می‌شوند. شما در چنین حالتی برای مثال نمی‌توانید یک رشته و یک عدد طبیعی را با همدیگر جمع بکنید. همچنین از آنجایی که پایتون یک زبان پویا است، تعریف متغیر و مدیریت حافظه در زمان اجرا به صورت خودکار انجام می‌شود. پایتون یک زبان Case-Sensitive نیز است، بنابراین تعریف یک نام به بزرگ و کوچک بودن حروف حساس است.

۲. نسخه‌های پایتون

پایتون یک زبان آزاد و متن باز است، همچنین برای سیستم‌ عامل‌های مختلفی از جمله لینوکس، مک و ویندوز عرضه شده است. اما به صورت کامل‌تر باید بگویم که پایتون روی ۲۱ سیستم عامل مختلف کار می‌کند. در بیشتر این سیستم‌ عامل‌ها پایتون به صورت پیشفرض نصب شده است. برای بررسی کردن این موضوع تنها کافی‌ست یکی از دستورات زیر را در محیط خط فرمان/ترمینال خود وارد کنید:

python -V
python3 -V

هر کدام از دستورات بالا می‌تواند خروجی شبیه به زیر داشته باشد:

Python 3.6.7

اگر چنین خروجی را دریافت نکردید، نشان از این موضوع می‌دهد که پایتون روی سیستم عامل شما نصب نیست.

انتخاب یک نسخه از پایتون

در حال حاضر پایتون از دو نسخه ۳ و ۲ بهره می‌برد. برای بعضی از افراد ممکن است انتخاب بین این دو مورد پیچیده باشد اما بدون شک نسخه ۳ انتخاب مناسبی است، اما در حالت‌هایی نیز ممکن است مجبور باشید از نسخه دوم استفاده بکنید. نسخه ۲ پایتون نسخه قدیمی‌تر این زبان است و زیرساخت برخی از برنامه‌ها هنوز برپایه‌ی این زبان ساخته شده است، از این رو برای کار کردن روی آن دسته از برنامه‌ها نیاز است که پایتون ۲ را بلد باشید، اما این نسخه از طرف بنیاد پایتون تا مدتی دیگر پشتیبانی می‌شود و پیشنهاد شده که همه زیرساخت‌ها به پایتون ۳ بروزرسانی شود. از این رو ما یادگیری نسخه ۳ پایتون را پیشنهاد می‌دهیم. ادامه این مطلب نیز روی همین نسخه تمرکز دارد.

۳. دریافت پایتون

برای دریافت مفسر پایتون شما می‌توانید از وبسایت Python.org استفاده بکنید. از آنجایی که پایتون روی بیشتر سیستم‌ عامل‌های موجود کار می‌کند، بنابراین ممکن است با پکیج‌های مختلفی از پایتون مواجه شوید:

  • اگر از مک استفاده می‌کنید بهتر است برای نصب پایتون از پکیج منیجر brew استفاده نمایید.
  • برای لینوکس نیز استفاده کردن از پکیج منیجرهایی مانند apt، yarm و… مناسب است.
  • برای ویندوز شما باید نسخه نصبی آن را از وبسایت اصلی پایتون دانلود کنید.

البته بدونید که معمولا روی مک و لینوکس به صورت پیشفرض پایتون نصب هستش، پس قبل از اقدام به نصب از بودن یا نبودن پایتون مطمئن بشید.

برای بررسی وجود پایتون رو سیستم عامل همانطور که قبلا اشاره شد، محیط متنی خود را باز کرده و دستور python3 یا python را وارد کنید. مطمئن باشید که نسخه ۳ از پایتون اجرا می‌شود.

ممکنه توی ویندوز هیچکدوم این دستورها کار نکنه، توی ویندوز معمولا با نوشتن py پایتون اجرا میشه.

حال که پایتون اجرا شده، کافی‌ست برنامه زیر را در همان محیط متنی نوشته و اینتر را فشار دهید:

print(‘Hello, World!’)

برای خارج شدن از محیط پایتون می‌توانید از کلید‌های CTRL+D و یا فراخوانی تابع exit() یا quit() استفاده بکنید.

۴. پیدا کردن یک منبع آموزشی مناسب

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

۵. انتخاب یک کد ادیتور راحت

منابع آموزشی که در بالا لیست کردم در برداشتن این قدم به شما کمک می‌کنند. در هر کدام از منابع به شما ابزارهای مختلفی را برای کدنویسی معرفی کرده است که می‌توانید از هر کدام استفاده کنید.

من به شخصه اوایل فقط ازIDLE پایتون استفاده می‌کردم، اما بعدا برای انجام پروژه‌ها و کارهای بزرگ‌تر VSCode رو انتخاب کردم.

لیستی از کد ادیتورهای مناسب برای برنامه‌نویسی:

۶. درک قواعد پایتون

قاعده اصلی که در پایتون وجود داره اینه که توی پایتون تنها یک راه برای نوشتن یک برنامه وجود داره و اون راه بهترین راهه!

شاید این موضوع برای‌تان عجیب باشد اما یک واقعیت است. با این حال پایتون یک مانیفست مانند نیز دارد که به برنامه‌نویسان کمک می‌کند تا به این نقطه «افلاطونی» برسند.

برای مشاهده این مانیفست می‌توانید در زمان اجرای پایتون در محیط خط فرمان، دستور زیر را وارد کنید:

import this

این دستور خروجی زیر را به ما می‌دهد:

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

۷. آشنایی اولیه با کدنویسی در پایتون

قبل از آنکه به دوره‌ها و منابع آموزشی گفته شده مراجعه کنید، بیایید با سینتکس کلی زبان برنامه‌نویسی پایتون آشنا شویم. ما در این بخش با شیوه تعریف متغیرها، توابع، حلقه‌ها و دستورات کنترلی آشنا می‌شویم و همچنین نگاهی به ساختارهای داده‌ای مختلف در پایتون می‌اندازیم.

۷-۱. تعریف متغیر

همانطور که گفته شد پایتون یک زبان برنامه‌نویسی پویا است. از این جهت در زمان تعریف یک متغیر نیازی به تعیین کردن نوع داده‌ای آن ندارید، این فرایند در زمان اجرا به صورت خودکار مدیریت می‌شود. برای تعریف متغیر در پایتون به سادگی تنها یک نام را تعریف کرده و یک مقدار را به آن نسبت دهید:

name = "Arastoo"

نام متغیر باید از شرایطی پیروی بکند که در این مطلب قصد صحبت در ارتباط با این جزئیات را نداریم.

توی پایتون نسخه ۳ از سیمی‌کولن در آخر دستورات استفاده نمی‌کنیم، مستندات خود پایتون هم پیشنهاد می‌کنند که استفاده نکنیم اما این امر اختیاریه!

۷-۲. تعریف تابع

برای تعریف تابع در پایتون از کلمه کلیدی def استفاده می‌شود. برای مثال برای ایجاد یک تابع برای سلام گفتن به یک ورودی ما به صورت زیر عمل می‌کنیم:

def greeting(name):
    return('Hello, '+ name)

print(greeting('Arastoo'))

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

۷-۳. ایجاد یک حلقه

در پایتون برای ایجاد یک حلقه هم از دستور while و هم از دستور for…in استفاده می‌کنیم. ساختار دستور while با یک شرط شروع می‌شود. برای مثال:

a = 10
while(a>=1):
    print(a)
    a -=1

توی دستور بالا ما گفتیم تا زمانی که متغیر a برابر و بزرگ‌تر از ۱ باشه a رو چاپ بکنه و یکی ازش کم بشه. یه برنامه که از ۱۰ تا ۱ رو چاپ میکنه.

ساختار دستور for…in برای تعریف حلقه نیز به صورت زیر است:

for i in range(10):
    print(i)

هدفمون از استفاده for…in این هستش که یک مقدار داده‌ای تکرارپذیر رو پیمایش بکنیم. range(10) در واقع یک تابع داخلی از پایتون هستش که مقدار عددی ۰ تا ۹ رو برای ما تولید میکنه.

۷-۴. دستورات کنترلی

برای ایجاد دستورات کنترلی در پایتون می‌توانید از دستور if و حالت‌های elif و else استفاده بکنید. برای مثال:

a = 1
if a==True:
    print('True')
elif a==False:
    print('False')
else:
    print('None')

همانطور که مشاهده می‌کنید، در این ساختار نیز ما از کناره گذاری برای بلوک بندی کدها استفاده می‌کنیم.

۷-۵. ساختارهای داده‌ای

لیست: لیست مجموعه‌ای مرتب از داده‌هاست که در پایتون به شکل زیر تعریف می‌شود:

a = [1,2,3,4,5,True,'Arastoo']

تاپل: تاپل شبیه به لیست است با این تفاوت که قابلیت تکرارپذیری ندارد:

b = ('Arastoo',1,2,3,4,5,True)

دیکشنری: دیکشنری یک ساختار داده‌ای است که در آن هر موجودی از یک کلید و یک مقدار داده‌ای تشکیل می‌شود:

c = {"name":"Arastoo","Age":100,"Alive":True}

دیکشنری‌ها قابل مرتب شدن نیستند.

۸. در پایان

یادگیری پایتون و پیش بردن پروژه‌ها با استفاده از پایتون واقعا لذت بخش است. پایتون پیچیدگی کمتری نسبت به اغلب زبان‌ها دارد و همین موضوع باعث می‌شود که کدنویسی در آن سریع‌تر و آسان‌تر شود. مطمئنا انتخاب پایتون به عنوان یک زبان برنامه‌نویسی برای کار، تحقیقات و… می‌تواند انتخابی منطقی باشد. من در این مقاله سعی کردم تا به شما مسیری روشن برای یادگیری پایتون و پیشرفت کردن در آن را نشان دهم.

سیستم احراز‌ هویت کاربران در جنگو

با پیشرفت کردن دنیای وبسایت‌ها و مدرن‌تر شدن آن‌ها، تعاملات کاربری بیشتری شکل گرفته است. حال این تعاملات می‌تواند از قرار دادن یک کامنت ساده در وبسایت شروع شود و به مواردی مانند قرار دادن محتوای جدید، پرداخت آنلاین و… ادامه یابد. حال اگر وبسایت شما به هر شکلی مانند یک شبکه آنلاین خرید یا فروشگاه اینترنتی باشد، سیستم‌های تعاملات کاربران که نیازمند احرازهویت و اعتبارسنجی هستند بسیار پیچیده‌تر خواهد شد.

مدیریت کاربران حتی در یک سطح عادی – فراموشی رمز عبور، فراموشی نام کاربری، بروزرسانی اطلاعات کاربری و…- نیز دشوار است، حال نوشتن چنین سیستمی از ابتدا می‌تواند واقعا دردسرساز و سخت باشد.

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

درست مانند تمام گزینه‌های دیگری که جنگو به ما می‌دهد، این پیاده‌سازی از سیستم احراز هویت و… نیز توسعه پذیر همراه با قابلیت شخصی‌سازی بالاست.

بررسی کلی

سیستم احراز هویت جنگو هم موضوع احراز هویت و هم موضوع اعتبارسنجی را بررسی می‌کند. اگر به صورت کوتاه بگوییم، احراز هویت سیستمی است که بودن یا نبودن یک کاربر را از نظر وجود در سیستم تایید می‌کند و اعتبارسنجی سطح دسترسی کاربر را بررسی می‌نماید. در این مطلب احراز هویت به هر دو حالت اطلاق می‌شود.

سیستم احراز هویت به صورت کلی شامل موارد زیر است:

  • کاربران
  • دسترسی‌ها: از طریق باینری (True/False) مدیریت می‌شود.
  • گروه‌ها: راهی بسیار مناسب برای دادن دسترسی به حجمی بالا از کاربران.
  • سیستم هشینگ پسورد
  • فرم‌هایی برای مدیریت اعتبارسنجی و احرازهویت کاربران
  • ابزارهای View در مدل MVT برای مدیریت ورود کاربران
  • سیستم قابل توسعه در بک‌-اند

در نسخه‌های ابتدای جنگو قابلیت‌های امنیتی زیادی برای سیستم احرازهویت وجود نداشت، حال اما در نسخه ۲ این موارد تا حدی حل شده اما هنوز برخی از آن‌ها به صورت پیشفرض می‌توانند مشکل آفرین باشند. اما به لطف داشتن جامعه توسعه کاربری بسیار بزرگ جنگو، ابزارهای بسیار زیادی وجود دارد که این مسئله را به خوبی حل می‌کند. برای مثال Oauth که پروتکلی امنیتی برای احراز هویت است از طریق ابزارهای مخصوص جنگو می‌تواند پیاده‌سازی شود.

استفاده از سیستم احراز هویت جنگو

User Objects

در هسته سیستم احرازهویت جنگو User Objects وجود دارد. شما از طریق این شئ می‌توانید محدودیت‌های مختلفی را در پروژه‌تان اعمال کنید. ثبت کاربران، ملحق کردن آن‌ها به نوشته‌ای خاص و… نیز به صورت کامل از طرف این شئ مدیریت می‌شود. اما با وجود آنکه گروه‌های کاری مختلفی وجود دارد، در خصوصیات پایه‌ای آن‌ها تفاوتی نیست. برای مثال ما کاربرانی مانند superuser و staff  را داریم که عملا به صورت پایه‌ای برابر هستند. اما محدود کردن دسترسی از طریق یک سری باینری فلگ انجام می‌پذیرد که در این ارتباط صحبت کردیم.

به صورت کلی هر کاربری که در User Objects تعریف می‌شود دارای خصوصیات زیر است:

  • username
  • password
  • email
  • first_name
  • last_name

ایجاد یک Superuser

ایجاد superuser در جنگو با استفاده از دستور createsuperuser انجام می‌شود:

python manage.py createsuperuser --username=joe --email=joe@example.com

البته اطلاعات اضافی مورد نیاز برای ورود بعد از وارد کردن دستور بالا به صورت prompt از شما پرسیده می‌شود.

ایجاد کاربر جدید

راحت‌ترین و کم خطاترین راهکار برای اضافه کردن کاربر جدید به وبسایت استفاده کردن از ادمین جنگو است. جنگو همچنین Viewها و Formهایی را ایجاد کرده که به سادگی شما را قادر می‌سازند تا قابلیت‌هایی مانند ورود، فراموشی رمز عبور، ثبت‌نام کاربران و… را در اپلیکیشن‌تان پیاده‌سازی می‌کنید.

در این قسمت برای ایجاد کاربری جدید قصد داریم از Shell مربوط به جنگو استفاده کنیم. در این محیط ما قابلیت استفاده از دستورات پایتون را داریم، از این رو به سادگی می‌توانیم با مدل شئ‌گرای ORM جنگو نیز کار بکنیم:

>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', 'lennon@thebeatles.com',  'johnpassword')

حال همانطور که می‌توانید مشاهد بکنید، ما کاربری جدید با نام کاربری john، ایمیل lennon@thebeatles.com و رمز عبور johnpassword ایجاد کرده‌ایم. حال اگر بخواهیم ویژگی‌های دیگر آن را تغییر دهیم می‌توانیم به سادگی از حالت زیر استفاده نماییم:

>>> user.last_name = 'Lennon'
>>> user.save() 

برای تغییر دادن رمز عبور کاربران ما دو راهکار بسیار ساده را داریم که می‌شود از آن‌ها استفاده کرد. یکی از طریق فایل manage.py و دیگری از طریق Shell.

۱- با وارد کردن دستور python manage.py changepassword username می‌توانیم رمز عبور کاربر username را به سادگی تغییر دهیم.

۲- برای استفاده کردن از Shell برای تغییر پسورد، شما ابتدا باید کاربر مورد نظرتان را با متد get دریافت کنید:

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')

بعد از آن می‌توانید با استفاده از متد set_password() پسورد جدیدی را برای کاربر تعیین نمایید:

  >>> u.set_password('new password')
  >>> u.save()

اگر در بخش middleware در قسمت settings جنگو SessionAuthenticationMiddleware را فعال کرده باشید، این تغییر پسورد به صورت یک لاگ ظاهر می‌شود.

مجوز‌ها و اعتبار سنجی

در پنل ادمین جنگو، ما قابلیت ایجاد مجوزهای دسترسی برای کاربران را داریم. هر کدام از این مجوزها نیز نامی دارند که می‌شود تنها با assign کردن آن‌ها به یک کاربر و یا یک گروه کاربری آن‌ها را محدود کرد. سه مورد موجود از این مجوزها را می‌توان در زیر مشاهده کرد:

  • استفاده کردن از view «add» برای افزودن از طریق فرم‌های موجود تنها برای کاربرانی مقدور است که مجوز add را دارند.
  • استفاده کردن از view «change» برای تغییر از طریق فرم‌ها تنها برای کاربرانی مقدور است که مجوز change را دارند.
  • استفاده کردن از view «delete» برای تغییر از طریق فرم‌ها تنها برای کاربرانی مقدور است که مجوز delete را دارند.

شما جدای از پنل جنگو، می‌توانید این مجوزها را از طریق متدهای زیر نیز به User Object اعمال کنید:

has_add_permission()

has_change_permission()

has_delete_permission()

مجوزهای پیشفرض

در قسمت تنظیمات پروژه برای لیست INSTALLED_APPS می‌توانید django.contrib.auth را مشاهده کنید. این اپلیکیشن به صورت پیشفرض در تمام پروژه‌های جنگو وجود دارد. شما هر بار که عملیات migrate را روی مدل‌های دیتابیس خود اعمال کنید، این اپلیکیشن مجوز‌های پیشفرض add،  changeو delete را برای تمام مدل‌ها ایجاد می‌کند.

گروه‌ها

مدل‌ django.contrib.auth.models.Group یک راه منطقی و بسیار ساده برای دسته‌بندی کردن کاربران و قرار دادن آن‌ها در دسته‌بندی مشخصی است. شما می‌توانید از این طریق مجوز‌های کاربری را به صورت گروهی اعمال نمایید. شما می‌توانید یک کاربر را در هر چند گروه که بخواهید قرار دهید. مجوزهای دسترسی در این حالت override شده و چند مجوز به یک کاربر در این شرایط اعمال می‌شود.

ایجاد مجوز به صورت دستی

در حالیکه می‌شود از طریق class Meta در مدل‌های ساخته شده، مجوزهای دسترسی را به صورت دستی ایجاد کنید، اما یک روش مستقیم برای اینکار استفاده از خط فرمان است. برای مثال توسط بکنید که ما می‌خواهیم یک دسترسی can_publish را برای مدل BookReview در مدل books ایجاد کنیم. برای اینکار به صورت زیر عمل می‌کنیم:

from books.models import BookReview
from django.contrib.auth.models import Group, Permission
from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get_for_model(BookReview)
permission = Permission.objects.create(codename='can_publish',
                                       name='Can Publish Reviews',
                                       content_type=content_type)

بعد از آن می‌شود از طریق خاصیت user_permissions مجوز مربوطه را به یک گروه و یا یک کاربر اعمال کرد.

بررسی وجود یک مجوز

اگر بخواهید به صورت سریع بعد از ارائه یک مجوز و یا ایجاد یک کاربر مجوزهای موجود برای آن کاربر را بررسی کنید، یکی از راحت‌ترین راه‌حل‌ها برای انجام چنین کاری استفاده کردن از رویکرد زیر است:

from django.contrib.auth.models import Permission, User
from django.shortcuts import get_object_or_404

def user_gains_perms(request, user_id):
    user = get_object_or_404(User, pk=user_id)
    # any permission check will cache the current set of permissions
    user.has_perm('books.change_bar')

    permission = Permission.objects.get(codename='change_bar')
    user.user_permissions.add(permission)

    # Checking the cached permission set
    user.has_perm('books.change_bar')  # False

    # Request new instance of User
    user = get_object_or_404(User, pk=user_id)

    # Permission cache is repopulated from the database
    user.has_perm('books.change_bar')  # True

در پایان

در این مطلب سعی کردم تا شما را با سیستم احراز هویت و اعتبار سنجی در جنگو آشنا کنم. البته در اینجا ما به صورت کلی با این موضوع آشنا شدیم، زمانی که خودتان وارد عمل شوید و بخواهید از این قابلیت‌ها در یک اپلیکیشن واقعی استفاده بکنید، چالش‌های شیرین بسیاری را باید پشت سر بگذارید. این مطلب از کتاب Build your first website with Django 2.1 نوشته Nigel George گرفته شده است.

منبع

درک ساده دکوراتورها در پایتون

درک ساده دکوراتورها در پایتون

دکوراتورها مفهوم خیلی ساده و در عین حال کاربردی هستند که مثلا اگه با فلسک کار بکنید حتما نیاز خواهید داشت که ازش استفاده بکنید. البته با وجود اینکه دکوراتورها خیلی ساده هستند اما بعضیا واقعا درک‌ش نمی‌کنند! 

خب ایده اینه که بتونیم از طریق یک تابع، کارکرد یک تابع دیگه رو تغییر بدیم و یا بهتر بگیم که یه تابع رو گسترش بدیم. 

تصور کنید تابع ۱ رو دارید و تابع ۲ … حالا می‌خواید از طریق تابع ۱، کاری بکنید که تابع ۲ کارهای بیشتری رو انجام بده. 

بیایید یه مثال ساده رو در نظر بگیریم:

تصور کنید من یه تابع دارم به اسم style که هر متنی که واردش بشه رو به صورتی زیبا برمی‌گردونه!

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

پس نیاز است که تابع style به عنوان ورودی یک تابع دیگر رو بگیره:

def style(func1):
print('--------------------')
func1()
print('--------------------')

حالا تابع دوممون رو که فقط قراره یه متن ساده رو چاپ بکنه تعریف می‌کنیم:

def print_some_text():
print("Hello World")

حالا نیاز هست که تابع دوم رو به عنوان آرگومان برای تابع اولمون تعیین کنیم:

style(print_some_text)

قضیه علامت @ چیه؟

این شد یه چیزی! پایتون یه میانبر ساده برامون ایجاد کرده که از طریق اون می‌تونیم بدون فراخوانی قسمت آخر، دکوراتور رو اعمال بکنیم. برای اینکار کافیه قبل از تعریف تابع دومی @ را همراه با نام تابع اولی بنویسید:

@style

def print_some_text():
print("Hello World")


print_some_text()

 

حالا یه مشکل پیش میاد. تابع اصلی که نوشتیم یا همون style یه بخش مهمی نداره! قسمت return … اینطوری یه تایپ ارور می‌گیریم چرا که تابع مقدار NoneType رو برمی‌گردونه! برای این کار می‌تونیم یه تابع دیگه داشته باشیم که اون تابع کارهای استایل دهی رو انجام می‌ده و در نهایت تابع style همون تابع رو برمی‌گردونه. برای این کار به تعریف تابع style برمی گردیم و مثل زیر ویرایشش می‌کنیم:
def style(func1):
def final():
print('------------')
func1()
print('------------')

return final

حالا کد رو اجرا کنید متوجه می‌شید که همه چیز بدون مشکل اجرا میشه!

برای مطالعه بیشتر همراه با مثال‌های دیگه می‌تونید این لینک رو بخونید.