部署所需的软件已经存放到: 大头橙 · 资源收藏 -> 工作 -> 部署所需要的软件 -> Django 部署
Django 部署到 IIS 服务器
1. 服务器部署
环境:
- Windows Server 2012
- Python 3.8
- Django
- IIS
1.1. 安装
1.1.1. 安装 IIS
- 服务器管理器
- 安装 IIS
- 添加角色和功能
- 勾选 Web 服务器(IIS)
- 一路下一步,安装成功后“关闭”
- 安装 CGI
- 添加角色和功能
- 点击 Web 服务器(IIS)-> Web 服务器 -> 应用程序开发 -> 勾选 CGI
- 一路下一步,安装成功后“关闭”
- 安装 IIS
- 浏览器检测: [http://127.0.0.1/]
1.1.2. 安装 Python
- 官网下载64位安装包:
[https://www.python.org/downloads/windows/](https://www.python.org/downloads/windows/) - C盘建立 python 文件夹,用于存放
- 安装包安装 Python
- 勾选 Add Python 3.8 to PATH
- Customize installation
- cmd测试:输入
python
1.1.3. 安装 wfastcgi
在 Windows 下,没法使用 uwsgi,但可以用 wfastcgi 替代
- cmd
pip install wfastcgiwfastcgi-enable启动 wfastcgi
- 在显示结果中,保存 Python 路径和 wfastcgi 路径
c:\python\python.exec:\python\lib\site-packages\wfastcgi.py
1.1.4. 安装 MySQL
- 安装 MySQL:
- 安装 MySQL 5.7 64x msi(MySQL 5.7 x86 msi community 300多M):
[https://dev.mysql.com/downloads/mysql/](https://dev.mysql.com/downloads/mysql/) - Choosing a Setup Type:Developer Default
- Check Requirements
- 先 Execute 安装所需的项目
- Manual 为手动解决项,解决完后点击 check
- 下一步时弹出对话框,点击 Yes
- Type and Networking:Config Type -> 选择 Server
- Apply Configration:Execute
- 安装 MySQL 5.7 64x msi(MySQL 5.7 x86 msi community 300多M):
- 遇到 0xc000007d 错误:
- 安装 Visual C++ Redistributable Packages for Visual Studio 2013
[https://www.microsoft.com/en-us/download/details.aspx?id=40784](https://www.microsoft.com/en-us/download/details.aspx?id=40784)【无用】 - 安装 Microsoft .NET Framework 4:
[https://www.microsoft.com/en-us/download/confirmation.aspx?id=17113](https://www.microsoft.com/en-us/download/confirmation.aspx?id=17113)【显示已经安装】 - 安装 vcredist_x64:
[http://soft.onlinedown.net/soft/578449.htm](http://soft.onlinedown.net/soft/578449.htm),否则安装 MySQL 时会出错 【无用】 - 安装 DirectX 修复工具 3.9 标准版,下载地址
[https://www.onlinedown.net/soft/120082.htm](https://www.onlinedown.net/soft/120082.htm)【无用】 - DirectX 修复工具中,工具 -> 选项 -> 扩展 【无用】
- 再次打开 DirectX 修复工具 检测【OK】
- 安装 Visual C++ Redistributable Packages for Visual Studio 2013
- 继续安装 MySQL:
- Connect To Server:检测是否可连接
- Apply Configration:Execute
- 配置:
- 环境变量:
- 找到 MySQL 安装位置,一般在:
C:\Program Files\MySQL\MySQL Server 5.7 - 我的电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量 -> 新建:
- 变量名:
MYSQL_HOME - 变量值:
C:\Program Files\MySQL\MySQL Server 5.7 - 找到
Path,输入;%MYSQL_HOME%\bin
- 变量名:
- 找到 MySQL 安装位置,一般在:
- 打开 cmd 输入
mysql -u root -p测试 - 更换默认编码:
- 打开安装目录
C:\Program Files\MySQL\MySQL Server 5.7建立my.ini - 复制
my.cnf文件内容进入(在 “my.rar”) - 重启 MySQL(右下角)
- 打开 cmd 输入
mysql -u root -p,进入 MySQL 后输入:SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; - 查看如果有不是 utf8mb4/utf8 的,直接使用 SQL 语句修改,比如:
set collation_database = utf8mb4_general_ci; - 之后再输入 序号4 校验
- 打开安装目录
- 环境变量:
1.2. 配置 FTP
- 安装 Filezilla Server
[https://filezilla-project.org/download.php?type=server](https://filezilla-project.org/download.php?type=server) - 基础配置(FTP over TLS)
- Connect
- Edit > Settings
- General Settings: Listen on these ports: 14149
- FTP over TLS settings:
- 勾选 Enable…
- 勾选 Disallow plain…
- Generate new certificate…
- 4096 bit
- Fill all blanks(其中 Common name 就是当客户端连接时的 Hostname,两个相同)
- Browse…
- Generate certificate
- 填写 Key password
- Listen for implicit…: 14148
- Passive mode settings
- Use custom…: 14140-14146
- Use the following…: 服务器ip
- OK
- 设置端口 14140-14149 为开放
- 设置用户 Edit > Users
- General: Add, Password
- Shared folders: Add, 权限
- OK
- 客户端
- Host, Port: 14149
- Use explicit FTP over TLS if available
- Normal, username, password
- Transfer Settings: Passive
- Connect
- 勾选以后都信任
可能的问题
- You appear to be behind a NAT router. Please configure the passive mode settings and forward a range of ports in your router.
- Edit > Setting > Passive mode settings
- Use the following IP: 服务器的IP
- 响应: 425 Can’t open data connection for transfer of “/“
- Edit > Setting > Passive mode settings
- 设置 Use custome port range
- 更新防火墙规则
- Warning: FTP over TLS is not enabled, users cannot securely log in.
- Edit > Setting > FTP over TLS settings”选项卡,点击“
- Generate new certificate…
1.3. 网站转移
1.3.1. 环境和数据库(目标:本地服务器可运行)
- 本地准备(网站文件)
- Terminal 切换到项目目录,运行
pip3 freeze > requirements.txt把当前项目环境的软件包信息和依赖软件导出到requirements.txt文件里。 - 打包项目,并上传到服务器
- Terminal 切换到项目目录,运行
- 服务器
- 解压到 IIS 网站目录内
- cmd 切换到项目目录,运行
pip install -r requirements.txt安装依赖软件,需要手动安装某些软件:- pymysql
pip install pymysql - xlrd
- requests
- Pillow
pip install Pillow
- pymysql
- 数据库转移(下载 Navicat:
[https://www.cr173.com/soft/942886.html](https://www.cr173.com/soft/942886.html))- 打包本地 MySQL
- 导入到服务器 MySQL
- 修改 Django 源文件
- 找到 Django 位置:cmd
python -c "import django; print(django.__path__)" /django/db/backends/mysql/base.py修改对照 ### Django base.py/django/db/backends/mysql/operation.py修改对照 ### Django operation.py
- 找到 Django 位置:cmd
- 在项目目录下测试 cmd:
python manage.py runserver(运行的是本地服务器)
1.3.2. IIS 和系统设置(目标:网站本地可访问)
- 项目根目录,建立 web.config,内容参考 ### web.config
- 如果是 IIS 7.0+ cmd 运行以下两句:
%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules
- 打开 IIS -> 网站 -> 网站上右键 -> 编辑权限 -> 对 Users 赋予权限
1.3.3. ALLOW_HOSTS 和静态资源(目标:网站完全可访问)
- settings.py 中 ALLOW_HOSTS 添加对应域名、IP
- 静态资源虚拟目录:
- 设置好 STATIC_ROOT 就可以在 cmd 进行静态文件整合
python manage.py collectstatic - IIS中:网站 -> 右键 -> 添加虚拟目录
- 对应 settings.py 中设置的:
- STATIC_URL -> 别名
- STATIC_ROOT -> 物理路径
- static 文件夹中建立 web.config,内容参考 ### static web.config

- 设置好 STATIC_ROOT 就可以在 cmd 进行静态文件整合
- 重启 IIS:开始 -> 运行:
iisreset - 上面对于静态资源的设置,同样用来设置上传目录(media别名,upload文件夹所在路径)
本地项目和服务器上项目区别
- 服务器上项目多了 web.config
- 修改 static 后,要传到根目录下的 static
- settings.py
- 本地
DEBUG = True,服务器为False - 本地
TEMPLATE_DEBUG = True,服务器为False - 服务器设置了
ALLOWED_HOSTS
- 本地
所以,修改的话,继续本地测试,然后传文件到服务器,运行 iisreset 来更新即可。
不上传 settings.py,直接在服务器上或本地修改。
2. 要修改的代码集合
2.1. Django base.py
## 第一个操作:搜索 get_connection_paramsdef get_connection_params(self):kwargs = {'conv': django_conversions,## 'charset': 'utf8','charset': 'utf8mb4',}## 第二个操作:搜索 ImproperlyConfigured 找到以下内容注释掉:## version = Database.version_info## if version < (1, 3, 13):## raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
2.2. Django operation.py
## 搜索:errors='replace'if query is not None:## query = query.decode(errors='replace')query = query.encode(errors='replace')
2.3. web.config
<?xml version="1.0" encoding="UTF-8"?><configuration><system.webServer><handlers><add name="Python FastCGI"path="*"verb="*"modules="FastCgiModule"scriptProcessor="<Path to Python>\python.exe|<Path to Python>\lib\site-packages\wfastcgi.py"resourceType="Unspecified"requireAccess="Script"/></handlers></system.webServer><appSettings><add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" /><add key="PYTHONPATH" value="<Path to Django App>" /><add key="DJANGO_SETTINGS_MODULE" value="<Django App>.settings" /></appSettings></configuration>
修改的内容包括:
<Path to Python>Python 路径<Path to Python>wfastcgi.py 路径<Path to Django App>Django 项目路径<Django App>settings.py 所在目录名
2.4. static web.config
<?xml version="1.0" encoding="UTF-8"?><configuration><system.webServer><!-- this configuration overrides the FastCGI handler to let IIS serve the static files --><handlers><clear/><add name="StaticFile" path="*" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" /></handlers></system.webServer></configuration>
其他问题
Django Session 失效
- 设置
SESSION_SAVE_EVERY_REQUEST = True,只有设置了这个,才能让下面两个常量生效 SESSION_EXPIRE_AT_BROWSER_CLOSE- 设置为True,当浏览器关闭时 Session 自动失效(手机、PC)
- 设置为False,保持 Session,时长根据下面这个常量
SESSION_COOKIE_AGE,设置 cookie 在浏览器中存活的时间,单位秒(SESSION_EXPIRE_AT_BROWSER_CLOSE为True时无效)
