跳到主要内容

Django

Django 是一个功能强大的 Python Web 框架,遵循 "Batteries-included" 理念,提供开箱即用的全栈解决方案。它以高效开发和安全稳定著称,内置 ORM、Admin 后台、用户认证等模块,大幅减少重复代码。Django 采用清晰的 MVC(MTV)架构,支持高扩展性,适合从快速原型到企业级应用开发。

本指南介绍如何在 CloudBase HTTP 云函数上部署 Django 应用程序。

前置条件

在开始之前,请确保您已经:

  • 安装了 Python 3.10 或更高版本
  • 拥有腾讯云账号并开通了 CloudBase 服务
  • 了解基本的 Python 和 Django 开发知识

第一步:创建 Django 应用

💡 提示:如果您已经有一个 Django 应用,可以跳过此步骤。

设置开发环境

创建项目目录并设置虚拟环境:

# 创建项目目录
mkdir django-cloudbase
cd django-cloudbase

# 创建虚拟环境
python -m venv env

# 激活虚拟环境
# Linux/macOS
source env/bin/activate

# Windows
# env\Scripts\activate

安装 Django

python -m pip install django

创建 Django 项目

django-admin startproject django_app .

此命令将在当前目录创建一个名为 django_app 的 Django 项目。

配置 Django 设置

编辑 django_app/settings.py 文件,添加 CloudBase 云函数的必要配置:

import os
from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = os.environ.get('SECRET_KEY', 'your-secret-key-here')

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = os.environ.get('DEBUG', 'False').lower() == 'true'

ALLOWED_HOSTS = ['*'] # 允许所有主机访问

# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

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

# Database
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:',
}
}

# Static files (CSS, JavaScript, Images)
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

# Default primary key field type
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

创建简单的视图

编辑 django_app/urls.py 文件:

from django.contrib import admin
from django.urls import path
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json

def home(request):
"""首页视图"""
return JsonResponse({
'message': 'Hello from Django on CloudBase!',
'method': request.method,
'path': request.path
})

def health(request):
"""健康检查接口"""
return JsonResponse({
'status': 'healthy',
'framework': 'Django',
'version': '4.2'
})

@csrf_exempt
def api_info(request):
"""API 信息接口"""
data = {
'method': request.method,
'path': request.path,
'headers': dict(request.headers),
'get_params': dict(request.GET),
}

if request.method == 'POST':
try:
data['post_data'] = json.loads(request.body) if request.body else {}
except json.JSONDecodeError:
data['post_data'] = request.POST.dict()

return JsonResponse(data)

urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home'),
path('health/', health, name='health'),
path('api/info/', api_info, name='api_info'),
]

第二步:本地测试

在部署之前,先在本地测试应用:

⚠️ 重要提示:CloudBase HTTP 云函数要求应用监听 9000 端口。

# 运行数据库迁移
python manage.py migrate

# 启动开发服务器(使用 9000 端口)
python manage.py runserver 0.0.0.0:9000

打开浏览器访问 http://127.0.0.1:9000,您应该能看到 JSON 响应。

测试其他接口:

  • http://127.0.0.1:9000/health - 健康检查
  • http://127.0.0.1:9000/api/info/ - API 信息

第三步:配置依赖项

生成 requirements.txt 文件:

pip freeze > requirements.txt

⚠️ 注意:只有在虚拟环境中运行上述命令才是安全的,否则它将生成系统上所有已安装的 Python 包,可能导致云函数无法正常启动。

典型的 requirements.txt 内容:

# Django 4.2 LTS - 兼容 SQLite 3.26+, 云函数默认运行时 SQLite 版本有要求
Django==4.2.16
asgiref==3.7.2
psycopg2-binary==2.9.11
sqlparse==0.4.4
typing_extensions==4.15.0

第四步:创建启动脚本

💡 注意

  • 在 windows 下创建 scf_bootstrap 文件时,优先使用 nano scf_bootstrap 或者 vim scf_bootstrap 创建
  • 在 windows 下使用 vscode 创建 scf_bootstrap 文件时,部署到 HTTP 云函数可能会报错: scf_bootstrap 文件不存在
  • 这个错误是因为脚本文件包含了 Windows 格式的回车符(^M),导致 Linux 无法正确识别解释器路径。这是 WSL 中常见的问题

创建 scf_bootstrap 文件(无扩展名):

