如果你只在开发环境部署Django,你可以跳过这个部分,但是如果你要在生产环境部署Django并且将它真正面向网络开放,你最好先看看这篇文章。你可以只看注意事项,最后部署时再仔细研究,但我希望通过这篇文章你能知道Apache下的Django需要注意哪些内容。同时,Django不止能通过Apache部署,Nginx+nWSGI也是个好方法,但是我只会讲到Apache。
Apache是一个Web服务器软件,而mod_wsgi是一个连接Python和Apache的模块。
我们知道,Django自带一个小型的开发服务器runserver,那么为什么不直接使用它呢?
“Now’s a good time to note: don’t use this server in anything resembling a production environment. It’s intended only for use while developing. (We’re in the business of making Web frameworks, not Web servers.)” ——来自Django的官方网站
“DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through security audits or performance tests.” ——也是来自Django的官方网站
综上所述,runserver并没有经过性能和安全测试,而且开发者也不是这方面的专家。如果你要真正部署你的Web服务,用这样的未经测试的服务器显然是不够的。而且在关掉setting文件里的DEBUG时,runserver将会停止静态文件服务(如果命令行运行时添加—insecure则不会),而打开DEBUG会将错误信息直接显示给客户端,显然这是极其不安全的。
-如果pip命令不能安装mod_wsgi,就要通过直接下载文件安装(如果你使用的网络跟我的一样糟糕以后你会习惯的),记得检查whl文件的版本(我记得版本不对会有报错来着,但是以防万一还是看看吧)
-安装whl文件的时候不要贪方便改名,虽然是常识但是我怕有人真干这种事
-Apache的位数要和Python的位数一致
https://www.apachehaus.com/cgi-bin/download.plx 官网下载
箭头所指的是位数版本和镜像链接 点开就会开始下载
下载完毕之后,直接解压到你要存放的目录下就行了,然后打开conf文件夹下的httpd.conf,待会要修改这个文件。
有条件的可以直接pip,没有条件的可以打电话投诉运营商然后下载whl文件手动安装。
http://www.lfd.uci.edu/~gohlke/pythonlibs/ 这个网站可以下载很多Python模块,建议收藏
下载完毕后复制文件到Python目录下的Scripts文件夹内,并在此处运行cmd,输入 pip install “你的whl文件名” 在提示安装成功之后输入 mod_wsgi-express module-config 然后将返回的三行内容复制粘贴到刚才打开的httpd.conf文件下方。
在conf文件最下方加上以下内容:
django工程下的wsgi.py路径
WSGIScriptAlias / 工程路径\wsgi.py
django工程路径
WSGIPythonPath 工程路径
django工程下的wsgi路径
<Directory 工程路径>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
静态文件路径
Alias /static 工程路径\静态文件夹,默认是static,在setting.py里设置
<Directory 工程路径\静态文件夹>
AllowOverride None
Options None
Require all granted
</Directory>
找到Define SRVROOT,把后面的部分改成Apache的安装目录。
本步骤需要在项目建立完成后执行。
在django项目的settings.py文件中添加 STATIC_ROOT = os.path.join(BASE_DIR, 'static')
在django项目下运行cmd,输入命令python manage.py collectstatic,将静态文件收集到静态文件夹里。
-Apache运行的Django工程的工作目录是Apache的目录,也就是如果你要直接引用文件,最好把Django项目本身的目录静态存储起来。
-记得关掉settings.py里的DEBUG。
-Apache安装的服务作为windows服务运行,只要你把它设置开启,并且你的服务器是开着的,你的Web项目就在运行中。