
Django应用上线前的注意事项
首先在整个应用上线前,应该有完整的单元测试去测试各模块的功能。通常需在写代码的过程中甚至之前需要写好单元测试,以便高效维护代码的设计结构。我们可以使用Python自带的UnitTest或者Django的TestCase,这里介绍下Django的TestCase。下图为Django TestCase的几个重要的基类:

from django.test import TestCase
class MyTestCase(TestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
# 具体处理类的代码实现
@classmethod
def tearDownClass(cls):
# 具体处理类的代码实现
super().tearDownClass()
def setUp(self):
pass
def tearDown(self):
pass
def test_something_that_will_pass(self):
self.assertFalse(False)setUpClass和tearDownClass 分别是在整个类加载的时候去运行setUp做一些准备工作,等到类下的所有TestCase运行完后再运行tearDown做清理。测试用例为test头的文件,会一个个执行。
setUp和tearDown方法是对一个运行的实例,即class运行单次测试前后做的处理。
建议在每个应用下增加testcase的package,在包下放几个测试用例:
job/
/testcase/
__init__.py
test_forms.py
test_views.py比如Dajngo自带的ORM功能是不需要测试的;自己写的代码需要做单测。
# 运行项目下面所有 test
$python manage.py test
# 测试指定模块
$python manage.py test jobs.testcase
# 测试单个模块中的文件
$python manage.py test jobs.testcase.test_views
# 指定类
$python manage.py test jobs.testcase.test_views.JobTests
# 测试指定方法
$python manage.py test jobs.testcase.test_views.JobTests.test_detail
url请求进来后先到Nginx 服务器,由Nginx 服务器去做后端的路由转发(proxy_pass)把请求的URL代理到后端,后端处理完动态内容再返回给前端;同时也提供了静态资源服务的功能。
必须要调整的关键配置:
密钥的存储和管理:
import os
DEBUG = False
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'xxxxxx')
ALLOWED_HOSTS = ["127.0.0.1", "recruit.ihopeit.com", ]自己部署的KMS系统
云服务的KMS服务:阿里云/AWS的KMS服务
python manage.py check --deploy
4、部署到生产环境:
选择静态资源文件的托管环境:可以使用Apache / Nginx / CDN服务器。
Django自带collectstatic工具,用来将整个站点需要用到的静态资源(如:CSS/JS/图片等)全部收集起来,放到项目工程的STATIC目录下,该目录可直接通过web服务器(如Nginx)开放出去,或者上传到CDN服务器,让CDN回源到服务器上的这个目录,从而找到静态资源文件。
python manage.py collectstatic --settings=settings.local# settings/base.py
STATIC_URL = '/static/'
STATIC_ROOT = 'static'# settings/local.py
# STATIC_URL = 'http://icdn.ihopeit.com/static' # 使用CDN
STATIC_URL = '/static/'同步应用:
异步应用:
异步视图代码如下:
async def view(request):
await asyncio.sleep(0.5)
return HttpResponse("Hello,async world ! ")启动gunicorn(同步):
$ python -m pip install gunicorn
$ export DJANGO_SETTINGS_MODULE=settings.local
$ gunicorn -w 3 -b 127.0.0.1:8000 recruitment.wsgi:application启动3个worker进程,绑定到本机的8000端口
启动Uvicorn(异步):
$ python -m pip install uvicorn
$ export DJANGO_SETTINGS_MODULE=settings.local
$ uvicorn recruitment.asgi:application --workers 3 --host 127.0.0.1 --port 8000注意:
1、启动应用容器是不提供静态资源服务的。生产环境中将提供静态资源服务的功能放在前端的Web服务器上去的,比如Nginx Tengine或者是Apache上,再对于其它的动态请求做URL路由分发转发到后端的容器服务。
2、在使用异步容器的时候,代码里不能直接使用同步代码,所有的调用都应该是异步的。Django中自带的类是有做兼容处理的,会默认将同步调用转为异步调用,但有些第三方插件未做兼容的话会报错。