#!/bin/bash
# 设置 Python 依赖加载路径,我们默认设置在 third_party 目录
export PYTHONPATH="./third_party:$PYTHONPATH"

# 运行数据库迁移
/var/lang/python310/bin/python3.10 manage.py migrate --noinput

# 收集静态文件
/var/lang/python310/bin/python3.10 manage.py collectstatic --noinput

# 启动 Django 应用
/var/lang/python310/bin/python3.10 manage.py runserver 0.0.0.0:9000

为启动脚本添加执行权限:

chmod +x scf_bootstrap

💡 说明

  • scf_bootstrap 是 CloudBase 云函数的启动脚本
  • 脚本会自动运行数据库迁移和静态文件收集
  • 确保应用监听 9000 端口

第五步:准备部署文件

部署前将依赖安装到 third_party 目录下:

⚠️ 注意

  • HTTP 云函数并不会自动安装 Python 依赖,所以我们需要自己将依赖下载到代码包中
pip install -r requirements.txt -t third_party

确保您的项目目录结构如下:

django-cloudbase/
├── third_party/ # 第三方依赖
├── django_app/ # Django 项目目录
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py # Django 管理脚本
├── requirements.txt # 依赖列表
├── scf_bootstrap # 启动脚本

第六步:部署到 CloudBase HTTP 云函数

通过控制台部署

  1. 登录 CloudBase 控制台
  2. 选择您的环境,进入「云函数」页面
  3. 点击「新建云函数」
  4. 选择「HTTP 云函数」
  5. 填写函数名称(如:django-app
  6. 选择运行时:Python 3.10
  7. 提交方法选择:本地上传文件夹
  8. 函数代码选择项目根目录进行上传
  9. 自动安装依赖:开启此选项
  10. 点击「创建」按钮等待部署完成

通过 CLI 部署

详情请参考 部署HTTP云函数

打包部署

如果需要手动打包:

# 创建部署包
zip -r django-app.zip third_party django_app manage.py scf_bootstrap

第七步:访问您的应用

部署成功后,您可以参考通过 HTTP 访问云函数设置自定义域名访问HTTP 云函数

您可以测试以下接口:

  • 根路径:查看欢迎消息
  • /health/:查看健康状态
  • /api/info/:查看请求信息
  • /admin/:访问 Django 管理后台

常见问题

Q: 为什么必须使用 9000 端口?

A: CloudBase HTTP 云函数要求应用监听 9000 端口,这是平台的标准配置。

Q: 如何处理静态文件?

A: 在 settings.py 中配置 STATIC_ROOT,并在 scf_bootstrap 中运行 collectstatic 命令。

Q: 数据库如何配置?

A: 对于生产环境,建议使用 CloudBase 数据库或其他云数据库服务,而不是 SQLite。

Q: 如何查看应用日志?

A: 在 CloudBase 控制台的云函数页面,点击函数名称进入详情页查看运行日志。

Q: Django 的 SECRET_KEY 如何管理?

A: 建议使用环境变量管理敏感配置,在云函数中设置环境变量。

最佳实践

  1. 环境变量管理:使用环境变量管理敏感配置信息
  2. 数据库选择:生产环境使用云数据库而非 SQLite
  3. 静态文件处理:正确配置静态文件的收集和服务
  4. 安全配置:在生产环境中关闭 DEBUG 模式
  5. 日志记录:配置适当的日志级别和输出格式
  6. 错误处理:实现全局异常处理和友好的错误页面

进阶配置

使用 WSGI 服务器

对于生产环境,建议使用 Gunicorn 等 WSGI 服务器:

# 安装 Gunicorn
pip install gunicorn

# 更新 requirements.txt
pip freeze > requirements.txt

修改 scf_bootstrap

#!/bin/bash
export PYTHONPATH="./env/lib/python3.10/site-packages:$PYTHONPATH"

# 运行迁移
/var/lang/python310/bin/python3.10 manage.py migrate --noinput

# 收集静态文件
/var/lang/python310/bin/python3.10 manage.py collectstatic --noinput

# 使用 Gunicorn 启动
/var/lang/python310/bin/python3.10 -m gunicorn django_app.wsgi:application --bind 0.0.0.0:9000

环境变量配置

在云函数控制台设置环境变量:

  • SECRET_KEY: Django 密钥
  • DEBUG: 调试模式(False)
  • DATABASE_URL: 数据库连接字符串(如果使用外部数据库)

下一步