部署所需的软件已经存放到: 大头橙 · 资源收藏 -> 工作 -> 部署所需要的软件 -> 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 wfastcgi
wfastcgi-enable
启动 wfastcgi
- 在显示结果中,保存 Python 路径和 wfastcgi 路径
c:\python\python.exe
c:\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_params
def 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时无效)