zoukankan      html  css  js  c++  java
  • Python: Windows 10上用Apache部署Django(含多端口映射多个Django网站)

    最近有个Django项目需要部署,因为是需要在server上使用Office 365,所以时候用Win 10的机器来做server部署。

    在网上找了一圈如何在Win 10上部署Django的教程,基本上都是用基于IIS来部署,然后就开始各种折腾,最后总是不能部署成功,访问的时候总是访问不了,但是步骤从头到尾和网上教程一模一样,然后就是漫长的各种debug,始终无解,最后终于放弃。后来看到有用Apache来部署的方法,就尝试了下,果然方便又快捷,特此记录,供有缘人参考。

    一、系统环境信息:

    OS: Win 10 64bit

    Python: 3.9.6

    Django:

    二、Apache的安装配置

    Apache HTTP server网址:The Apache HTTP Server Project

    但是现在官网上只提供source code,不提供安装文件需要从其他网站上下载,官方提供了4个可以下载windows Apache的网址,不过还是建议从Apache Lounge上获取,因为后面需要用的mod_wsgi文档中建议从该网址获取。

    本人下载的文件是:httpd-2.4.48-win64-VS16.zip

    下载到本地后,只用解压缩即可,按照个人习惯放在C:Apache24路径下。

    此时,直接运行httpd.exe文件即可启动HTTP server,在浏览器中输入127.0.0.1会显示:It works!

    网上有很多教程是教大家以service的形式启动,也可以,不过在实践过程中,如果Django项目中需要调用其他python文件的结果来处理的时候,会一直无法成功,后来发现以进程形式启动HTTP server就没有此问题,个人倾向用进程启动。官方2个方法都有提到,有兴趣的同学可以直接看官方文档:Using Apache HTTP Server on Microsoft Windows

    三、Django配置

    首先安装mod_wsgi,网上很多是进入,下载相应版本mod_wsgi Python的插件来安装,此方法也可行,但是该网站中的whl文件经常性无法下载。

    看了mod_wsgi官网上信息,建议用pip install mod_wsgi方式来安装。

    结果在安装的过程中提示error: Microsoft Visual C++ 14.0 or greater is required. 按照提示中的路径下载build tools后安装。WindowsCompilers - Python Wiki结果在安装的过程中提示error: Microsoft Visual C++ 14.0 or greater is required. 按照提示中的路径下载build tools后安装。

    安装VC++的时候参考的是python wiki中要求,勾选了相应的文件进行安装。

    安装完成后,再次用pip install mod_wsgi即可安装成功。

    然后运行 mod_wsgi-express module-config 来获取配置信息,至此,mod_wsgi安装成功。

    接下来配置Django项目设置:

    把Django项目(eg: project_name)拷贝到该服务器机器上,例如:C:Projectsproject_name,在拷贝之前先把项目依赖库保存到requirements.txt中,用命令:

    pip freeze > requirements.txt

    然后在服务器机器上通过命令来安装依赖库

    pip install -r requirements 

    方法一:针对单项目单端口配置:

    打开Apache中httpd.conf文件,把ServerName启用,然后在文件末尾处添加Django项目配置信息,如下:

    ServerName 127.0.0.1
    Listen 80
    ...
    
    # 运行mod_wsgi-express module-config后的三行文字拷贝过来
    LoadFile "c:/python39/python39.dll"
    LoadModule wsgi_module "c:/python39/lib/site-packages/mod_wsgi/server/mod_wsgi.cp39-win_amd64.pyd"
    WSGIPythonHome "c:/python39"
    
    # 项目中用到了Pandas(使用numpy的依赖,numpy的底层是C),加入以下代码强制使用第一个子解释器
    WSGIApplicationGroup %{GLOBAL}
    
    #设置工程中的wsgi路径
    WSGIScriptAlias / C:projectsproject_nameproject_namewsgi.py
    #设置工程路径
    WSGIPythonPath C:projectsproject_name
    #设置wsgi路径
    <Directory C:projectsproject_nameproject_name>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
    #设置静态文件路径
    Alias /static C:projectsproject_namestatic
    <Directory C:projectsproject_namestatic>  
        AllowOverride None
        Options None
        Require all granted
    </Directory>

    如果使用mysql可能会遇到报错:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required;

    可以直接简单粗暴,修改版本号,在setting.py的__init__.py里面加入如下代码:

    import pymysql
    pymysql.version_info = (1, 4, 13, "final", 0)
    pymysql.install_as_MySQLdb()  # 使用pymysql代替mysqldb连接数据库

    这样,运行httpd.exe就可以正常访问网站了: 127.0.0.1。

    方法二:针对多项目多端口配置:

    打开Apache中httpd.conf文件,把ServerName和端口号监听启用,然后在文件末尾处添加Django项目配置信息,如下:

    ServerName 127.0.0.1
    Listen 80
    Listen 8000
    ...
    
    # 运行mod_wsgi-express module-config后的三行文字拷贝过来
    LoadFile "c:/python39/python39.dll"
    LoadModule wsgi_module "c:/python39/lib/site-packages/mod_wsgi/server/mod_wsgi.cp39-win_amd64.pyd"
    WSGIPythonHome "c:/python39"
    
    # 项目中用到了Pandas(使用numpy的依赖,numpy的底层是C),加入以下代码强制使用第一个子解释器
    WSGIApplicationGroup %{GLOBAL}
    
    # 一个VirtualHost表示一个Django项目网站
    <VirtualHost *:80>
        ServerName 127.0.0.1
        ErrorLog "logs/project_name-error.log"
        CustomLog "logs/project_name-access.log" common
     #设置工程中的wsgi路径
        WSGIScriptAlias / C:projectsproject_nameproject_namewsgi.py
     #设置wsgi路径
        <Directory C:projectsproject_nameproject_name>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>
     #设置静态文件路径
        Alias /static C:projectsproject_namestatic
        <Directory C:projectsproject_namestatic>  
            AllowOverride None
            Options None
            Require all granted
        </Directory>
     # 设置项目根目录
        DocumentRoot "C:projectsproject_name"
        <Directory "C:projectsproject_name">
            Options Indexes FollowSymLinks
            AllowOverride None
            Require all granted
        </Directory>
    </VirtualHost>
    
    <VirtualHost *:8000>
        ServerName 127.0.0.1
        ErrorLog "logs/test-error.log"
        CustomLog "logs/test-access.log" common
     #设置工程中的wsgi路径
        WSGIScriptAlias / C:TestProjectsproject_nameproject_namewsgi.py
     #设置wsgi路径
        <Directory C:TestProjectsproject_nameproject_name>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>
     #设置静态文件路径
        Alias /static C:TestProjectsproject_namestatic
        <Directory C:TestProjectsproject_namestatic>  
            AllowOverride None
            Options None
            Require all granted
        </Directory>
     # 设置项目根目录
        DocumentRoot "C:TestProjectsproject_name"
        <Directory "C:TestProjectsproject_name">
            Options Indexes FollowSymLinks
            AllowOverride None
            Require all granted
        </Directory>
    </VirtualHost>

    同时需要在每个Django项目的wsgi.py文件中添加2行代码,不然会报Internal Server Error

    import sys
    
    sys.path.append('C:Projectsproject_name')

    添加完后wsgi.py文件内容如下:

    import os
    
    from django.core.wsgi import get_wsgi_application
    import sys
    
    sys.path.append('C:Projectsproject_name')
    
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings")
    
    application = get_wsgi_application()

    这样,运行httpd.exe就可以正常访问2个网站了: 127.0.0.1 和 127.0.0.1:8000。

     

    倘若想在局域网下访问该站点,可新建入站规则来控制端口的访问:打开Window防火墙 -> 点击 入站规则 -> 新建规则 -> 选择 端口 -> 选择TCP(默认选项),在特定本地端口中输入要开放的端口,直接下一步到结束即可。

  • 相关阅读:
    代码之美
    一点对互联网的浅薄理解
    angularjs填写表单
    一种通用数据采集的schema定义形式
    maven常用命令
    find which process occupy the PORT
    Mac上安装boost开放环境
    codeforces 581B Luxurious Houses
    codeforces 599A Patrick and Shopping
    codeforces 597A Divisibility
  • 原文地址:https://www.cnblogs.com/danvy/p/14959800.html
Copyright © 2011-2022 走看看