Django官方文档
django 在开发中和生产中使用是有区别的。开发中为了利于调试,一些错误等问题会直接展示,而生产中则不允许。另外开发模式一般使用本机调试,生产环境则会结合 ngnix 、静态资源服务器等进行部署。还有一些零零总总的问题,这里集中一下
在项目配置文件 settings.py
中,DEBUG 就是配置是否只用开发模式,否即使用生产模式。
开发模式一般为了方便调试,允许任何访问行为,而生产模式一般只允许特定域名或特定IP访问。
在配置文件 settings.py
中的 ALLOWED_HOSTS 配置允许访问列表。例如
ALLOWED_HOSTS = ['*'] if DEBUG else ['allowed.com.cn']
开发模式中,django 会在所有允许的目录中查找静态资源,而生产模式则会将所有静态资源整合迁移至指定目录(或静态资源服务器)。
在 settings.py
中,开发模式设置 STATICFILES_DIRS 列表,django 会在所有 app 目录下的 static 目录和列表中的目录中查找静态资源。生产模式中设置 STATIC_ROOT 指向指定目录,只在此目录中查找静态资源,并且设置静态资源url: STATIC_URL,则可以在 url 中访问静态资源。在生产模式中可以使用 python manage.py collectstatic
命令将所有静态资源迁移到此目录中。
详细的设置可以查看 Django框架(一)中,快速上手下的静态文件。
django 在执行时,会创建监控进程,使得代码修改后可以立即重新加载。这在调试模式非常方便,但是生产模式则会造成额外的开销。所以一般生产环境会用 uWSGI
。WSGI (Web Server Gateway Interface) Web服务器网关接口,是python应用程序或框架和web服务器之间的一种接口,被广泛使用。uWSGI是WSGI的一种,它实现了http协议、WSGI协议以及uwsgi协议。
如何用 uWSGI 托管 Django官方文档
在网站使用中,经常会遇到 400、403、404、500 等错误,也可以在视图中手动抛出这些错误:
# views.py
from django.http import Http404
from django.core.exceptions import PermissionDenied
def test(request):
raise Http404('手动抛出404')
# raise PermissionDenied('手动抛出403')
django 遇到这些错误,在调试模式会给出一些错误信息,在生产模式则会返回一个错误页面。也可以手动定义处理视图来处理这些HTTP错误。
首先定义错误处理视图,可以在处理视图中返回一个模板页面
def handler404(request, exception=None): # 400、403、500 也是一样,需注意的是 500 没有参数 exception
return render(request, 'error-404.html')
然后需要在 urls.py 中定义使用的处理函数
# urls.py
handler404 = 'views.handler404'
handler500 = 'views.handler500'
handler403 = 'views.handler403'
handler400 = 'views.handler400'
需注意的是,自定义的处理视图只在生产模式中使用,调试模式并不使用这些自定义的视图来处理错误。