如何在IIS中部署Flask应用程序?

时间:2011-02-21 22:46:28

标签: python iis-6 wsgi flask isapi-wsgi

任何人都可以帮我在IIS 6上运行Flask应用程序吗?我曾尝试使用isapi-wsgi,但是当我访问虚拟目录地址时,我得到一个页面,上面写着“无法找到指定的模块”。还有其他选择吗?

下面是我为isapi-wsgi编写的Python脚本。在IIS管理器中创建了虚拟目录并且一切正常,但该站点无法正常工作。

from wof import app
import os

app.secret_key=os.urandom(24)

import isapi_wsgi
def __ExtensionFactory__():
    return isapi_wsgi.ISAPISimpleHandler(app)

if __name__ == '__main__':
    from isapi.install import *
    params = ISAPIParameters()
    sm = [ScriptMapParams(Extension="*", Flags=0)]
    vd = VirtualDirParameters(Name="WOFPy_Sondes", Description="ISAPI-WSGI for WOFPY Sondes test", ScriptMaps=sm, ScriptMapUpdate="replace")
    params.VirtualDirs = [vd]
    HandleCommandLine(params)

3 个答案:

答案 0 :(得分:50)

高级概述

HTTP - > IIS - > ISAPI - > FastCGI - > WSGI(Flask应用程序)


设置步骤

