Django Ứng dụng Python

Django bài 1: Cài đặt django

Đăng bởi - Ngày 8-06-2018

Giới thiệu về django

Mặc dù là mã nguồn mở, nhưng nếu so sánh về mặt web application giữa python và php thì số lượng mã nguồn web của php rất rất nhiều. Các CMS, ecommerce php mọc như nấm sau cơn mưa và cộng đồng hỗ trợ php cũng rất lớn, mặc dù vậy php lại rất dễ bị lỗi sqlinjection và các lỗi bảo mật thông qua các plugin/extension chúng ta cài vào... So với python thì các web application mặc dù ít nhưng được bảo mật tốt hơn nhưng vì cộng đồng python tại Việt Nam chưa phát triển mạnh nên cũng ít người biết đến.

Series bài viết này mình sẽ giới thiệu với các bạn một mã nguồn web application của python đó là django. Mình rất ấn tượng với django với khả năng linh hoạt, quản lý database thông qua các model và migration. Cộng đồng django trên thế giới cũng khá đông và cho ra đời kha khá package không thua gì wordpress. Ngoài ra django là mã nguồn viết trên python, điều đó có nghĩa là bất cứ package nào bạn install cho python đều có thể sử dụng được cho django. Nghe hấp dẫn không :d

Bạn có thể thử command bên dưới để xem các package có thể cài đặt qua pip

pip search django

package django

Phiên bản mới nhất hiện nay cho đến thời điểm mình viết bài viết này là django 2.0.6 vừa được phát hành ngày 1 tháng 6 năm 2018. Mình sẽ dùng phiên bản cho series của chúng ta. Tuy nhiên, dùng phiên bản mới tương đương với rủi ro các package sẽ không tương thích. Tới lúc đó nếu không tìm được giải pháp thích hợp thì mình sẽ downgrade sau :)).

Một điều lưu ý khác là bài viết này dành cho các bạn có kiến thức về html và css, một số chỗ mình không hướng dẫn kỹ như cuốn django unleashed vì bài viết này sẽ tập trung vào tạo site tin tức chứ không phải là làm quen với django. Nếu bạn muốn tham khảo ebook django unleashed có thể xem tại đây.

Cài đặt django

Ok bây giờ chúng ta sẽ đến với phần quen thuộc. Các bạn hãy tạo virtual env mới sau đó cài đặt django thông qua pip.

Các bạn lưu ý rằng các bài viết của mình ở đây hoàn toàn sử dụng python 3 nha.

pip install django

## hoặc cho chắc chắn là bản 2.0.6 bạn dùng command sau

pip install django==2.0.6

Để kiểm tra version bạn có thể dùng command sau để kiểm tra

