_در این سوال قصد داریم به کمک کتابخانه DjangoRestFramework یک RESTful API برای وبلاگ خود طراحی کنیم._
میخواهیم یک API برای وبلاگ خود طراحی کنیم
به طوری که کاربران بتوانند از طریق این API، پستها و کامنتهای
خود را مدیریت کنند و همچنین ادمین وبلاگ بتواند
به تمام فعالیتها نظارت داشته باشد
و در صورت لزوم دست به کار شده و خودی نشان دهد.
## پروژه اولیه
پروژه اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/21212/) دانلود کنید. ساختار این پروژه به شرح زیر است:
```
blog
├── app
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── urls.py
│ ├── <mark class="yellow" title="شما مجاز به تغییر این فایل هستید."> > serializers.py < </mark>
│ ├── <mark class="yellow" title="شما مجاز به تغییر این فایل هستید."> > permissions.py < </mark>
│ └── views.py
├── Blog
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
└── requirements.txt
```
## جزئیات
در فایل `models.py` دو مدل به شرح زیر وجود دارد:
<details class="blue">
<summary> **مدل** `Post` </summary>
شامل فیلدهای زیر است:
* نویسنده: `owner`
* عنوان: `title`
* متن پست: `body`
* زمان انتشار نوشته: `created`
* زمان ویرایش نوشته: `updated`
</details>
<details class="blue">
<summary> **مدل** `Comment` </summary>
شامل فیلدهای زیر است:
* نویسنده: `owner`
* متن نظر: `body`
* نوشته مربوطه: `post`
* زمان انتشار نظر: `created`
* زمان ویرایش نظر: `updated`
</details>
در فایل
`views.py`
چهار
`view`
به شرح زیر وجود دارد:
<details class="green">
<summary> **۱. کلاس** `PostList` </summary>
`GET`:
لیست تمام پستها را به صورت یک خروجی
`JSON`
به فرمت زیر برمیگرداند.
```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`
میپذیرد و در صورتی که کاربر از قبل لاگین کرده باشد یک پست جدید به نام این کاربر میسازد.
</details>
<details class="green">
<summary> **۲. کلاس** `PostDetail` </summary>
`GET`:
جزئیات یک پست را به صورت یک خروجی
`JSON`
به فرمت زیر برمیگرداند.
لیستی از لینک کامنتهای یک پست نیز در این خروجی قرار دارد.
```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`:
در صورتی که کاربر **مالک** پست و یا **ادمین** باشد پست را حذف میکند.
</details>
<details class="green">
<summary> **۳. کلاس** `CommentDetail` </summary>
`GET`:
جزئیات یک کامنت را به صورت یک خروجی
`JSON`
به فرمت زیر برمیگرداند.
لینک پست مربوطه نیز در این خروجی قرار دارد.
```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`:
در صورتی که کاربر **مالک** کامنت و یا **ادمین** باشد کامنت را حذف میکند.
</details>
<details class="green">
<summary> **۴. کلاس** `AddComment` </summary>
`POST`:
متن کامنت را به عنوان ورودی به صورت
`JSON`
میپذیرد و در صورتی که کاربر از قبل لاگین کرده باشد یک کامنت جدید به نام این کاربر و برای پست انتخاب شده میسازد.
</details>
اما کارهایی که شما باید در این پروژه انجام دهید:
شما باید در دو فایل
**`serializers.py`**
و
**`permissions.py`**
کلاسهایی که در این
`view`
ها استفاده شده و پیادهسازی نشدهاند را به گونهای پیادهسازی کنید که
`view`
ها طبق توضیحات دادهشده عمل کنند.
## امکانات اضافه
در صورتی که علاقمندید که خودتان به صورت دستی کدهای خود را امتحان کنید و از درستی آنها اطمینان حاصل کنید، یا اینکه به بررسی بیشتر از این تمرین بپردازید، برای راحتی بیشتر شما، فایلهای مایگریشنها ساخته شدهاند و شما کافیست جهت ایجاد پایگاهداده، یک بار دستور `migrate` را اجرا کنید.
علاوهبر این، یک سری دادهی از پیش آماده شده، فراهم شده که بعد از اجرای دستور `migrate`، میتوانید آنها را وارد پایگاهدادهی پروژهی خود کنید. به این منظور، دستور زیر را اجرا کنید. میتوانید از این دادهها به جهت تست کردن کوئریهای خود استفاده کنید.
**۱. ایجاد پایگاهداده**
```shell terminal terminal
python manage.py migrate
```
**۲. وارد کردن دادههای از پیش آماده شده (fixture)**
```shell terminal terminal
python manage.py loaddata app/fixtures/comments.json
python manage.py loaddata app/fixtures/posts.json
python manage.py loaddata app/fixtures/users.json
```
در صورتی که علاقمند به تست نیستید، نیازی به ایجاد پایگاهداده و وارد کردن دادههای آزمایشی نیست، و تنها کافیست که در فایلهای خواستهشده، کدهای خود را بنویسید و از کوئرا جهت امتحان کردن درستی کدهایتان استفاده کنید.
## تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
```shell terminal terminal
python manage.py test
```
## نکات
+ شما تنها مجاز به تغییر در `app/serializers.py` و `app/permissions.py` هستید.
اگر تغییری در سایر فایلها ایجاد کنید، این تغییرات نادیده گرفته خواهد شد.
+ در هر بخشی از پروژه که
`view`
ها یک ورودی به فرمت
`json`
میپذیرند، منظور فرمتی به صورت زیر است:
```json
{
"title": "test",
"body": "test_body"
}
```
+ فراموش نکنید که میتوانید با مطالعهی `testsample.py` با روش تست کردن آشنا شوید.
## نحوه ارسال
یک فایل _ZIP_ حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل _ZIP_ اهمیتی ندارد.