步骤1:安装必需的二进制文件

  1. 安装Python(2.7或3.x - 我使用3.3)
  2. 安装pip-Win(我使用的是1.6版本)
  3. 安装pywin32(我使用的是版本218)
  4. 使用fcgisetup 1.5
  5. 安装IIS FastCGI扩展程序

    步骤2:安装可选二进制包

    我使用this site中的安装程序.exe安装了pyodbc。从源代码安装(例如pip,用于安装到虚拟环境中)需要C / C ++编译器。

    第3步:获取wfastcgi.py

    的副本

    选择适合您的版本,最好是支持Python 3.3的版本(我使用David Ebbo's)。你可能想要"官方"版本from here

    wfastcgi.py脚本安装到C:\Inetpub\wwwroot,并确保为您的应用程序提供服务的帐户("网络服务"默认情况下)具有读取权限。

    步骤4:将virtualenv安装到System site-packages

    C:\Python33\Scripts\pip.exe install virtualenv
    

    (如果您使用的是Python 3.3并在默认位置安装了所有内容)

    步骤5:安装Flask应用程序

    • 您可以在系统的任何位置安装应用程序。您可能希望在C:\Inetpub下安装它。在本教程中,我们将调用应用程序安装%APPROOT%的根文件夹。 (不要在环境变量中加上引号。)

    • 确保为您的应用程序提供服务的帐户("网络服务"默认情况下)具有对所有脚本文件的读取权限。这个命令:

      cacls "%APPROOT%" /S:"D:PAI(A;OICI;FA;;;BA)(A;OICIIO;FA;;;CO)(A;OICI;0x1200a9;;;NS)(A;OICI;FA;;;SY)"
      

      将为您的应用程序目录提供以下权限:

      • BUILTIN \管理员:完全控制此文件夹,子文件夹和文件
      • CREATOR OWNER:仅对子文件夹和文件进行完全控制
      • NT AUTHORITY \ NETWORK SERVICE:此文件夹,子文件夹和文件的读取权限
      • NT AUTHORITY \ SYSTEM:完全控制此文件夹,子文件夹和文件
    • 添加必要的任何本地配置(我的应用程序使用版本控制系统忽略的local.cnf文件) - 例如数据库网址。

    • 确保您的应用程序在Web.config中包含%APPROOT%文件 - 有关文件格式的信息,请参阅以下部分。

    第6步:为您的应用程序创建virtualenv

    C:\Python33\Scripts\virtualenv.exe --system-site-packages "%APPROOT%\env"
    

    (如果您的应用程序已使用该目录,请选择env以外的名称。)

    步骤7:将应用程序所需的软件包安装到virtualenv

    cd "%APPROOT%"
    env\Scripts\activate
    pip install -r Packages
    

    (我的项目将需求规范保存在名为Packages的文件中。)

    步骤8:为您的应用程序创建网站或虚拟目录

    使用inetmgr.msc开始 - > 运行... ,然后在编辑框中输入inetmgr并按 ENTER )启动 Internet信息服务(IIS)管理器。确保将您创建的节点(网站或虚拟目录)的本地路径设置为Flask应用程序的根文件夹。 wfastcgi.py使用本地路径来标识Flask应用程序以处理请求。

    为节点提供读取和脚本(运行脚本)权限。

    步骤9:配置fcgiext.ini

    此文件与步骤1中安装的fcgiext.dll位于同一目录中(默认情况下为%SYSTEMROOT%\system32\inetsrv)。

    在配置此文件时,您需要几个参数:

    • {site id} :您可以在 Internet信息服务(IIS)管理器的详细信息(右侧)窗格中找到的数字站点ID “是从窗口左侧的树中选择的。
    • {application name} fcgiext.ini中提供FastCGI(ISAPI)处理程序参数的部分的名称。您可以选择此值 - 选择代表您的应用程序的内容。
    • {app app} :对于虚拟目录,网站中的URL路径指向要处理的虚拟目录。
    • {approot} :应用程序根目录的路径。

    使用这些参数:

    • 将FastCGI请求映射到处理部分:

      • 对于整个网站,请将*:{site id}={application name}添加到[Types]部分。
      • 对于虚拟目录,请将*:/lm/w3svc/{site id}/root/{path to app}={application name}添加到[Types]部分。
    • 使用此应用程序的参数(full reference)添加处理部分([{application name}]):

      • ExePath={approot}\env\python.exe
      • Arguments=C:\Inetpub\wwwroot\wfastcgi.py(或安装wfastcgi.py适配器脚本的任何地方)
      • EnvironmentVars=ENV_VAR1:value,ENV_VAR2:value,etc.(请参阅引用规则的完整参考资料)。这是设置WSGI_LOG environment variable的好地方 - 确保为网站提供服务的帐户(默认情况下为“网络服务”)对文件具有写入权限,并且(如果文件不存在)允许添加将文件发送到包含目录。

    步骤10:为目标URL配置FastCGI处理

    使用 Internet信息服务(IIS)管理器,从节点(网站或虚拟目录)的上下文(右键单击)菜单中选择“属性...”以供您使用Flask应用程序和:

    • 在“主目录”标签(网站)或“虚拟目录”标签(虚拟目录)中,单击“配置..."按钮。

    • 在“通配符应用程序映射”部分中,使用“插入..."按钮添加通配符映射:

      • 可执行文件是步骤1中安装的FastCGI扩展DLL。其默认位置为%SYSTEMROOT%\system32\inetsrv\fcgiext.dll
      • 确保“验证文件存在”未选中。 Flask应用程序执行自己的路由,这些路由不一定与磁盘上的文件有任何关系。

    的Web.config

    此文件(在此设置中)由wfastcgi.py读取,不是由IIS读取。

    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
        <applicationSettings>
            <add key=“PYTHONPATH” value=“”/>
            <add key=“WSGI_HANDLER” value=“module.application”/>
        </applicationSettings>
    </configuration>
    
    • <add>元素在Python中添加环境变量(os.environ)。

    • 必须指定
    • WSGI_HANDLER - 它告诉wfastcgi.py如何找到WSGI应用程序对象。如果值以&#34;()&#34;结束,wfastcgi.py将调用命名对象,期望它返回WSGI应用程序对象。

    • PYTHONPATH是专门处理的 - wfastcgi.py%VAR%的值执行(环境)变量扩展(使用Windows标准PYTHONPATH表示法),然后以分号分割结果,并在调用WSGI应用程序之前将条目附加到sys.path。因为wfastcgi.py在导入包含WSGI应用程序对象的模块之前将当前目录更改为指定为网站或虚拟目录的本地路径的路径,所以在PYTHONPATH中包含空字符串将导致搜索包含您的Flask应用程序目录作为起点。您还可以在fcgiext.ini中设置PYTHONPATH(在这种情况下,它由解释器包含在sys.path中,然后再由wfastcgi.py包含)。

    • WSGI_RESTART_FILE_REGEX提供了一个Python正则表达式,用于过滤应该触发FastCGI处理程序进程重启的路径的文件更改通知。设置此选项可在源文件或配置文件更改时触发。我使用(?i).*\.(py|cnf|config)$

    • WSGI_LOG可以在这里设置,但我认为最好在fcgiext.ini设置。


    对于IIS 7

    使用IIS 7,FastCGI的一些变化发生了巨大变化。从这个版本开始,FastCGI直接通过IIS提供支持,而不是通过扩展配置(即步骤1.4不是必需的,fcgiext.ini不能控制FastCGI的行为IIS 7+并且无需创建/编辑它。相反,请确保在控制面板&gt;中的 Internet信息服务下启用 CGI 。节目和特征&gt;打开或关闭Windows功能

    Web.config

    IIS 7是第一个从Web.config文件中读取与FastCGI相关的配置设置的IIS版本。您的Web.config文件需要在<configuration>元素中包含<system.webServer>元素,其中包含<handlers>元素,其中包含<add>元素,其中包含以下属性:

    • 路径:*
    • 动词:*
    • 模块:FastCgiModule
    • resourceType:Unspecified
    • requireAccess:Script
    • scriptProcessor:棘手的

    scriptProcessor属性

    <add>元素的此属性必须包含要使用的Python解释器.exe文件的完整路径(Python virtualenv的Scripts子文件夹中的文件),然后是一个|,然后是您正在使用的wfastcgi.py文件的完整路径。由于这些路径取决于运行应用程序的计算机的设置,因此您可能希望将此属性设置为部署过程的一部分。

    IIS服务器范围的设置

    • inetmgr中,单击树中的服务器节点,然后从中心窗格中选择 FastCGI设置。将出现可执行/参数对的列表。
    • 为您正在使用的python.exewfastcgi.py添加完整路径条目。两者的显示方式应与<handlers>/<add>中的Web.config元素相同。
    • 确保在新的FastCGI应用程序条目中设置PYTHONPATH环境变量,以包含应用程序代码库的根目录。有关在PYTHONPATH的{​​{1}}中添加空<applicationSettings>条目的建议可能不适用于此版本的IIS。

答案 1 :(得分:3)

查看Django关于这个主题的页面。它帮助我建立了一个有效的Django项目,但对于Flask应用程序来说应该不同。

http://code.djangoproject.com/wiki/DjangoOnWindowsWithIISAndSQLServer

答案 2 :(得分:0)

我从不使用IIS,但IIS支持CGI网关,因此您应该能够使用WSGI调整CGI。

IIS <--> CGI <--> WSGI

要将WSGI作为CGI脚本运行,可以使用Python标准库中的CGIHandler