Django REST trong 5 phút dùng Docker

  Jan 1, 2019      2m
   

Bài viết hướng dẫn dựng RESTful API với Django (kèm source code).

Django REST trong 5 phút dùng Docker

MÔI TRƯỜNG

RESTFUL API TRÊN DJANGO

Source code ví dụ mẫu mình đã upload tại https://github.com/minhng92/django-rest-example-docker.

Bước 1: clone code về máy.

git clone https://github.com/minhng92/django-rest-example-docker

Bước 2: build docker image. Chờ một lúc cho nó build hoàn tất. Xem thêm bài viết: Cài đặt DockerGiải thích về Docker nếu bạn chưa biết Docker là gì.

cd django-rest-example-docker
docker-compose build

Bước 3: tạo database và tài khoản admin. Bước này mình chỉ làm một lần. Điền password admin bạn mong muốn, ví dụ: password123

docker-compose run web bash -c "python manage.py makemigrations rest_example && python manage.py migrate && python manage.py createsuperuser --email admin@example.com --username admin"

Bước 4: start server django.

docker-compose up

hoặc nếu bạn muốn server chạy ngầm:

docker-compose up -d

Bước 5: vào địa chỉ http://localhost:8000 để xem các RESTful API mà mình đã dựng. Hoặc vào http://localhost:8000/admin giao diện django admin.

GIẢI THÍCH VỀ DJANGO REST

Toàn bộ source code đã có trên Github vì vậy khi đã clone code về bạn có thể mổ xẻ để biết mình đã code ví dụ này như thế nào, từ đó mở rộng thêm. Đây cũng có thể xem là một sườn ví dụ mẫu về tạo RESTful API trên Django để từ đó bạn có thể đi nhanh hơn.

Công nghệ sử dụng:

  • Docker / Docker Compose
  • Django 2.1 (latest version tại thời điểm bài viết)
  • Django REST framework (plugin cho Django để làm việc với RESTful API)

2 bài viết mình đã tham khảo để dựng code ví dụ về django rest này:

Một số giải thích thêm về source code https://github.com/minhng92/django-rest-example-docker:

requirements.txt: Chứa các gói dependency mà cần phải cài đặt khi dựng môi trường python3 trong docker image. Trong file này mình đã đặc tả gói django, django REST framework và các gói liên quan khác. Nếu trong dự án của bạn còn cần thêm gì thì có thể viết thêm vào cũng như đặc tả thêm version cho các package.

Django project và django app được generate bình thường như câu lệnh chuẩn trong django:

  • django-admin startproject
  • django-admin startapp

django_rest_example_docker/settings.py: điều chỉnh cấu hình ở một số chỗ.

ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
    'rest_example.apps.RestExampleConfig',  <-- đây
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',  <-- đây
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

REST_FRAMEWORK = {  <-- đây là biến chứa cấu hình cho DJANGO REST FRAMEWORK
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ],
    ## Pagination  <-- nếu bạn muốn phân trang cho REST, hãy mở chú thích 2 dòng bên dưới.
    #'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    #'PAGE_SIZE': 10
}

rest_example/models.py: thêm 2 bảng mới là loại sản phẩm và sản phẩm, minh họa cho ứng dụng e-commerce tương tự bài viết "Học Django trong 1 ngày"

rest_example/admin.py: đăng ký 2 model mới ở trên cho django amdin.

rest_example/serializers.py: tạo serializer tương ứng mà bạn muốn public ra dạng REST API. Serializer bạn có thể đó là mô tả cách đóng gói sẽ chứa các thành phần trong API của bạn.

rest_example/views.py: link serializer vừa tạo của bạn cho viewset của plugin rest framework. Mục đích sẽ cung cấp giao diện API cho người dùng xem.

rest_django_viewset.png

django_rest_example_docker/urls.py: cuối cùng là mình đăng ký các view trên vào router url của django.

...

router.register(r'users', rest_example_views.UserViewSet)
router.register(r'groups', rest_example_views.GroupViewSet)
# register custom models
router.register(r'types', rest_example_views.TypeViewSet)
router.register(r'products', rest_example_views.ProductViewSet)

...

urlpatterns = [
    ...,
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

Vậy là sau khi hoàn tất tutorial này bạn sẽ vừa có giao diện admin để thao tác với sản phẩm, vừa có API để phục vụ cho các ứng dụng khác bên ngoài!

rest_django_admin.png

rest_django_rest.png