در این سوال قصد داریم به کمک کتابخانه 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
Plain text

جزئیات

در فایل models.py دو مدل به شرح زیر وجود دارد:

مدل Post

شامل فیلدهای زیر است:

  • نویسنده:‌ owner
  • عنوان:‌‌ title
  • متن پست:‌ body
  • زمان انتشار نوشته:‌ created
  • زمان ویرایش نوشته:‌ updated

مدل Comment

شامل فیلدهای زیر است:

  • نویسنده:‌ owner
  • متن نظر: body
  • نوشته مربوطه: post
  • زمان انتشار نظر:‌ created
  • زمان ویرایش نظر: updated

در فایل views.py چهار view به شرح زیر وجود دارد:

۱. کلاس 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"
    },
    ...
]
JSON

POST: عنوان و متن پست را به عنوان ورودی به صورت JSON می‌پذیرد و در صورتی که کاربر از قبل لاگین کرده باشد یک پست جدید به نام این کاربر می‌سازد.

۲. کلاس 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/"
    ]
}
JSON

PUT: عنوان و متن پست را به عنوان ورودی به صورت JSON می‌پذیرد و در صورتی که کاربر مالک پست و یا ادمین باشد پست را ویرایش می‌کند.

DELETE: در صورتی که کاربر مالک پست و یا ادمین باشد پست را حذف می‌کند.

۳. کلاس 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"
}
JSON

PUT: متن کامنت را به عنوان ورودی به صورت JSON می‌پذیرد و در صورتی که کاربر مالک کامنت و یا ادمین باشد کامنت را ویرایش می‌کند.

DELETE: در صورتی که کاربر مالک کامنت و یا ادمین باشد کامنت را حذف می‌کند.

۴. کلاس AddComment

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

اما کارهایی که شما باید در این پروژه انجام دهید:

شما باید در دو فایل serializers.py و permissions.py کلاس‌هایی که در این view ها استفاده شده و پیاده‌سازی نشده‌اند را به گونه‌ای پیاده‌سازی کنید که view ها طبق توضیحات داده‌شده عمل کنند.

امکانات اضافه

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

علاوه‌بر این، یک سری داده‌ی از پیش آماده شده، فراهم شده که بعد از اجرای دستور migrate، می‌توانید آن‌ها را وارد پایگاه‌داده‌ی پروژه‌ی خود کنید. به این منظور، دستور زیر را اجرا کنید. می‌توانید از این داده‌ها به جهت تست کردن کوئری‌های خود استفاده کنید.

۱. ایجاد پایگاه‌داده

python manage.py migrate
Shell
terminal

۲. وارد کردن داده‌های از پیش آماده شده (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
Shell
terminal

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

تست نمونه

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

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

python manage.py test
Shell
terminal

نکات

  • شما تنها مجاز به تغییر در app/serializers.py و app/permissions.py هستید. اگر تغییری در سایر فایل‌ها ایجاد کنید، این تغییرات نادیده گرفته خواهد شد.
  • در هر بخشی از پروژه که view ها یک ورودی به فرمت json می‌پذیرند،‌ منظور فرمتی به صورت زیر است:
{
  "title": "test",
  "body": "test_body"
}
JSON
  • فراموش نکنید که می‌توانید با مطالعه‌ی testsample.py با روش تست کردن آشنا شوید.

نحوه ارسال

یک فایل ZIP حاوی همه‌ی فایل‌های پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.


ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.