Cấu hình và Khởi tạo Ứng dụng Web sử dụng Django và MySQL

Thiết lập Môi trường Phát triển

Sử dụng Conda để tạo một môi trường ảo biệt lập giúp quản lý các gói thư viện Python hiệu quả hơn và tránh xung đột phiên bản.

conda create --name django_web_env python=3.10
conda activate django_web_env
pip install django mysqlclient

Sau khi cài đặt hoàn tất, tích hợp môi trường này vào PyCharm bằng cách điều hướng đến Settings > Project > Python Interpreter, chọn Add Interpreter và trỏ đường dẫn đến môi trường django_web_env vừa tạo.

Cấu trúc Thư mục Dự án

Một dự án Django tiêu chuẩn sau khi khởi tạo sẽ có cấu trúc phân cấp như sau:

Đường dẫn Mô tả chi tiết
manage.py Công cụ dòng lệnh trung tâm để tương tác với dự án, thực thi các tác vụ như chạy server, đồng bộ cơ sở dữ liệu.
core_project/ Thư mục chứa các cấu hình toàn cục của hệ thống.
- __init__.py Định danh thư mục là một Python package.
- settings.py Nơi khai báo các thiết lập cốt lõi: kết nối database, middleware, ứng dụng đã cài đặt.
- urls.py Bộ định tuyến URL cấp dự án, điều hướng các yêu cầu HTTP đến đúng ứng dụng.
- wsgi.py / asgi.py Điểm vào (entry point) dành cho các web server chuẩn WSGI hoặc ASGI khi triển khai thực tế.
main_app/ Module ứng dụng chứa logic nghiệp vụ cụ thể.
- models.py Định nghĩa cấu trúc bảng cơ sở dữ liệu thông qua ORM.
- views.py Xử lý logic yêu cầu từ người dùng và trả về phản hồi HTTP.
- admin.py Đăng ký các model để quản lý qua giao diện Django Admin có sẵn.
- migrations/ Lưu trữ lịch sử thay đổi cấu trúc cơ sở dữ liệu.
- templates/ Thư mục chứa các file HTML dùng để render giao diện.
- static/ Nơi lưu trữ tài nguyên tĩnh như CSS, JavaScript và hình ảnh.

Tùy chỉnh Tham số Cấu hình

Tiến hành điều chỉnh file settings.py để thiết lập kết nối cơ sở dữ liệu MySQL và cấu hình đường dẫn template:

import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = 'django-insecure-random-string-for-development-only'
DEBUG = True
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'main_app', # Đăng ký ứng dụng mới
]

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 = 'core_project.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        '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',
            ],
        },
    },
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'app_database',
        'USER': 'db_user',
        'PASSWORD': 'db_password',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

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'},
]

LANGUAGE_CODE = 'vi'
TIME_ZONE = 'Asia/Ho_Chi_Minh'
USE_I18N = True
USE_TZ = True

STATIC_URL = 'static/'
STATIC_ROOT = BASE_DIR / 'static_root'
STATICFILES_DIRS = [BASE_DIR / 'static']

Cập nhật file manage.py để trỏ đúng module settings:

#!/usr/bin/env python
import os
import sys

def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core_project.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Lỗi hệ thống: Không thể khởi tạo Django. "
            "Vui lòng đảm bảo gói django đã được cài đặt trong môi trường ảo."
        ) from exc
    execute_from_command_line(sys.argv)

if __name__ == '__main__':
    main()

Thiết lập định tuyến URL cấp ứng dụng trong main_app/urls.py:

from django.urls import path
from . import views

app_name = 'main'
urlpatterns = [
    path('dashboard/', views.home_view, name='home'),
    path('auth/signin/', views.sign_in, name='signin'),
    path('auth/signup/', views.sign_up, name='signup'),
]

Tích hợp URL của ứng dụng vào dự án chính qua core_project/urls.py:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('management/', admin.site.urls),
    path('', include('main_app.urls')),
]

Khởi chạy Máy chủ Phát triển

Thực thi lệnh sau trong terminal để bắt đầu máy chủ cục bộ:

python manage.py runserver 0.0.0.0:8000

Truy cập http://127.0.0.1:8000 trên trình duyệt để kiểm tra trạng thái hoạt động.

Xử lý Lỗi Tương thích Phiên bản MySQL

Trong quá trình kết nối, nếu hệ thống trả về lỗi django.db.utils.NotSupportedError: MySQL 8.0 or later is required, nguyên nhân là do phiên bản MySQL hiện tại quá cũ (ví dụ: 5.6 hoặc 5.7) trong khi Django yêu cầu tối thiểu phiên bản 8.0.

Phương án tối ưu nhất là nâng cấp hệ quản trị cơ sở dữ liệu lên MySQL 8.0+. Tuy nhiên, trong trường hợp bắt buộc phải sử dụng phiên bản cũ, có thể can thiệp trực tiếp vào source code của Django. Mở file base.py nằm trong đường dẫn django/db/backends/mysql/ của môi trường ảo, tìm đến phương thức kiểm tra phiên bản và vô hiệu hóa nó:

# Comment lại dòng kiểm tra phiên bản
# self.check_database_version_supported()

Lưu file và khởi động lại server để áp dụng thay đổi.

Thẻ: Django python mysql conda wsgi

Đăng vào ngày 28 tháng 9 lúc 00:35