Django bài 1: Cài đặt django
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
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
- 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... - 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.
- 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.
- 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
.
.
.
- 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 - 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ả
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.
DD
Hay day anh ban, tiep tuc phat trien serie nay nhe.
Từ Anh Vũ
Cảm ơn bạn đã ủng hộ, mình sẽ cố gắng sắp xếp thời gian để viết đều đều.
Công
A Vừa đẹp trai vừa code giỏi nhỉ
Từ Anh Vũ
Cám ơn em đã khen và ủng hộ bài viết.
Shin
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á
Từ Anh Vũ
ah ok em, xin lỗi cũng do anh thiếu sót ^^!