最近在写 Linux 中国的翻译工具的时候,后端我使用的是 Django,版本则选择了 Django 4.2,Python 3.11。在部署 Django 的时候,我选择使用 Render.com 来部署。 不过,在部署的时候,我遇到了一些问题,Render 官方提供的 Getting Started with Django on Render 会部署错误,所以有了今天这篇文章, 告诉大家如何把最新的 Django 4.2 部署到 Render 上。
初始化项目
Render 没有使用 pip,而是使用 Poetry 来管理 Django 项目的,因此,你需要使用 Poetry 来完成项目的初始化。
poetry init
poetry add django gunicorn
poetry run django-admin startproject linuxondjango .
Code language: PHP (php)
初始化项目基本上就是用 Poetry 替代 pip ,这里没有需要针对 Render 特化的部分,就不做过多的介绍。
编写逻辑代码
当你完成了项目的初始化之后,可以编写你自己的业务逻辑代码,这部分不再多讲,可以正常开发使用。
配置项目以支持 Render 的服务端环境。
1. 从环境变量中读取 Secret Key
Django 使用 Secret Key 作为 Session 加密等一些加密场景的 Salt 和 Seed,所以在 Django Admin 创建项目时,会默认生成一个 Session。不过出于安全考虑,最好不要将其放在代码中,而是在服务端生成后,通过环境变量来存储,避免代码泄露后导致的 session 被解密。
你需要在 settings.py
中,添加如下代码,来替代默认的 key。
import os
SECRET_KEY = os.environ.get('SECRET_KEY', default='your secret key')
Code language: PHP (php)
2. 在环境变量中读取 Debug 配置
Render 会自动配置一些环境变量,因此,你可以直接通过判断当前环境上下文来确认当前是否是在 Render 的服务端,如果不在,则配置 Debug 为 True,来解决线上不使用 Debug 模式的需求。
DEBUG = 'RENDER' not in os.environ
Code language: JavaScript (javascript)
3. 从环境变量中读取可用域名
Django 是有域名配置的,非配置域名,无法访问当前应用,因此,你需要在 Render 当中读取域名,来确保可以正常访问。当然,如果你自己配置了自己的域名,也可以直接手动写在 ALLOWED_HOSTS
当中。
ALLOWED_HOSTS = []
RENDER_EXTERNAL_HOSTNAME = os.environ.get("RENDER_EXTERNAL_HOSTNAME")
if RENDER_EXTERNAL_HOSTNAME:
ALLOWED_HOSTS.append(RENDER_EXTERNAL_HOSTNAME)
Code language: JavaScript (javascript)
配置 render.yml 来支持 Render BluePrint
你可以直接复制下面的内容,来作为你的项目的启动配置。其中 build.sh 为构建项目的配置。
build.sh
build.sh 当中最重要的是重新安装 Poetry,因为我使用的是 Python 3.11.4, 和 Render 默认的 Python 3.7 不匹配,所以没办法直接用默认的 Poetry,需要自动手动升级 Poetry。
set -o errexit
pip install --upgrade pip; pip install poetry;
poetry install
python manage.py collectstatic --no-input
python manage.py migrate
Code language: PHP (php)
render.yml
Render 当中,最重要的是 startCommand
和 PYTHON_VERSION
,startCommand 这里是我使用 gunicorn 来启动 Django 应用,而 PYTHON_VERSION
则是用来设定具体的 Python 版本,这里我根据我自己的需求,选择了 Python 3.11.4。
databases:
- name: linuxondjango-db
databaseName: mysite
user: mysite
plan: free
services:
- type: web
name: linuxondjango
plan: free
runtime: python
buildCommand: "./build.sh"
startCommand: "gunicorn linuxondjango.wsgi:application"
envVars:
- key: DATABASE_URL
fromDatabase:
name: linuxondjango-db
property: connectionString
- key: SECRET_KEY
generateValue: true
- key: WEB_CONCURRENCY
value: 4
- key: PYTHON_VERSION
value: 3.11.4
Code language: PHP (php)
总结
Render 的教程总体来说没啥大问题,但是在一些小的点上,需要你自己简单 Hack 一下,比如需要自己升级一下 Poetry、设定 Python 版本。如果你也在用高版本的 Django & Render,希望这篇文章 可以帮到你。