در این سوال قصد داریم به کمک کتابخانه DjangoRestFramework یک RESTful API برای وبلاگ خود طراحی کنیم.
میخواهیم یک API برای وبلاگ خود طراحی کنیم به طوری که کاربران بتوانند از طریق این API، پستها و کامنتهای خود را مدیریت کنند و همچنین ادمین وبلاگ بتواند به تمام فعالیتها نظارت داشته باشد و در صورت لزوم دست به کار شده و خودی نشان دهد.
پروژه اولیه
پروژه اولیه را از این لینک دانلود کنید. ساختار این پروژه به شرح زیر است:
blog
├── app
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── urls.py
│ ├── > serializers.py <
│ ├── > permissions.py <
│ └── views.py
├── Blog
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
└── requirements.txt
جزئیات
در فایل models.py
دو مدل به شرح زیر وجود دارد:
مدل Post
Post
شامل فیلدهای زیر است:
- نویسنده:
owner
- عنوان:
title
- متن پست:
body
- زمان انتشار نوشته:
created
- زمان ویرایش نوشته:
updated
مدل Comment
Comment
شامل فیلدهای زیر است:
- نویسنده:
owner
- متن نظر:
body
- نوشته مربوطه:
post
- زمان انتشار نظر:
created
- زمان ویرایش نظر:
updated
در فایل
views.py
چهار
view
به شرح زیر وجود دارد:
۱. کلاس PostList
PostList
GET
:
لیست تمام پستها را به صورت یک خروجی
JSON
به فرمت زیر برمیگرداند.
[
{
"title": "test",
"body": "test_body",
"created": "2018-07-18T11:27:40.074000Z",
"owner": "admin"
},
{
"title": "test",
"body": "test_body",
"created": "2018-07-18T11:28:00.152000Z",
"owner": "test_author"
},
...
]
POST
:
عنوان و متن پست را به عنوان ورودی به صورت
JSON
میپذیرد و در صورتی که کاربر از قبل لاگین کرده باشد یک پست جدید به نام این کاربر میسازد.
۲. کلاس PostDetail
PostDetail
GET
:
جزئیات یک پست را به صورت یک خروجی
JSON
به فرمت زیر برمیگرداند.
لیستی از لینک کامنتهای یک پست نیز در این خروجی قرار دارد.
{
"title": "test",
"body": "test_body",
"created": "2018-07-18T11:26:53.044000Z",
"updated": "2018-07-18T11:26:53.044000Z",
"owner": "admin",
"comment_set": [
"http://localhost:8000/api/comments/1/",
"http://localhost:8000/api/comments/10/"
]
}
PUT
:
عنوان و متن پست را به عنوان ورودی به صورت
JSON
میپذیرد و در صورتی که کاربر مالک پست و یا ادمین باشد پست را ویرایش میکند.
DELETE
:
در صورتی که کاربر مالک پست و یا ادمین باشد پست را حذف میکند.
۳. کلاس CommentDetail
CommentDetail
GET
:
جزئیات یک کامنت را به صورت یک خروجی
JSON
به فرمت زیر برمیگرداند.
لینک پست مربوطه نیز در این خروجی قرار دارد.
{
"post": "http://localhost:8000/api/posts/1/",
"owner": "hamid",
"body": "test_body",
"created": "2018-07-18T11:28:47.400000Z",
"updated": "2018-07-18T11:28:47.401000Z"
}
PUT
:
متن کامنت را به عنوان ورودی به صورت
JSON
میپذیرد و در صورتی که کاربر مالک کامنت و یا ادمین باشد کامنت را ویرایش میکند.
DELETE
:
در صورتی که کاربر مالک کامنت و یا ادمین باشد کامنت را حذف میکند.
۴. کلاس AddComment
AddComment
POST
:
متن کامنت را به عنوان ورودی به صورت
JSON
میپذیرد و در صورتی که کاربر از قبل لاگین کرده باشد یک کامنت جدید به نام این کاربر و برای پست انتخاب شده میسازد.
اما کارهایی که شما باید در این پروژه انجام دهید:
شما باید در دو فایل
serializers.py
و
permissions.py
کلاسهایی که در این
view
ها استفاده شده و پیادهسازی نشدهاند را به گونهای پیادهسازی کنید که
view
ها طبق توضیحات دادهشده عمل کنند.
امکانات اضافه
در صورتی که علاقمندید که خودتان به صورت دستی کدهای خود را امتحان کنید و از درستی آنها اطمینان حاصل کنید، یا اینکه به بررسی بیشتر از این تمرین بپردازید، برای راحتی بیشتر شما، فایلهای مایگریشنها ساخته شدهاند و شما کافیست جهت ایجاد پایگاهداده، یک بار دستور migrate
را اجرا کنید.
علاوهبر این، یک سری دادهی از پیش آماده شده، فراهم شده که بعد از اجرای دستور migrate
، میتوانید آنها را وارد پایگاهدادهی پروژهی خود کنید. به این منظور، دستور زیر را اجرا کنید. میتوانید از این دادهها به جهت تست کردن کوئریهای خود استفاده کنید.
۱. ایجاد پایگاهداده
python manage.py migrate
۲. وارد کردن دادههای از پیش آماده شده (fixture)
python manage.py loaddata app/fixtures/comments.json
python manage.py loaddata app/fixtures/posts.json
python manage.py loaddata app/fixtures/users.json
در صورتی که علاقمند به تست نیستید، نیازی به ایجاد پایگاهداده و وارد کردن دادههای آزمایشی نیست، و تنها کافیست که در فایلهای خواستهشده، کدهای خود را بنویسید و از کوئرا جهت امتحان کردن درستی کدهایتان استفاده کنید.
تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
python manage.py test
نکات
- شما تنها مجاز به تغییر در
app/serializers.py
وapp/permissions.py
هستید. اگر تغییری در سایر فایلها ایجاد کنید، این تغییرات نادیده گرفته خواهد شد. - در هر بخشی از پروژه که
view
ها یک ورودی به فرمتjson
میپذیرند، منظور فرمتی به صورت زیر است:
{
"title": "test",
"body": "test_body"
}
- فراموش نکنید که میتوانید با مطالعهی
testsample.py
با روش تست کردن آشنا شوید.
نحوه ارسال
یک فایل ZIP حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.
ارسال پاسخ برای این سؤال