این برای django rest framework هست دونستنش واجبه برای هر کسی که جنگو کار میخواد بشه api کلا میاد بین سرور و دیتا بیس و بین دیتا بیس و سیستم ها میاد rest یک نوع معماری هست که هرچیزی که با معماری اون ساخته شده باشهrestfull هست ویژگی هایی که REST API باید داشه باشه به این صورته 1.باید کلاینت سرور باشه 2.اطلاعات به صورت کشیبل باشن 3.معماری ما باید STATELESS stateless یعنی اینکه مثلا اگه یوزر 10 تا ریکویست بده وقتی این ریکویست ها از هم دیگه خبر نداشته باشن بهشون میگن stateless اگه از هم خبر داشته باشن میشه stateful
قبل از اون بای و ببینیم json چی هست java script object notation json یک نوع داده ای هست برای انتفال داده ها و ذخیزه داده ها و به جای xml اوممده
متد هایی که در json برا یایتون هست
میاد یک فایل پایتونی رو به فایل جیسونی تبدیل میکنه
استرینگ رو تبدیل میکنه به استرینگ
میاد و یک فایل جیسونی رو تبدیل میکنه به یک فایل پایتونی که قابل خوندن باشه
این هم برای استرین هست
json.dump(data,file,indent=2)
توی این قسمت میاد یاد میده چجوری فاکنشنال میتونیم از رست ای پی ای استفاده کنیم برای اینکار میتونیم از دکوریتور ها استفاده کنیم که خوده رست فریم ورک اونها رو اضافه کرده که توی سایت خودش هم هست اگه بری نگاه کنی
from restapiframework.decerators import something
@something()اگه داخل دکریتور چیزی ننویسیم از متد پست استفاده میکنه ولی اگه میخوایم هم میتونیم چیزی بنویسی برای استفاده از ای پی ای برای جواب دادن از متد response استفاده میکنیم که تنها پارامتره اجباریش دیتا هست که باید به صورت دیکشنری باشه که اون رو به جی سون بتونه تبدیل کنه سریالایز کردن یعنی تبدیل کردن اطلاعات در فرمت پایتون به فرمت جی سون برای اینکه مرورگر اونها رو بخونه برای استفاده کردن اون از class base ها کد تقریبا به این صورت هست
from restframework.views import apiviews
class Home(apiviews):
def get(self,request):
return response({"name":"ali"})
گفت که browseble api رو کنسل کنیم چون خطرناکه برای اینکه بخوایم از api تست بگیریم میتونیم از پست من استفاده کنیم در رست فریم ورک در یو ار ال ها میگن endpoint
و اینسومنیا #session 3 ما مثل جنگو که داخل متد ها از پارامتر request استفاده میکردیم باید برای رست ای پی ای هم از این استفاده کنیم حالا ما میتونیم از این ریکوست چند چیز برداریم مثل .data که داده های کاربر توی بدنه به ما ارسال میکنم .query_params همون یو ار ال ها هستن .user مثلا در جنگو مینوشتیم request.user و اینطوری به اطلاعات کاربر دسترسی داشتیم توی این قسمت درمورد دیتا ها قراره ویدیو ببینیم خب توی متد گت و متد پست ما میتونیم اطلاعات رو ارسال کنیم ولی شیوه هاشون فرق داره توی متد گت ما میتونیم دو جور اطلاعات رو ارسال کنیم یکی از طریق آرگومان یعنی که کاربر بگیم نام کاربریشو توی یو ار ال بزنه اول از همه باید بری توی فایل یو ار ال ها و بگی قراره که یک متغیر وارد بشه از طریق یو ار ال به نام name که بعدش بتونیم از اون استفاده کنیم طریقه استفاده ازش به این صورت هست
127.0.0.1:8000/aliurls.py
urlspatterns = [
path('<string:username>/',views.method,name=''>
]بعد از اون توی فایل views باید ریکویست رو اضافه کنیم یه چیزیم بگم که اون داره کلاس بیس کاراشو پیش میبره
Class home(api_view):
def get(self,request,username)
return Response({"name":username})این بعدش در name مینویسه علی یا از طریق کویری پارامتر ها این روش در سرچ ها استفاده میشه این ها با علامت سوال شروع میشن و حالت کی ولیو دارن
12.0.0.1:8000/?name=ali
بعد از اون برای اینکه اطلاعات رو ببینه دیگه نیازی نیست توی یو ار ال ها چیزی بنویسیم و خالی باشه اوکی هست و بعد فقط برای اینکه از این روش استفاده کنیمم باید توی ویوز باید اینکار رو انجام بدیم
Class home(api_view):
def get(self,request):
name = request.queryparams['name']
return Response({"name":name}ما وقتی از متد پست استفاده میکنیم که بخوایم فایلی رو اپلود کنیم یا یا یانکه میخوایم یوزرنیم و پسورد رو بزاریم برای فرستادن به سرور توی این روش اطلاعات از طریق جی سون ارسال میشن به سرور برای استفاده اون در رست فریمورک میتونیم این کار ها رو انجام بدیم
Class home(api_view):
def post(self,request):
name = request.data['name']و اینکه در متد گت یو ار ال ما نمیتونه بیشتر از 2048 باشه
برای اینکه از متد پست استفاده کنیم در میتونیم از .data استفاده کنیم کدش به این صورت هست
Class home(api_view):
def post(self,request):
name = request.data['name']
return response({"name":name})این بادی رو درست کردی اون وقت درست میشه
ما تا الان میومدیم و اطلاعات رو خودمون به طور دستی وارد میکردیم ولی در دنیای واقعی ما باید اطلاعات رو از مدل ها بگیریم ما باید روشی داشته باشیم که کویری ست هایی که میگیرم خودشون تبدیل بشن ه دیکشنری و تبدیلش میکنیم به دیکنشری که صورت جیسون به کاربر نشون داده بشه برای اینکار باید از serializer ها استفاده بکنیم serialize میگه که تبدیل نوع کویری ست و یا دیتا مدل ها به داده هایی هست که پایتون داره deserialize یعنی تبدیل نوع داده پایتون به داده هایی مثل جیسون یا ایکس ام ال
سریالایز مثل فرم ها هستن باید مثل مدل ها خودمون فییلد ها رو درست کنیم و.... Serializer مثل Form ModelSerializer مثل ModelForm خب الان میریم داخل مدل ها و یک مدل درست میکنیم با اسم سن و ایمیل
form django.db import models
Class persion(models.Model):
name = blah blah
age = blah blah
email= blah blah
def __str__(self):
return self.nameبعد برای اینکه اطلاعات در داخل دیتا بیس ذخیزه بشه مینویسیم makemigrations migrate خب حالا توی ادمین پنل هم داریم اونو خب فرض کن ما میخوایم که یه اند پوینت داشته باشیم که وقتی اونو زدیم کاربر های ما رو نشون بده داخل سریالازر یه چیزی هست که مشخص میکنه داخل مدل چه خبر هست برای سریالایز کردن باید یک فایل دیگه درست کینم به نام serrialize پیشنهاد میشه برای اسم گزای کلاس های سریالایزر ها اول اسم مدل رو بنویسید و بعد بنویسید سریالایزر حالا فیلدی که داخل مدل داریم باید داخل سریالایزر ها بزاریم که توی سایتش هست
from rest_framework import serializers
class PersonSerializer(serializers.Serializer):
name = serializers.CharField()
age = serializers.IntegerField()
email= serializers.EmailField()این کد برای سریالایزر هست بعد از اون باید بریم توی ویو هامون تا از داده های مدلمون رو بتونیم بفرستیم
views.py
form .models import person
from .serializer import Personserializer
@api_view(['GET'])
def say_hello(request):
persons = person.objects.all()#for gett all informations from model
serlizer_data = PersonSerializer(instance=persons,many = True)# this line is for serialize information in models and instance is fot that and this thing just accept one information because of that we should set many=true because we use many informain
return Response(data=serlizer_data.data)#its must be a .data because its should return data onlyخب بیا اول توضیح بدم معنی این کد ها رو اولین خط که میاد اطلاعات رو از مدل ها میگیره خط دوم هم برای سریالایزر کردن اطلاعات توی مدل هست و اگه اطلاعات ما از یکی بیشتر بود باید منی رو ترو میزاشتیم خط سوم هم باید .data بزاریم که فقط دیتا رو نشون بده براری زدن ای دی میتونیم از این رو در سریالایز کردن اضافه کنیم
id = serializer.integerfield()متیونیم فیلتر بزاریم و با استفاده از گت از اون استفاده کنیم
form .models import person
from .serializer import Personserializer
@api_view(['GET'])
def say_hello(request):
persons = person.objects.get(name="amir")
serlizer_data = PersonSerializer(instance=persons)
return Response(data=serlizer_data.data)#its must be a .data because its should return data onlyولی باید منی رو برداریم چون فقط داریم یک اطلاعات رو نشون میدیم
توی این قسمت میخوایم یوزر رو ثبت نام کنیم برای اینکار یک اپ اکانت میسازیم بعد یک فایل سریالایزر براش درست میکنیم برای یوزر یوزرنیم داریم پسورد و ایمیل بعد از اون هر فیلد در سریالایزر یک ارگومانی میگیرن ولی برای استفاده و بعضی از ارگومان ها هستن که برای همه فیلد ها استفاده میشه مثل readonly و.... به اینا میگن core argument البته الان کاری به اینا نداریم و الان باید از required رو ترو بزاریم تا کاربر اونها رو وارد کنه بعد میریم توی ویوزو این کد رو مینویسیم
@api_views(['POST'])
def UserRegister(request):
serializer_data = UserRegiserserializer(data=request.POST)اگه توجه کرده باشی ما در سریلایزر گفتیم instance ولی اینجا میگیم دیتا چون باید از کاربر اینا رو بگیریم که بعدا بتونیم روی اطلاعات کاربر بزنیم is_valid() خب اگه یادت باشه وقتی ما توی جنگو بودیم میزدیم که آیا اطلاعات کاربر درست هست یا نه باید از cleaned_data استفاده میکردیم ولی الان باید ی روش دیگه بریم اینا رو ی بار نوشتم دستم خورد کامیت نشده رفت بیرون
class userregister(api_view):
def post(self,request):
serializer_data = UserRegisterSerializer(data=request.POST)
if serializer_data.is_valid():
User.objects.create_user(
username = serializer.data['username']
password = serializer.data['password']
email = serializer.data['email']
return Response(serializer_data.data)
)
return Response(serializer_data.errors)توی این قسمت میخوایم درمورد ولیدیشن صبحت کنیم که قراره درمورد دو نووع از اونها صبحت کنیم دوتا قسمت داره Field-level validation Object-level validation در فیلد لول ما میایم وقتی میخوایم یک فیلد خاص رو ولیدیت کنیم استفاده میکنیم مثلا میایم میگیم که کاربر عادی باشه و ادمین نباشه یا اینکه یک فیلد دیگه از پسورد درست میکنیم برای اینکار یک سری کار ها باید انجام بدیم اول باید یک تابع درست کنیم در فایل serializers.py بعدش اسمش اولش باید validata_title باشه که دو ارگومان میگیره
def validate_title(self,value):
if value == 'amdin':
raise serializers.validationError("you cant be a admin")
return vlaue
این میگه که اگه اسم رو گذاشت ادمین بهش بگه که تو نمیتونی اسم ادمین رو انتخاب کنی یک کار دیگه ای که میشه باهاش کرد اینکه بهش پسورد کانفیگ اضافه کنیم به این کار میگن ابجکت لول چون داریم چند چیز رو باهم مقایسه میکنم فکر کنیم
def validate(self,data):
if data['password'] != data['password2']:
raise serializers.validationError("passwords are not match")
return dataیه روش دیگه هم وجود داره که وقتی مثلا یک فیلد باید چند تا ولیدیشن میخواد خوبه اسمش هم validators هست
def no_spam(value):
if 'allah' != in value:
raise serializers.validationError('fields can not have a word 'allah' in it')این تابع رو قبل از کلاس اضلی بزار بعدش داخل فیلد ها بنویس
username = serilizers.Charfleid(validators=[no_spam])تاجایی که من فهیدم این همون کار قبلی رو انجام میده فقط تمیز تر مدل سریالایزر مثل همون مدل فرم ها بود البته من یادم نمیاد چی بود مدل فرما فقط میدونم کاره راحت تری نسبت به مدل ها باید انجام میدادیم
>>> from django.forms import ModelForm
>>> from myapp.models import Article
# Create the form class.
>>> class ArticleForm(ModelForm):
... class Meta:
... model = Article
... fields = ["pub_date", "headline", "content", "reporter"]
...
# Creating a form to add an article.
>>> form = ArticleForm()
# Creating a form to change an existing article.
>>> article = Article.objects.get(pk=1)
>>> form = ArticleForm(instance=article)یه همچین چیزی بوده کاربرد های مدل سریالایزر ها از سریالایزر ها بیشتر هست خب برای اینکه از مدل سریالایزر ها استفاده کنیم باید به این صورت عمل کنیم
from django.contrib.auth.models import User
class UserRegisterSerializer(api_veiw):
class META:
model = User
fields = ['username','password','email']
# or
fields = "__all__"
# its means every thing except this things
excludes = ['usernema'] # everything but usernameخب این میاد و مثل قبل کار میکنه برای اینکه بریم و رایت انلی کنیم یک فیلد رو میتونیم از دیکشنری extra_kwargs استفاده میکنیم پس داریم
from django.contrib.auth.models import User
Class UserRegisterSerializer(api_view):
class Meta:
model = User
fields = ['username','password','email']
extra_kwargs = {'password':{"read_only":true}}حالا ما تو روش قبلی ولیدیتور ها رو میزاشتیم جای پارامترا ولی حالا میزاریم این کار رو انجام میدیم
from django.contrib.auth.models import User
def anti_sapm(value):
if 'admin'==value:
serializers.validationError('fields can not have a word 'admin' in it')
return value
Class UserRegisterSerializer(api_view):
class Meta:
model = User
fields= ['username','password','emial']
extra_kwargs = {'username':{'read_only':true},
{"email":{"validators":anti_spam}
}خب حالا فرض کن که میخوایم فیلدی رو اضافه کنیم که داخل ماژول ما نبوده برای اینکار کافیه که قبل از کلاس متا اون رو اضافه کنیم به این صورت
Class UserRegisterSerializer(api_view):
password2 = Serializer.Charfield(required=true,write_only=true)
class Meta:
model = User
fields = ['username','password','email','password']زمانی که ما یک مدل سریالایزر درست کردیم میتونیم از اون برای ساختن و یا اپدیت کردن یک آبجکت زوی اون مدل استفاده کنیم توی فایل سریالایزر مینویسیم
from rest_framework import serializers
from django.contrib.auth.models import User
def anti_spam(value):
if 'allah' in value:
raise serializers.ValidationError('fields dont have a allowed to use word `allah` in it')
class RegisterUserSerializer(serializers.ModelSerializer):
password2 = serializers.CharField(write_only=True,required=True)
class Meta:
model = User
fields = ['username','password','password2','email']
def create(self, validated_data):
del validated_data['password2']
return User.objects.create_user(**validated_data)
و در فایل ویوز باید بنویسیم
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import UserRgister
from .serializers import RegisterUserSerializer
from django.contrib.auth.models import User
class RegisterUser(APIView):
def post(self,request):
serializer_data = RegisterUserSerializer(data=request.POST)
if serializer_data.is_valid():
serializer_data.create(serializer_data.validated_data)
return Response(serializer_data.data)
return Response(serializer_data.errors)
کد هایی که میان میگن ریکویست چه اتفاقی براش افتاد و در چه وضعیتی تموم شد منظورمون کد های وضعیت http هست که 5 عدد دارن مثل کد های 1XX informational هستن 2XX successful 3XX redirection یعنی اون منبعی که در سرور دنبالش بودیم در سرور جابه جا شده 4XX client error 5XX server error is_informational() # 1xx is_success() # 2xx is_redirect() # 3xx is_client_error() # 4xx is_server_error() # 5xx
خوانایی کد رو هم میبره بالاتر از این به بعد هر ریسپانسی که برمیگردونیم باید status code رو هم بهش بدیم کد ها رو درست بزار link
برای شناسایی کاربر هست برای اینکه مثلا دسترسی های کاربر رو قطع کنیم از پرمیشن ها استفاده میکنیم برای اینکار باید بری و توی داکیومنتا بخونیشون میتونی روی همه ویو ها اثتنتیکیت بزاری یا اینکه روی بعضی از ویو ها بزاری توی این دوره رفت داخل ستینگز و اینستالد اپز و برنامه رو اضافه کرد و روش های مختلفی وجود داره برای کاربر که توکن رو بهشون بدیم میتونیم دستی این کار رو انجام بدیم میتونیم با سیگنال ها اینکار رو انجام بدیم که وقتی کاربر جدید ساخته شد توکن هم براش ساخته بشه یا میتونی برای همه کاربر ها این کار رو انجام بدی ی روش دیگشم اینکه از یک ویو استفاده کنیم که با زدن یک یو ار ال یوزرنیم و پسورد رو برای کاربر ارسال میکنیم و بعد اون میاد و برای کاربر یک توکن میسازه و یا میتونی کاستومایزش کنی با منیج . پای هم میشه اینکار رو انجام داد وقتی که توکن رو مشخص کردیم میتونیم نوع اثتنتیکیشن رو مشخص کنیم
یادت نره ختما توی تنظیمات این رو بنویسی
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
# 'rest_framework.authentication.SessionAuthentication',
# 'rest_framework.authentication.authtoken'
'rest_framework.authentication.TokenAuthentication',
]
}با پرمیشن ها میتونیم محدودیت بزاریم روی ویو هامون با request.user و request.auth میتونیم مشخص کنیم که کاربر به یک ویو دسترسی داشته باشه یا نه اگه یک نفر اجازه نداشته باشه یا exceptions.PermissionDenied or exceptions.NotAuthenticated چون لازم نیست روی همه ویو ها اتفاقات خاصی بیوفته به جای اثتنیکیشن ما باید روی بعضی از ویوهامون از پرمیشن هامون استفاده کنیم اینا رو دیگه خودت برو ببین خسته شدم
توی این جلسه ای پی ای رو بسازه که کاربر ها بتونن سوال بپرسن و ی سری دیگه از کاربر ها بیان و بهش جواب بدن اول میاد و یک مدل برای سوال ها و یک مدل برای جواب ها میسازه که من در ادامه اونها رو اضاقه خواهم کرد خب اول از همه اومد و یک مدل برای سوال ها ایجاد کرد
class Question(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='questions')
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=200)
body = models.TextField()
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'{self.user} - {self.title[:20]}'
def __str__(self):
return f'{self.user} - {self.question.title[:20]}'خب توی این کد میاد فیلد ها رو مشخص میکنه در خط یوزر اونحا که زده ان دلت منظورش اینکه اگه این پاک شده بقیه جاها هم پاک بشه فکر کنم تا جایی که یادمه بعدیش هم یوزر هست که ایدی یوزری که اونو فرستاده داخلش هست در خط سوال نمیدونم الان چرا سوالو دوباره تو خودش اورده و اینها رو به عنوان فارن کی اضافه کرده در کریتد هم تاریخ همون لحظه رو خودش به صورت خودکار مینویسه و بعدشم که تابع اس تی ار هست که در ادمین پنل این ها رو نمایش میده که اسم یوزر و 20 تا کاراکتر اول سوالش رو نشون میده برای ادمین اشتباه کردم کست کیت هم میگه اگه یوزر اون ور پاک کرد تو بقیه جاها تو هم پاکش کن
class Answer(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='answers')
question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers')
body = models.TextField()
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f'{self.user} - {self.question.title[:20]}'اینجا در خط سوال نوشته شده که به جواب لینک شده خب بعدش اون ها رو توی سریالایزر اضافه میکنیم و بعد در ویو ما یک کلاس اضافه میکنیم که متد های مختلفی رو میگیره مثل get post put delete که گت برای دیدن اطلاعات هست پست برای ارسال اطلاعات و پوت برای اپدیت کردن اطلاعات و دلت برای پاک کردن اطلاعات
class QuestionSerializer(serializers.ModelSerializer):
answers = serializers.SerializerMethodField()
user = UserEmailNameRelationalField(read_only=True)
class Meta:
model = Question
fields = '__all__'
class AnswerSerializer(serializers.ModelSerializer):
class Meta:
model = Answer
fields = '__all__'
عملیات کراد کرید رید اپدیت و دلت
برای ساختن که باید از متد پست استفاده کنیم مثل همون کاری که قبلا انجام دادیم
class questions(api_View):
def post(self,request):
serializer_data = Questionserializer(request.post)#or request.data
if serilizer_data.is_valid():
serializer_data.save()
return response(serilizer_data.data)
return response(serilizer_data.errors)دبلیلی که انقد راحت سیو رو زد این بود که ما از مدل فرم ها در دیتا بیسمون استفاده کرده بودیم برای همین اینطوری شد وگرنه باید خودمون به صورت دستی این کار رو انجام میدادیم بهتره که برای هر کار یک کلاس جداگونه درست کنیم برای اپدیت کردن ما نیاز به پرایمری کی داریم تا بدونیم کدوم ابجکت رو میخوایم اپدیت کنیم
def put(self,request,pk):
پوت برای آپدیت کردن به کار میره
توی ایت جلسه میخواد متد هایی رو که داریم در کلاس های جداگونه پخش بکنیم و اینکه زمانی که سوال ها رو نشون دادیم جواب ها رم بتونیم نشون بدیم برای اینکار میریم در قسمت داکیومنت قسمت فیلد های متفرقه link این اجازه میده که فیلدی رو به متد خاصی متصل کنیم برای اینکه بتونیم جواب های سوال ها رو با سوال ها با هم ببینیم باید از متد فیلد ها استفاده کنیم
class QuestionSerializer(serializers.ModelSerializer):
answers = serializers.SerializerMethodField()
class Meta:
model = Question
fields = '__all__'
def get_answers(self, obj):
result = obj.answers.all()
return AnswerSerializer(instance=result, many=True).dataدر خط answers ما میام و از سریالایزر متد فیلد ها استفاده میکنیم که بتونیم فیلد ها رو به متد خاصی تخصیص بدیم get_answers هم برای اینکه که ابجکت رو نشون بده برای همین یه قانون داره اونم اینکه از گت _ و اسم انسرز استفاده کنیم که حالا میتونه هر اسمی باشه بعدش هم ریزالت رو مساوی با ابجکت قرار میدیم که یعنی اون سوال برای ما به نمایش در بیاد و بعد انسرز رو مینویسیم و همشو فراخوانی میکنیم بعد از اون انسر سریالایزر رو صدا میزنیم و اینستنس رو میزاریم روی ریزالت و منی رو مساوی با ترو قرار میدیم و دیتای اون رو برمیگردونیم دلیل اینکه اون انسر توی ریزالت همون ریلیتد نیم هست توی مدل هامون و دلیل اینکه تونستیم جواب ها رو بگیرم اینکه ما فارن کیه جواب ها رو مساوی قرار داده بودیم با question
class Answer(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='answers')
question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='answers')بعضی وقت ها ما نیاز داریم به کاستوم پرمیشن ها تا کنترل بیشتری روی پرمشن ها داشته باشیم برای اینکار ما باید کلاسی بسازیم که از base permission ارث بری کنه .has_permission(self, request, view) این میگه که آیا کاربر میتونه به ویو دسترسی داشته باشه و قبل از اینکه کاربر وارد ویو بشه اون رو بررسی میکنه .has_object_permission(self, request, view, obj) این میگه که آیا کاربر میتونه به آبجکت دسترسی داشته باشه یا نه این بعد از اینکه کاربر وارد ویو شد بررسیش میکنه خب ما چند تا چالش داریم برای برناممون 1.هر کسی که میتونه سوالات رو ببینه 2. فقط کاربران اثتنتیکیت کرده میتونن سوالات رو ببینن 3.فقط کاربرانی که اثتنتیکیت کردن میتونن سوالات رو اپدیت و یا که حذف کنند و اینکه حتما باید سوالات خودشونو حذف باید بتونن بکنن
مشخص میکنه چه رابطه ای رو در نتیجه نشون بدیم خب تا الان هر وقت میخواستیم اطلاعات رو ببینیم ایدی طرف نمایش داده میشده برای ما یا مثلا میخوای به جای ایدی اصلا بیاد و ایمیل کاربر رو نشون بده خب برای این میتونی بری و داکیومنتو بخونی link هایپر لینک یعنی اینکه به جای ایدی یک لینک میاد که با زدن روش میتونی بری و فقط اون اطلاعات رو بخونی و ببینی ما میتونیم حتی custom relational fields استفاده کنیم مثلا فرض کن میخوای یوزر اول یوزرنیمش رو نشون بدی و بعد ایمیلشو برای این کار باید این کاررو بکنی
ویو ست ها به ما اچازه میدن چند تا عملیات رو داخل یک کلاس قرار بدیم خب همونطور که یادته توی کارهایی که قبلا انجام دادیم داشتیم که مثلا برای اپدیت کردن یک کلاس داشتیم برای دیدین سوال ها یک کلاس و برای حذف هم یک کلاس داشتیم و برای هرکدوم از اونها یک یو ار ال ساخته بودیم وقتی که پروژه بزرگتر بشه تعدا یو ار ال های اونم زیادتر میشه برای همین ما نیاز داریم به ویو ست ها توی ویو ست ها ما نمیتونیم از از متد ها پست و گت استفاده کنیم به جاش مثلا لیست داریم یا کریت که کار های انها رو انجام میده مثل لیست که نشون میده ابجکت ها رو کریت که میسازه ابجکت هارو retrieve برای خوندن یک ابجکت هست Update برای اپدیت کردن یک آبجکت partial_update برای اپدیت کردن بخش جزیی از یک ابجکت destroy این هم برای پاک کردن یک آبجکت استفاده میشه خب الان میریم توی اپ اکانت و میایم از ویو ست ها استفاده میکنیم ویو ست ها وقتی استفاده میشن که کاری که انجام میدیم ساده هستش اگه کاری که انجام میدیم خطوطش زیاد باشه از همون ای پی ای ویو باید استفاده بکنی یو ار ال های معولی نمیتونن با ویو ست ها کار بکنن چون ویو ست ها چندین متد مختلف داخل خودشون دارن برای کار کردن با ویوست ها ما میایم و از روترها استفاده میکنیم روتر ها میان به صورت اتوماتیک برای ما یو ار ال ایجاد میکنن مناسب ویوست ها هستند خب توی ویو ست ها بسته به اینکه با چه متدی صدا میزنیم یو ار الو کار های مختلفی انجام میده متد patch فکر کنم برای آپدیت کردن هست ما تو دنیای واقعی اطلاعات کاربر رو حذف نمیکنیم ما دیفالت روتر داریم که با سیمپل روتر فرق زیادی نداره داخل ویو ست ها ما نمیتونیم از کاستوم پرمشن ها استفاده کنیم و دیگه خودت باید بری و داخل سریالایزر ها خودت بریم بررسی بکنی یا میتونی بری داخل همون ویو و خودت اون رو بررسی کنی routers
شبیه پرمیشن هاست برای ایجاد کردن محدودیت استفاده میشه ولی نحوه کار فرق میکنه برای محدود کردن تعداد ریکوِیست هایی هست که میتونه از طرف کاربر ارسال بشه هست مثلا هر کاربری که اثتنتیکیت کرده میتونه در هر ساعت 100 ریکویست بده یا کاربرایی که نکردن 10 تا بتونن فقط از تراتلینگ برای امنیت استفاده نکن مثلا این برای کاربر های معمولی هست
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': [
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
],
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/day'
}
}اولی که برای نصب نوشتی برا کاربرهایی هست که انانیموس هستند و دومی برای یوزر هایی هست که اثتنتیکیت کردن بعدش که اینا رو مشخص کردی باید بری قسمت بعدی که مشخص کنی محدودیت ها رو اگه بزاری تو سیتینگ رو همش میشه scoptetrottling برای این هستش که وقتی خواستیم برای یک قسمت این کار رو انجام بدیم بتونیم link
ما تا الان کاربر ها رو بر اساس توکن اعتبار سنجی میکردیم این یک استاندارد نسبتا جدید هست که خیلی داره استفاده میشه json web token ما کاربر ها رو بر اساس توکن اعتبار سنجی میکنیم اما روش فرق میکنه اول اینکه توکن هایی که به کاربر میدیم دارای تاریخ انتقضا هستند بعد مدتی که گذشت دوباره باید توکن ها رو برای کاربر ها رفرش بکنیم بعدم اینکه ما دیگه توکن ها رو داخل دیتا بیس ذخیره نمیکنیم و داخل خوده مرورگر کاربر ذخیره میشه لوکال استورج خوده کاربر که سرعت ما بیشتر میشه توکن های jwt به سه بخش تقسیم میشه که هر کدوم یک کاری رو انجام میدن بخش اول بخش هدر هست که الگوریتم و نوع اون توکن رو مینویسه و بخش payload هست که اطلاعات واقعی رو داخلش ذخیره میکنیم بخش سوم signature ترکیب سه بخش رو مشخص میکنه که سه بخش چجوری باید باشن link برای نصب اون باید از این دستور استفاده کنیم
pip install djangorestframework-simplejwtTokenObtainPairView, TokenRefreshView,
TokenObtainPairView برای اثتنتیکیت هست TokenRefreshView برای اینکه توکن رو عوض کنه توی این لینک ما دو تا گزینه اول رو کار داریم باهاش link که اولی برای توکن هست و دومی برای رفرش توکن اکسس توکن برای دسترسی هست و رفرش توکن برای اینکه توکن جدید بده هستش
توی این ویدیو در مورد داکیومنت درست کردن در مورد ای پی ایمون میگیم
برای اینکه کاربر بدونه توی هر یو ار الی چه اطلاعاتی هست
مثلا برای بک نوشتی فرانت کارا میخوان ببینن
sshema ی داکیومنتی هست برای ماشین ها که میگه در هر یو ار الی چه چیزهایی هست
برای اینکه این اطلاعات رو طوری بنویسیم که آدم ها هم بتونن اون رو بخونن میتونیم از محیط های گرافیکی مقل swaggger استفاده کنیم
برای استفاده از اون اول باید این کامند رو بزنیم
pip install pyyaml uritemplateبعد در فایل یوار ال فولدر کانفیگ باید این رو اضافه کنیم
from rest_framework.schemas import get_schema_view
urlpatterns = [
# ...
# Use the `get_schema_view()` helper to add a `SchemaView` to project URLs.
# * `title` and `description` parameters are passed to `SchemaGenerator`.
# * Provide view name for use with `reverse()`.
path('openapi', get_schema_view(
title="Your Project",
description="API for all things …",
version="1.0.0"
), name='openapi-schema'),
# ...
]اینجا چون سخته برامون که بخونیم و اطلاعات رو به صورت یمل نوشته خوندن اطلاعات برای ما مشکل هست برای همین ما میایم و نحوه نمایشش رو عوض میکنیم برای اینکار ما باید از سواگر ها استفاده کنیم میتونی از drf-yasg استفاده کنی که قدیمی شده و دیگه کسی اون رو توسعه نمیده و یا میتونی از یکی دیگه استفاده کنی به اسم drf-spectacular link برای دیسکربپشن باید داخل خوده اون کلاس از این علامت استفاده کنی
"""
your descrepsiton
"""برای اینکه قسمت پارامتر هاشم درست بشه میتونی از این روش استفاده کنی
serializer_class=something_serializer()اینطوری میاد ی مثال هم میزنه که باید چی ها رو بفرستیم و این داستانا
رندرر ها و پارسر ها نحوه تبادل اطلاعات رو مشخص میکنن که از چه نوعی باشه اون اطلاعاتی که داخل ریکویست و ریسپانس جا به جا میشن الان وقتی اطلاعاتی رو ارسال میکنیم از جی سون استفاده میکنیم و اگه اطلاعاتی رو میگیریم هم از جی سون استفاده میکنیم ما با استفاده از پارسر ها میتونیم نحوه ارسال ریکویست رو مشخص کنیم مثلا به جای اینکه اطلاعات با جی سون بره اون رو با XML یا یمل ارسال کنم و در پاسخ که ای پی ای میخواد جوابی رو بده اون پاسخ به شکل دیگه ای باشه پس رندر ها برای جواب ها هستند و پارسرها برای ریکویست ها هستند به صورت دیفالت جی سون هست در برازر ها یک نوع دیگ هست به نام بروزبل ای پی ای توی دنیای واقعی ما فقط از جیسون رندر استفاده میکینم حتی ما در دنیای واقعی بروزبل رندر رو کنسل میکنیم مواردی مثل بروزبل رندر یا ادمین رندر برای وقتی هست که ما در حال دولپمنت هستیم و ای پی ای رو توسعه میدیم اگه بخوایم بریم توی حالت پروداکشن فقط از جیسون رندر استفاده میکنیم این دیگه هر کدوم رو خواستی میتونی توی تنطیملات اضافه کنی و باید داکیومنت رو خودت بخونی آی دهقان ما در اکثر موارد از جیسون رندر ها اسنفاده میکنیم در اکثر مواقع کار میکنن
کار راحتی هستش این برای صفحه بندی اطلاعات استفاده میشه که وقتی خواستیم بعضی از اطلاعات رو به کاربر نشون ندیم از اون استفاده میکنیم برای پجیگیشن کردن ما سه تا کلاس داریم مدل ویو ست ها پجینیشن رو داخل خودش دارن ولی ویو ها ی معمولی نه باید دستی اون کار رو انجام بدیم برای اینکه از پجینیشن های apiview استفاده کنیم میتونیم از پجینیشن های خوده جنگو استفاده کنیم و اینکه این دیگه روی ویوست کار میکنه
متا دیتا برای زمانی استفاده میشه که بخوایم با اطلاعات یکه با متد اپشینز ارسال میشه کنترل داشته باشیم متد اپشنز http برای زمانی هست که بخوایم ویژگی های یک یو ار ال رو دریافت کنیم متا دیتا ها ممکنه دارای اطلاعاتی باشه که ما نخوایم کاربر ببینه برای همین باید بگیم که فقز چه چیزهایی باید به نمایش در بیاد