文章来源Python Django+SQL+Pandas+Pyecharts自建在线数据分析平台(一)
作者ccpic
感谢:感谢作者 ccpic 分享的优质内容,本网页主要用于学习知识的存档备份,欢迎点击原网页支持作者。

(一)需求分析&技术实现

(二)初步搭建Django环境

(三)页面布局&Django模板

(四)SQL+Pandas初步处理数据

(五)前端表单交互

(六)Ajax异步传参与加载

(七)前端数据格式的处理

(八)DataTables接管前端表格

(九)Pyecharts实现交互图表

(十)静态图表的展示

(十一)“导出数据至Excel”功能

(十二)添加和配置缓存

(十三)用户登录系统

本文志在完成系列文章的最后一章。

部署到生产环境这回事以及背后的原理对我来说就真的是知识盲区了,只能做到知其然而不知其所以然。所以我们会很应用式地进行完这一章。

而且因为二手程序员的缘故,本文的部署环境也会以Windows为例。至于为什么选用Apache而不是别的Nginx什么的,纯粹是因为直接就用了,之前没有认真评估。在之后的学习和research中,能浅显地得出Apache更稳定而Nginx性能更好的说法,实际两者的技术差异还是蛮大的,但不在我的学习范围之内了。

总的来说部署Django有以下三大步骤:

1、修改工程settings更符合生产环境

2、处理静态文件

3、配置Apache和mod_wsgi

在我们工程settings.py文件里,原本有这样一串随机码:

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'qteh2xx_xz#z#keg0%*++%yo%)n2nn27!ogxk5#2z%4*k57^s)'

这是用于CRSF token等的大随机值,生产环境中出于安全考虑不应该将其再置于settings.py中。

推荐的做法是在相同目录新建一个env.json文件,将SECRET_KEY写入此json文件中,包括其他一些隐私信息如服务器连接字符串也应置于此。而settings.py或其他需要调用处应改写为:

with open ('env.json', 'r', encoding='utf-8') as env:
ENV_CONST = json.load(env)

SECRET_KEY = ENV_CONST['SECRET_KEY']

接着,修改DEBUG变量:

DEBUG = False

并在ALLOWED_HOST中加入生产环境的域名或IP:

ALLOWED_HOSTS = ['.xxx.com', 'xx.xx.xx.xx', '127.0.0.1', 'localhost']

心大的可以这么写:

ALLOWED_HOSTS = ['*']

接下来处理静态文件,我们需要在terminal运行一下下方的命令:

python manage.py collectstatic

但是可能会返回下面的错误:

根据末行的提示,很显然,我们需要在settings.py里再增加一个STATIC_ROOT:

STATIC_ROOT = os.path.join(BASE_DIR + "/static")

这时我们的settings里面可能同时有STATIC_URL,STATICFILES_DIRS和STATIC_ROOT,这让我们感到很困惑。他们的区别是:

  • STATIC_ROOT是collectstatic命令把所有引用静态文件收集后目录的绝对位置
  • STATIC_URL则提供静态文件的基本 URL 位置,在本地或在CDN上。主要用在我们base模板中的{% load static %} tag
  • STATICFILES_DIRS不同的Django版本不一样,在很老的版本中起到的是STATIC_URL的作用,在更新的版本中似乎是当静态文件目录不是一个时,用来列出主目录外放置静态文件的其他目录

增加了STATIC_ROOT后,别忘了正确运行一次collectstatic命令。

接下来开始安装mod_wsgi,windows环境下一定要在著名的https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod\_wsgi下载对应版本,再用pip手动安装。

安装成功后在terminal输入:

mod_wsgi-express module-config

复制下返回的字符串,这是将来要写入Apache配置文件中的。

最后安装并配置Apache,我用的是2.4版本。

下载后解压在一个文件夹内不用安装,类似一个portable的app。我们用任意编辑器编辑\Apache24\conf\httpd.conf这个文件。

首先修改Apache的配置部分:

# Apache文件夹的绝对位置
Define SRVROOT "D:/web/Apache24"
ServerRoot "${SRVROOT}"
# 填写监听端口
Listen 8080
# ServerName填写域名,未备案的填写外网访问地址
ServerName xx.xx.xx.xx:8080

接下来在文件末尾加入下方片段配置Django部分:

##--------------- Django项目部署配置 ---------------##
# 声明项目根目录变量,为了下方引用
Define DjangoRoot "C:\Users\Administrator\PycharmProjects\datasite"

# 添加"mod_wsgi.so"模块,这三行是之前mod_wsgi-express module-config命令返回的结果
LoadFile "c:/users/administrator/appdata/local/programs/python/python38/python38.dll"
LoadModule wsgi_module "c:/users/administrator/appdata/local/programs/python/python38/lib/site-packages/mod_wsgi/server/mod_wsgi.cp38-win_amd64.pyd"
WSGIPythonHome "c:/users/administrator/appdata/local/programs/python/python38"

# 指定项目的"wsgi.py"配置文件路径
WSGIScriptAlias / "${DjangoRoot}/datasite/wsgi.py"

# 真正的指定Django项目根目录,并配置访问权限。
WSGIPythonPath "${DjangoRoot}"
<Directory "${DjangoRoot}">
Require all granted
</Directory>

# 项目静态文件配置
Alias /static "${DjangoRoot}/static"
<Directory "${DjangoRoot}/static">
AllowOverride None
Options None
Require all granted
</Directory>

# 项目media文件配置, 用户上传图片等媒体文件
Alias /media "${DjangoRoot}/media"
<Directory "${DjangoRoot}/media">
AllowOverride None
Options None
Require all granted
</Directory>

这里有个Apache24配置Django含Pandas包时的bug,如果上方配置完毕后测试访问出现无响应,请在配置里再加上下面这句:

WSGIApplicationGroup %{GLOBAL}

配置好文件后,在\Apache24\bin下,可以安装Apache服务:

httpd -k install -n Apache

或者临时启动一次Apache:

httpd

我们的部署都可以宣告完成了~