部署所需的软件已经存放到: 大头橙 · 资源收藏 -> 工作 -> 部署所需要的软件 -> Django 部署

Django 部署到 IIS 服务器

1. 服务器部署

环境:

  1. Windows Server 2012
  2. Python 3.8
  3. Django
  4. IIS

1.1. 安装

1.1.1. 安装 IIS

  1. 服务器管理器
    1. 安装 IIS
      1. 添加角色和功能
      2. 勾选 Web 服务器(IIS)
      3. 一路下一步,安装成功后“关闭”
    2. 安装 CGI
      1. 添加角色和功能
      2. 点击 Web 服务器(IIS)-> Web 服务器 -> 应用程序开发 -> 勾选 CGI
      3. 一路下一步,安装成功后“关闭”
  2. 浏览器检测: [http://127.0.0.1/]

1.1.2. 安装 Python

  1. 官网下载64位安装包:[https://www.python.org/downloads/windows/](https://www.python.org/downloads/windows/)
  2. C盘建立 python 文件夹,用于存放
  3. 安装包安装 Python
    1. 勾选 Add Python 3.8 to PATH
    2. Customize installation
  4. cmd测试:输入 python

1.1.3. 安装 wfastcgi

在 Windows 下,没法使用 uwsgi,但可以用 wfastcgi 替代

  1. cmd
    1. pip install wfastcgi
    2. wfastcgi-enable 启动 wfastcgi
  2. 在显示结果中,保存 Python 路径和 wfastcgi 路径
    1. c:\python\python.exe
    2. c:\python\lib\site-packages\wfastcgi.py

1.1.4. 安装 MySQL

  1. 安装 MySQL:
    1. 安装 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/)
    2. Choosing a Setup Type:Developer Default
    3. Check Requirements
      1. 先 Execute 安装所需的项目
      2. Manual 为手动解决项,解决完后点击 check
      3. 下一步时弹出对话框,点击 Yes
    4. Type and Networking:Config Type -> 选择 Server
    5. Apply Configration:Execute
  2. 遇到 0xc000007d 错误:
    1. 安装 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) 【无用】
    2. 安装 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) 【显示已经安装】
    3. 安装 vcredist_x64:[http://soft.onlinedown.net/soft/578449.htm](http://soft.onlinedown.net/soft/578449.htm),否则安装 MySQL 时会出错 【无用】
    4. 安装 DirectX 修复工具 3.9 标准版,下载地址 [https://www.onlinedown.net/soft/120082.htm](https://www.onlinedown.net/soft/120082.htm) 【无用】
    5. DirectX 修复工具中,工具 -> 选项 -> 扩展 【无用】
    6. 再次打开 DirectX 修复工具 检测【OK】
  3. 继续安装 MySQL:
    1. Connect To Server:检测是否可连接
    2. Apply Configration:Execute
  4. 配置:
    1. 环境变量:
      1. 找到 MySQL 安装位置,一般在:C:\Program Files\MySQL\MySQL Server 5.7
      2. 我的电脑 -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量 -> 新建:
        1. 变量名:MYSQL_HOME
        2. 变量值:C:\Program Files\MySQL\MySQL Server 5.7
        3. 找到 Path,输入 ;%MYSQL_HOME%\bin
    2. 打开 cmd 输入 mysql -u root -p 测试
    3. 更换默认编码:
      1. 打开安装目录 C:\Program Files\MySQL\MySQL Server 5.7 建立 my.ini
      2. 复制 my.cnf 文件内容进入(在 “my.rar”)
      3. 重启 MySQL(右下角)
      4. 打开 cmd 输入 mysql -u root -p,进入 MySQL 后输入:SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
      5. 查看如果有不是 utf8mb4/utf8 的,直接使用 SQL 语句修改,比如:set collation_database = utf8mb4_general_ci;
      6. 之后再输入 序号4 校验

1.2. 配置 FTP

  1. 安装 Filezilla Server [https://filezilla-project.org/download.php?type=server](https://filezilla-project.org/download.php?type=server)
  2. 基础配置(FTP over TLS)
    1. Connect
    2. Edit > Settings
      1. General Settings: Listen on these ports: 14149
      2. FTP over TLS settings:
        1. 勾选 Enable…
        2. 勾选 Disallow plain…
        3. Generate new certificate…
          1. 4096 bit
          2. Fill all blanks(其中 Common name 就是当客户端连接时的 Hostname,两个相同)
          3. Browse…
          4. Generate certificate
        4. 填写 Key password
        5. Listen for implicit…: 14148
      3. Passive mode settings
        1. Use custom…: 14140-14146
        2. Use the following…: 服务器ip
      4. OK
    3. 设置端口 14140-14149 为开放
  3. 设置用户 Edit > Users
    1. General: Add, Password
    2. Shared folders: Add, 权限
    3. OK
  4. 客户端
    1. Host, Port: 14149
    2. Use explicit FTP over TLS if available
    3. Normal, username, password
    4. Transfer Settings: Passive
    5. Connect
    6. 勾选以后都信任

可能的问题

  • You appear to be behind a NAT router. Please configure the passive mode settings and forward a range of ports in your router.

      1. Edit > Setting > Passive mode settings

      1. Use the following IP: 服务器的IP
  • 响应: 425 Can’t open data connection for transfer of “/“

      1. Edit > Setting > Passive mode settings

      1. 设置 Use custome port range

      1. 更新防火墙规则
  • Warning: FTP over TLS is not enabled, users cannot securely log in.

      1. Edit > Setting > FTP over TLS settings”选项卡,点击“

      1. Generate new certificate…

1.3. 网站转移

1.3.1. 环境和数据库(目标:本地服务器可运行)

  1. 本地准备(网站文件)
    1. Terminal 切换到项目目录,运行 pip3 freeze > requirements.txt 把当前项目环境的软件包信息和依赖软件导出到requirements.txt文件里。
    2. 打包项目,并上传到服务器
  2. 服务器
    1. 解压到 IIS 网站目录内
    2. cmd 切换到项目目录,运行 pip install -r requirements.txt 安装依赖软件,需要手动安装某些软件:
      1. pymysql pip install pymysql
      2. xlrd
      3. requests
      4. Pillow pip install Pillow
  3. 数据库转移(下载 Navicat: [https://www.cr173.com/soft/942886.html](https://www.cr173.com/soft/942886.html)
    1. 打包本地 MySQL
    2. 导入到服务器 MySQL
  4. 修改 Django 源文件
    1. 找到 Django 位置:cmd python -c "import django; print(django.__path__)"
    2. /django/db/backends/mysql/base.py 修改对照 ### Django base.py
    3. /django/db/backends/mysql/operation.py 修改对照 ### Django operation.py
  5. 在项目目录下测试 cmd:python manage.py runserver (运行的是本地服务器)

1.3.2. IIS 和系统设置(目标:网站本地可访问)

  1. 项目根目录,建立 web.config,内容参考 ### web.config
  2. 如果是 IIS 7.0+ cmd 运行以下两句:
    1. %windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers
    2. %windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules
  3. 打开 IIS -> 网站 -> 网站上右键 -> 编辑权限 -> 对 Users 赋予权限

1.3.3. ALLOW_HOSTS 和静态资源(目标:网站完全可访问)

  1. settings.py 中 ALLOW_HOSTS 添加对应域名、IP
  2. 静态资源虚拟目录:
    1. 设置好 STATIC_ROOT 就可以在 cmd 进行静态文件整合 python manage.py collectstatic
    2. IIS中:网站 -> 右键 -> 添加虚拟目录
    3. 对应 settings.py 中设置的:
      1. STATIC_URL -> 别名
      2. STATIC_ROOT -> 物理路径
    4. static 文件夹中建立 web.config,内容参考 ### static web.config 1cc4b7d0-0f95-11eb-9bd3-1baf3a068721.png
  3. 重启 IIS:开始 -> 运行:iisreset
  4. 上面对于静态资源的设置,同样用来设置上传目录(media别名,upload文件夹所在路径)

本地项目和服务器上项目区别
  1. 服务器上项目多了 web.config
  2. 修改 static 后,要传到根目录下的 static
  3. settings.py
    1. 本地 DEBUG = True,服务器为 False
    2. 本地 TEMPLATE_DEBUG = True,服务器为 False
    3. 服务器设置了 ALLOWED_HOSTS

所以,修改的话,继续本地测试,然后传文件到服务器,运行 iisreset 来更新即可。

不上传 settings.py,直接在服务器上或本地修改。

2. 要修改的代码集合

2.1. Django base.py

  1. ## 第一个操作:搜索 get_connection_params
  2. def get_connection_params(self):
  3. kwargs = {
  4. 'conv': django_conversions,
  5. ## 'charset': 'utf8',
  6. 'charset': 'utf8mb4',
  7. }
  8. ## 第二个操作:搜索 ImproperlyConfigured 找到以下内容注释掉:
  9. ## version = Database.version_info
  10. ## if version < (1, 3, 13):
  11. ## raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

2.2. Django operation.py

  1. ## 搜索:errors='replace'
  2. if query is not None:
  3. ## query = query.decode(errors='replace')
  4. query = query.encode(errors='replace')

2.3. web.config

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <system.webServer>
  4. <handlers>
  5. <add name="Python FastCGI"
  6. path="*"
  7. verb="*"
  8. modules="FastCgiModule"
  9. scriptProcessor="<Path to Python>\python.exe|<Path to Python>\lib\site-packages\wfastcgi.py"
  10. resourceType="Unspecified"
  11. requireAccess="Script"/>
  12. </handlers>
  13. </system.webServer>
  14. <appSettings>
  15. <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
  16. <add key="PYTHONPATH" value="<Path to Django App>" />
  17. <add key="DJANGO_SETTINGS_MODULE" value="<Django App>.settings" />
  18. </appSettings>
  19. </configuration>

修改的内容包括:

  1. <Path to Python> Python 路径
  2. <Path to Python> wfastcgi.py 路径
  3. <Path to Django App> Django 项目路径
  4. <Django App> settings.py 所在目录名

2.4. static web.config

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <system.webServer>
  4. <!-- this configuration overrides the FastCGI handler to let IIS serve the static files -->
  5. <handlers>
  6. <clear/>
  7. <add name="StaticFile" path="*" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  8. </handlers>
  9. </system.webServer>
  10. </configuration>

其他问题

Django Session 失效

  1. 设置 SESSION_SAVE_EVERY_REQUEST = True,只有设置了这个,才能让下面两个常量生效
  2. SESSION_EXPIRE_AT_BROWSER_CLOSE
    1. 设置为True,当浏览器关闭时 Session 自动失效(手机、PC)
    2. 设置为False,保持 Session,时长根据下面这个常量
  3. SESSION_COOKIE_AGE,设置 cookie 在浏览器中存活的时间,单位秒(SESSION_EXPIRE_AT_BROWSER_CLOSE为True时无效)