(pyenv) 
╭─{ marvelous }───────〔 /var/projects/django/sitestintuc 〕───────{ Wed Jun 06, 12:23
╰─● django-admin --version                                                                                                                                                 
2.0.6

Tiếp theo ta sẽ tạo một project mới thông qua django-admin

(pyenv) 
╭─{ marvelous }───────〔 /var/projects/django/sitestintuc 〕───────{ Wed Jun 06, 12:53
╰─● django-admin startproject newsproject

django-admin là command-line trợ giúp cho các công việc mà bạn phải tạo bằng tay. Như ở command trên, nếu bạn không chạy django-admin startproject newsprojectđể tạo khung các files ban đầu cho project thì bạn phải tạo các file manage.py, module newsproject... và phải sau đó là copy nội dung vào các file đó.

Khi bạn chạy xong dòng lệnh trên, django-admin sẽ tạo ra các file và folders như sau

django folders

  1. manage.py có thể làm những tác vụ như django-admin, nhưng manage.py giúp bạn làm thêm những thứ khác như:
    - Thiết lập các package trong project của bạn vào sys.path
    - Thiết lập các variables cho settings.py
    - Tạo module mới, tạo file migration, submit file migration lên databse, tạo các file static...
  2. settings.py: là module chứa các thiết lập của project. Trong django đây là module-level, có nghĩa là ta có thể tạo nhiều file settings.py để chạy ở các môi trường khác nhau. Ví dụ như: settings-production.py, settings-local.py, settings-dev.py ... Đọc thêm chi tiết tại đây.
  3. urls.py: là module chứa urls chính của project. Mỗi một module tạo ra đều có file urls.py riêng nhưng để django chạy được đều phải include vào file này. Django sẽ đọc các url trong file này và tạo routes cho project. Đọc thêm chi tiết tại đây.
  4. wsgi.py: là module chứa WSGI application sử dụng cho django trên production server. Đọc thêm chi tiết tại đây.

Một số command khác của django-admin

╭─{ marvelous }───────〔 /var/projects/django/sitestintuc 〕───────{ Thu Jun 07, 10:21
╰─● django-admin --help                                                                                                                                                    

Type 'django-admin help <subcommand>' for help on a specific subcommand.

Available subcommands:

[django]
    check
    compilemessages
    createcachetable
    dbshell
    diffsettings
    dumpdata
    flush
    inspectdb
    loaddata
    makemessages
    makemigrations
    migrate
    runserver
    sendtestemail
    shell
    showmigrations
    sqlflush
    sqlmigrate
    sqlsequencereset
    squashmigrations
    startapp
    startproject
    test
    testserver
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.).

Chọn database cho projects

Khi bắt đầu một projects django bạn sẽ phải lựa chọn database cho project của mình. Việc sử dụng database là điều cần thiết cho 1 website, bạn có thể nghĩ database như là bộ não của website vậy. Database đảm nhiệm vai trò lưu giữ các bài viết, email cũng như quản lý user, từ đó ta có thể biết tìm kiếm dễ dàng một bài viết từ tận năm 2011 thông qua câu query hoặc phân biệt được vai trò của user là administrator hoặc editor...

Hiện nay có rất nhiều loại database khác nhau mà ta có thể chọn như: postgrest, mongodb, mysql, sqlite... và nhiều loại khác nữa. Mặc định django sẽ cài đặt cho bạn sử dụng sqlite, một database "mì ăn liền" có sẵn trong python giúp các bạn trải nghiệm django nhanh mà không phải cài đặt database backend.

Trong series này mình sẽ dùng mongodb cho project của chúng ta. Các bạn hãy cài đặt mongo server sau đó start mongo server. Nếu bạn chưa cài mongo server bao giờ thì có thể tham khảo tại đây: https://docs.mongodb.com/manual/installation/

Để kết nối django với mongo server bạn hãy cài đặt package sau

pip instal djongo

Sau đó hãy mở file newsproject/settings.py, tìm INSTALLED_APPS, DATABASES và chỉnh sửa như sau

.
.
.
#other settings

DATABASES = {
    'default': {
        'ENGINE': 'djongo', #1
        'NAME': 'django_newsproject', #2
        #'USER': 'admin',
        #'PASSWORD': 'abc#123',
        #'HOST': '127.0.0.1',
        #'PORT': 27017,
    }
}


#other settings

.
.
.
  1. ENGINE: là key cho bạn chọn database sẽ sử dụng trong django. Trong trường hợp bài viết này, ta đã cài đặt djongo, một package cho phép sử dụng mongo làm database engine cho django. Ngoài ra còn có một số engine được dùng khác như:
    - django.db.backends.sqlite3
    - django.db.backends.postgresql
    - django.db.backends.mysql
    - django.db.backends.oracle
    - django.db.backends.dummy
    Bạn có thể tham khảo thêm tại đây
  2. NAME: là tên database của bạn đã tạo và dùng cho project. Nếu dùng SQLite thì đây sẽ là đường dẫn tuyệt đối (absolute path) đến file sqlite. Giá trị mặc định là os.path.join(BASE_DIR,’db.sqlite3'), sẽ lưu file sqlite ngay tại thư mục chứa project hiện tại. Trong trường hợp bài viết này là database sẽ dùng trong mongo django_newsproject

Bạn có thể setup user mongo cho database và thiết lập bằng cách chỉ định USER, PASSWORD, HOST, PORT trong DATABASES để tăng thêm độ bảo mật. Tuy nhiên nếu bạn chỉ thiết lập database name thì mongo vẫn chấp nhận.

Bạn còn nhớ module newsproject mà django-admin tự động tạo ra phía trên chứ? Để module này có thể hoạt động trong django, ta phải khai báo trong settings.py

# other settings
INSTALLED_APPS = [
    # ...
    # other app
    'newsproject'
]

Tiếp theo ta cần chỉ định SITE_ID và ALLOWED_HOST

#other settings
ALLOWED_HOSTS = ['127.0.0.1', ]

SITE_ID = 1
#other settings
  • ALLOWED_HOSTS: nếu bạn bạn deploy project này đến server thì bạn cần phải thêm domain vào đây. Những domain được thêm vào đây django mới cho phép chạy
  • SITE_ID: Bạn cần chỉ định site id vào đây, vì django hỗ trợ multi site và multi domain. Thường thì khi mới tạo ta sử dụng luôn mặc định là 1

File newsproject/settings.py của bạn sẽ như sau

"""
Django settings for newsproject project.

Generated by 'django-admin startproject' using Django 1.11.

For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '4bgs5cx!k#hdwwd_5owg31#_!93&u1+2^rfgyr!sper3digml2'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['127.0.0.1', ]

SITE_ID = 1

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'newsproject'
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'newsproject.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'newsproject.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'NAME': 'django_newsproject',
        # 'USER': 'admin',
        # 'PASSWORD': 'abc#123',
        # 'HOST': '127.0.0.1',
        # 'PORT': 27017,
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

STATIC_URL = '/static/'

Tại terminal bạn hãy vào thư mục newsproject và thực hiện command migrate để tiến hành install các tables default vào database django_newsproject

(pyenv) 
╭─{ marvelous }───────〔 projects/django/sitestintuc/newsproject 〕───────{ Fri Jun 08, 01:16
╰─● ./manage.py migrate                                                                                                                                                    
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying sessions.0001_initial... OK

Bạn có thể kiểm tra lại xem các tables đã install đúng chưa bằng cách vào mongo shell và chạy command

╭─{ marvelous }───────〔 ~ 〕───────{ Fri Jun 08, 01:13
╰─● mongo shell                                                                                                                                                               
MongoDB shell version v3.6.5
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.5
> use django_newsproject
switched to db django_newsproject
> show tables
__schema__
auth_group
auth_group_permissions
auth_permission
auth_user
auth_user_groups
auth_user_user_permissions
django_admin_log
django_content_type
django_migrations
django_session

Bây giờ ta sẽ kiểm tra xem django đã hoạt động chưa bằng command

╭─{ marvelous }───────〔 projects/django/sitestintuc/newsproject 〕───────{ Fri Jun 08, 01:25
╰─● ./manage.py runserver                                                                                                                                                  
Performing system checks...

System check identified no issues (0 silenced).
June 07, 2018 - 18:32:48
Django version 2.0.6, using settings 'newsproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Bạn hãy mở browser của bạn lên và vào địa chỉ http://127.0.0.1:8000/ để xem kết quả

django welcome page

Bài 1 trong series django đến đây là kết thúc. Mọi ý kiến góp ý của các bạn mình rất hoan nghênh. Các bạn thắc mắc có thể hỏi mình bằng cách comment tại bài viết này hoặc trên group Python Community Viet Nam. Chúc các bạn tự học python thành công.

Các thẻ
Bài viết liên quan
6 nhận xét
  1. Trả lời

    DD

    12 Tháng 6, 2018

    Hay day anh ban, tiep tuc phat trien serie nay nhe.

    • Trả lời

      Từ Anh Vũ

      13 Tháng 6, 2018

      Cảm ơn bạn đã ủng hộ, mình sẽ cố gắng sắp xếp thời gian để viết đều đều.

  2. Trả lời

    Công

    14 Tháng 6, 2018

    A Vừa đẹp trai vừa code giỏi nhỉ

  3. Trả lời

    Shin

    14 Tháng 6, 2018

    anh ơi thêm dòng "phải cài đặt mongodb trước", em k cài mongodb sẵn trong máy thành ra k chạy cứ tưởng lỗi gì, ngồi đần mất 2 tiếng :((((, ngu quá

Nhận xét mới

bắt buộc

yu.kusanagi
Từ Anh Vũ
Hồ Chí Minh, Việt Nam

Xin chào, tôi tên Từ Anh Vũ và là 1 free lancer developer và ngôn ngữ code yêu thích của tôi là Python và PHP. Công việc chủ yếu là viết các module cho magento, magento2, wordpress, django, flask và các framework khác
Nếu bạn muốn trao đổi với tôi hoặc muốn thuê tôi làm việc cho dự án của bạn, hãy liên hệ với tôi

ĐĂNG KÝ NHẬN BÀI MỚI

Tweets gần đây
Tác giả
Feeds
RSS / Atom
ADVERTISING

Đăng ký nhận bài viết mới tại hocpython.com?

Hãy đăng ký nhận bài viết mới tại hocpython.com để:

  • Không bỏ lỡ các bài tutorials mới tại hocpython.com!
  • Cập nhật các công nghệ mới trong python!

Chỉ cần điền email và họ tên của bạn và nhấn Đăng ký nhận tin!