在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 部署方式
應(yīng)用環(huán)境
配置管理
大型應(yīng)用
可插撥視圖
Flask 方案
在 Shell 中使用 Flask
針對(duì)高級(jí)程序員的前言
使用藍(lán)圖的模塊化應(yīng)用
部署方式
信號(hào)
排除應(yīng)用錯(cuò)誤
模板
請(qǐng)求環(huán)境
掌握應(yīng)用錯(cuò)誤
測(cè)試 Flask 應(yīng)用
前言
教程
安裝
快速上手
Flask 擴(kuò)展

部署方式

Flask 應(yīng)用可以采用多種方式部署。在開(kāi)發(fā)時(shí),你可以使用內(nèi)置的服務(wù)器,但是在生產(chǎn)環(huán)境 下你就應(yīng)當(dāng)選擇功能完整的服務(wù)器。下面為你提供幾個(gè)可用的選擇。

除了下面提到的服務(wù)器之外,如果你使用了其他的 WSGI 服務(wù)器,那么請(qǐng)閱讀其文檔中與使用 WSGI 應(yīng)用相關(guān)的部分。因?yàn)?Flask 應(yīng)用對(duì)象的實(shí)質(zhì)就是一個(gè) WSGI 應(yīng)用。

如果需要快速體驗(yàn),請(qǐng)參閱《快速上手》中的部署到一個(gè)網(wǎng)絡(luò)服務(wù)器 。

mod_wsgi (Apache)

如果你正在使用 Apache 網(wǎng)絡(luò)服務(wù)器,那么建議使用 mod_wsgi 。

小心

請(qǐng)務(wù)必把 app.run() 放在 if name == 'main': 內(nèi)部或者放在單獨(dú) 的文件中,這樣可以保證它不會(huì)被調(diào)用。因?yàn)?,每調(diào)用一次就會(huì)開(kāi)啟一個(gè)本地 WSGI 服務(wù)器。當(dāng)我們使用 mod_wsgi 部署應(yīng)用時(shí),不需要使用本地服務(wù)器。

安裝 mod_wsgi

可以使用包管理器或編譯的方式安裝 mod_wsgi 。在 UNIX 系統(tǒng)中如何使用源代碼安裝請(qǐng)閱讀 mod_wsgi 安裝介紹 。

如果你使用的是 Ubuntu/Debian ,那么可以使用如下命令安裝:

# apt-get install libapache2-mod-wsgi

在 FreeBSD 系統(tǒng)中,可以通過(guò)編譯 www/mod_wsgi port 或使用 pkg_add 來(lái)安裝 mod_wsgi :

# pkg_add -r mod_wsgi

如果你使用 pkgsrc ,那么可以通過(guò)編譯 www/ap2-wsgi 包來(lái)安裝 mod_wsgi 。

如果你遇到子進(jìn)程段錯(cuò)誤的話,不要理它,重啟服務(wù)器就可以了。

創(chuàng)建一個(gè) .wsgi 文件

為了運(yùn)行應(yīng)用,你需要一個(gè) yourapplication.wsgi 文件。這個(gè)文件包含 mod_wsgi 開(kāi)始時(shí)需要運(yùn)行的代碼,通過(guò)代碼可以獲得應(yīng)用對(duì)象。文件中的 application 對(duì)象就是以后要使用的應(yīng)用。

對(duì)于大多數(shù)應(yīng)用來(lái)說(shuō),文件包含以下內(nèi)容就可以了:

from yourapplication import app as application

如果你的應(yīng)用沒(méi)有創(chuàng)建函數(shù),只是一個(gè)獨(dú)立的實(shí)例,那么可以直接把實(shí)例導(dǎo)入為 application 。

把文件放在一個(gè)以后可以找得到的地方(例如 /var/www/yourapplication ),并確保 yourapplication 和所有需要使用的庫(kù)都位于 pythonpath 中。如果你不想在整個(gè)系統(tǒng)中安裝,建議使用 virtual python 實(shí)例。請(qǐng)記住,最好把應(yīng)用安裝到虛擬環(huán)境中。 有一個(gè)可選項(xiàng)是在 .wsgi 文件中,在導(dǎo)入前加入路徑:

import sys
sys.path.insert(0, '/path/to/the/application')

配置 Apache

最后一件事是為你的應(yīng)用創(chuàng)建一個(gè) Apache 配置文件?;诎踩?,在下例中我們告訴 mod_wsgi 使用另外一個(gè)用戶運(yùn)行應(yīng)用:

<VirtualHost *>
    ServerName example.com

    WSGIDaemonProcess yourapplication user=user1 group=group1 threads=5
    WSGIScriptAlias / /var/www/yourapplication/yourapplication.wsgi

    <Directory /var/www/yourapplication>
        WSGIProcessGroup yourapplication
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

注意: WSGIDaemonProcess 在 Windows 中不會(huì)被執(zhí)行, 使用上面的配置 Apache 會(huì)拒絕運(yùn)行。在 Windows 系統(tǒng)下,請(qǐng)使用下面內(nèi)容:

<VirtualHost *>
        ServerName example.com
        WSGIScriptAlias / C:\yourdir\yourapp.wsgi
        <Directory C:\yourdir>
                Order deny,allow
                Allow from all
        </Directory>
</VirtualHost>

更多信息參見(jiàn) mod_wsgi 維基 。

故障排除

如果你的應(yīng)用無(wú)法運(yùn)行,請(qǐng)按以下指導(dǎo)排除故障:

問(wèn)題: 應(yīng)用無(wú)法運(yùn)行,出錯(cuò)記錄顯示 SystemExit ignored 應(yīng)用文件中有 app.run() 調(diào)用,但沒(méi)有放在 if __name__ == '__main__’: 塊內(nèi)。要么把這個(gè)調(diào)用放入塊內(nèi),要么把它放在一個(gè)單獨(dú)的 run.py 文件中。

問(wèn)題: 權(quán)限錯(cuò)誤 有可以是因?yàn)槭褂昧隋e(cuò)誤的用戶運(yùn)行應(yīng)用。請(qǐng)檢查用戶及其所在的組 ( WSGIDaemonProcess 的 user 和 group 參數(shù))是否有權(quán)限訪問(wèn)應(yīng)用 文件夾。

問(wèn)題: 打印時(shí)應(yīng)用歇菜 請(qǐng)記住 mod_wsgi 不允許使用 sys.stdoutsys.stderr 。把 WSGIRestrictStdout 設(shè)置為 off 可以去掉這個(gè)保護(hù):

WSGIRestrictStdout Off

或者你可以在 .wsgi 文件中把標(biāo)準(zhǔn)輸出替換為其他的流:

import sys
sys.stdout = sys.stderr

問(wèn)題: 訪問(wèn)資源時(shí)遇到 IO 錯(cuò)誤

你的應(yīng)用可能是一個(gè)獨(dú)立的 .py 文件,且你把它符號(hào)連接到了 site-packages 文件夾。這樣是不對(duì)的,你應(yīng)當(dāng)要么把文件夾放到 pythonpath 中,要么把你的應(yīng)用轉(zhuǎn)換為一個(gè)包。

產(chǎn)生這種錯(cuò)誤的原因是對(duì)于非安裝包來(lái)說(shuō),模塊的文件名用于定位資源,如果使用符號(hào)連接的話就會(huì)定位到錯(cuò)誤的文件名。

支持自動(dòng)重載

為了輔助部署工具,你可以激活自動(dòng)重載。這樣,一旦 .wsgi 文件有所變動(dòng), mod_wsgi 就會(huì)自動(dòng)重新轉(zhuǎn)入所有守護(hù)進(jìn)程。

在 Directory 一節(jié)中加入以下指令就可以實(shí)現(xiàn)自動(dòng)重載:

WSGIScriptReloading On

使用虛擬環(huán)境

使用虛擬環(huán)境的優(yōu)點(diǎn)是不必全局安裝應(yīng)用所需要的依賴,這樣我們就可以更好地按照自己的需要進(jìn)行控制。如果要在虛擬環(huán)境下使用 mod_wsgi ,那么我們要對(duì) .wsgi 略作改變。

在你的 .wsgi 文件頂部加入下列內(nèi)容:

activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

以上代碼會(huì)根據(jù)虛擬環(huán)境的設(shè)置載入相關(guān)路徑。請(qǐng)記住路徑必須是絕對(duì)路徑。

獨(dú)立 WSGI 容器

有一些用 Python 寫的流行服務(wù)器可以容納 WSGI 應(yīng)用,提供 HTTP 服務(wù)。這些服務(wù)器是 獨(dú)立運(yùn)行的,你可以把代理從你的網(wǎng)絡(luò)服務(wù)器指向它們。如果遇到問(wèn)題,請(qǐng)閱讀代理設(shè)置一節(jié)。

Gunicorn

Gunicorn ‘Green Unicorn’ 是一個(gè) UNIX 下的 WSGI HTTP 服務(wù)器,它是一個(gè)移植自 Ruby 的 Unicorn 項(xiàng)目的 pre-fork worker 模型。它既支持 eventlet , 也支持 greenlet 。在 Gunicorn 上運(yùn)行 Flask 應(yīng)用非常簡(jiǎn)單:

gunicorn myproject:app

Gunicorn 提供許多命令行參數(shù),可以使用 gunicorn -h 來(lái)獲得幫助。下面的例子使用 4 worker 進(jìn)程( -w 4 )來(lái)運(yùn)行 Flask 應(yīng)用,綁定到 localhost 的 4000 端口( -b 127.0.0.1:4000 ):

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app

Tornado

Tornado 是構(gòu)建 FriendFeed 的服務(wù)器和工具的開(kāi)源版本,具有良好的伸縮性,非阻塞性。得益于其非阻塞的方式和對(duì) epoll 的運(yùn)用,它可以同步處理數(shù)以千計(jì)的獨(dú)立 連接,因此 Tornado 是實(shí)時(shí) Web 服務(wù)的一個(gè)理想框架。用它來(lái)服務(wù) Flask 是小事一樁:

from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from toranado.ioloop import IOLoop
from yourapplication import app

http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()

Gevent

Gevent 是一個(gè) Python 并發(fā)網(wǎng)絡(luò)庫(kù),它使用了基于 libevent 事件循環(huán)的 greenlet 來(lái)提供一個(gè)高級(jí)同步 API:

from gevent.wsgi import WSGIServer
from yourapplication import app

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

Twisted Web

Twisted Web 是一個(gè) Twisted 自帶的網(wǎng)絡(luò)服務(wù)器,是一個(gè)成熟的、異步的、事件驅(qū)動(dòng)的網(wǎng)絡(luò)庫(kù)。 Twisted Web 帶有一個(gè)標(biāo)準(zhǔn)的 WSGI 容器,該容器可以使用 twistd 工具運(yùn)行命令行來(lái)控制:

twistd web --wsgi myproject.app

這個(gè)命令會(huì)運(yùn)行一個(gè)名為 app 的 Flask 應(yīng)用,其模塊名為 myproject 。

與 twistd 工具一樣, Twisted Web 支持許多標(biāo)記和選項(xiàng)。更多信息參見(jiàn) twistd -h 和 twistd web -h 。例如下面命令在前臺(tái)運(yùn)行一個(gè)來(lái)自 myproject 的應(yīng)用, 端口為 8080:

twistd -n web --port 8080 --wsgi myproject.app

代理設(shè)置

如果你要在一個(gè) HTTP 代理后面在上述服務(wù)器上運(yùn)行應(yīng)用,那么必須重寫一些頭部才行。 通常在 WSGI 環(huán)境中經(jīng)常會(huì)出現(xiàn)問(wèn)題的有兩個(gè)變量: REMOTE_ADDR 和 HTTP_HOST 。 你可以通過(guò)設(shè)置你的 httpd 來(lái)傳遞這些頭部,或者在中間件中修正這些問(wèn)題。 Werkzeug 帶有一個(gè)修復(fù)工具可以用于常用的設(shè)置,但是你可能需要為特定的設(shè)置編寫你自己的 WSGI 中間件。

下面是一個(gè)簡(jiǎn)單的 nginx 配置,代理目標(biāo)是 localhost 8000 端口提供的服務(wù),設(shè)置了適當(dāng)?shù)念^部:

server {
    listen 80;

    server_name _;

    access_log  /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        proxy_pass         http://127.0.0.1:8000/;
        proxy_redirect     off;

        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

如果你的 httpd 無(wú)法提供這些頭部,那么最常用的設(shè)置是調(diào)用 X-Forwarded-Host 定義的主機(jī)和 X-Forwarded-For 定義的遠(yuǎn)程地址:

from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)

頭部可信問(wèn)題

請(qǐng)注意,在非代理情況下使用這個(gè)中間件是有安全問(wèn)題的,因?yàn)樗鼤?huì)盲目信任惡意客戶端發(fā)來(lái)的頭部。

如果你要根據(jù)另一個(gè)頭部來(lái)重寫一個(gè)頭部,那么可以像下例一樣使用修復(fù)工具:

class CustomProxyFix(object):

    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        host = environ.get('HTTP_X_FHOST', '')
        if host:
            environ['HTTP_HOST'] = host
        return self.app(environ, start_response)

app.wsgi_app = Cus

tomProxyFix(app.wsgi_app)

uWSGI

uWSGI 也是部署 Flask 的途徑之一,類似的部署途徑還有 nginx 、 lighttpd 和 cherokee 。其他部署途徑的信息參見(jiàn) FastCGI 和 獨(dú)立 WSGI 容器 。使用 uWSGI 協(xié)議來(lái)部署 WSGI 應(yīng)用的先決條件是需要一個(gè) uWSGI 服務(wù)器。 uWSGI 既是一個(gè)協(xié)議也是一個(gè)服務(wù)器。如果作為一個(gè)服務(wù)器, 它可以服務(wù)于 uWSGI 、 FastCGI 和 HTTP 協(xié)議。

最流行的 uWSGI 服務(wù)器是 uwsgi ,本文將使用它來(lái)舉例,請(qǐng)先安裝它。

小心

請(qǐng)務(wù)必把 app.run() 放在 if __name__ == '__main__':內(nèi)部或者放在單獨(dú) 的文件中,這樣可以保證它不會(huì)被調(diào)用。因?yàn)?,每調(diào)用一次就會(huì)開(kāi)啟一個(gè)本地 WSGI 服務(wù)器。當(dāng)我們使用 uWSGI 部署應(yīng)用時(shí),不需要使用本地服務(wù)器。

使用 uwsgi 啟動(dòng)你的應(yīng)用

uwsgi 是基于 python 模塊中的 WSGI 調(diào)用的。假設(shè) Flask 應(yīng)用名稱為 myapp.py , 可以使用以下命令:

$ uwsgi -s /tmp/uwsgi.sock --module myapp --callable app

或者這個(gè)命令也行:

$ uwsgi -s /tmp/uwsgi.sock -w myapp:app

配置 nginx

一個(gè) nginx 的基本 uWSGI 配置如下:

location = /yourapplication { rewrite ^ /yourapplication/; }
location /yourapplication { try_files $uri @yourapplication; }
location @yourapplication {
  include uwsgi_params;
  uwsgi_param SCRIPT_NAME /yourapplication;
  uwsgi_modifier1 30;
  uwsgi_pass unix:/tmp/uwsgi.sock;
}

這個(gè)配置把應(yīng)用綁定到 /yourapplication 。如果你想要在根 URL 下運(yùn)行應(yīng)用非常簡(jiǎn)單,因?yàn)槟悴槐刂赋?WSGI PATH_INFO 或讓 uwsgi 修改器來(lái)使用它:

location / { try_files $uri @yourapplication; }
location @yourapplication {
    include uwsgi_params;
    uwsgi_pass unix:/tmp/uwsgi.sock;
}

FastCGI

FastCGI 是部署 Flask 的途徑之一,類似的部署途徑還有 nginx 、 lighttpd 和 cherokee 。其他部署途徑的信息參見(jiàn) uWSGI 和獨(dú)立 WSGI 容器 。本文講述的是使用 FastCGI 部署,因此先決條件是要有一個(gè) FastCGI 服務(wù)器。 flup 最流行的 FastCGI 服務(wù)器之一,我們將會(huì)在本文中使用它。在閱讀下文之前先安裝好 flup 。

小心

請(qǐng)務(wù)必把 app.run() 放在 if name == 'main': 內(nèi)部或者放在單獨(dú) 的文件中,這樣可以保證它不會(huì)被調(diào)用。因?yàn)?,每調(diào)用一次就會(huì)開(kāi)啟一個(gè)本地 WSGI 服務(wù)器。當(dāng)我們使用 FastCGI 部署應(yīng)用時(shí),不需要使用本地服務(wù)器。

創(chuàng)建一個(gè) .fcgi 文件

首先你必須創(chuàng)建 FastCGI 服務(wù)器配置文件,我們把它命名為 yourapplication.fcgi:

#!/usr/bin/python
from flup.server.fcgi import WSGIServer
from yourapplication import app

if __name__ == '__main__':
    WSGIServer(app).run()

如果使用的是 Apache ,那么使用了這個(gè)文件之后就可以正常工作了。但是如果使用的是 nginx 或老版本的 lighttpd ,那么需要顯式地把接口傳遞給 FastCGI 服務(wù)器,即把接口的路徑傳遞給 WSGIServer:

WSGIServer(application, bindAddress='/path/to/fcgi.sock').run()

這個(gè)路徑必須與服務(wù)器配置中定義的路徑一致。

把這個(gè) yourapplication.fcgi 文件放在一個(gè)以后可以找得到的地方,最好是 /var/www/yourapplication 或類似的地方。

為了讓服務(wù)器可以執(zhí)行這個(gè)文件,請(qǐng)給文件加上執(zhí)行位,確保這個(gè)文件可以執(zhí)行:

# chmod +x /var/www/yourapplication/yourapplication.fcgi

配置 Apache

上面的例子對(duì)于基本的 Apache 部署已經(jīng)夠用了,但是你的 .fcgi 文件會(huì)暴露在應(yīng)用的 URL 中,比如 example.com/yourapplication.fcgi/news/ 。有多種方法可以避免出現(xiàn)這中情況。一個(gè)較好的方法是使用 ScriptAlias 配置指令:

<VirtualHost *>
    ServerName example.com
    ScriptAlias / /path/to/yourapplication.fcgi/
</VirtualHost>

如果你無(wú)法設(shè)置 ScriptAlias ,比如你使用的是一個(gè)共享的網(wǎng)絡(luò)主機(jī),那么你可以使用 WSGI 中間件把 yourapplication.fcgi 從 URL 中刪除。你可以這樣設(shè)置 .htaccess:

<IfModule mod_fcgid.c>
   AddHandler fcgid-script .fcgi
   <Files ~ (\.fcgi)>
       SetHandler fcgid-script
       Options +FollowSymLinks +ExecCGI
   </Files>
</IfModule>

<IfModule mod_rewrite.c>
   Options +FollowSymlinks
   RewriteEngine On
   RewriteBase /
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteRule ^(.*)$ yourapplication.fcgi/$1 [QSA,L]
</IfModule>

設(shè)置 yourapplication.fcgi:

#!/usr/bin/python
#: optional path to your local python site-packages folder
import sys
sys.path.insert(0, '<your_local_path>/lib/python2.6/site-packages')

from flup.server.fcgi import WSGIServer
from yourapplication import app

class ScriptNameStripper(object):
   def __init__(self, app):
       self.app = app

   def __call__(self, environ, start_response):
       environ['SCRIPT_NAME'] = ''
       return self.app(environ, start_response)

app = ScriptNameStripper(app)

if __name__ == '__main__':
    WSGIServer(app).run()

配置 lighttpd

一個(gè) lighttpd 的基本 FastCGI 配置如下:

fastcgi.server = ("/yourapplication.fcgi" =>
    ((
        "socket" => "/tmp/yourapplication-fcgi.sock",
        "bin-path" => "/var/www/yourapplication/yourapplication.fcgi",
        "check-local" => "disable",
        "max-procs" => 1
    ))
)

alias.url = (
    "/static/" => "/path/to/your/static"
)

url.rewrite-once = (
    "^(/static($|/.*))$" => "$1",
    "^(/.*)$" => "/yourapplication.fcgi$1"

請(qǐng)記住啟用 FastCGI 、 alias 和 rewrite 模塊。以上配置把應(yīng)用綁定到 /yourapplication 。如果你想要讓應(yīng)用在根 URL 下運(yùn)行,那么必須使用 LighttpdCGIRootFix 中間件來(lái)解決一個(gè) lighttpd 缺陷。

請(qǐng)確保只有應(yīng)用在根 URL 下運(yùn)行時(shí)才使用上述中間件。更多信息請(qǐng)閱讀 FastCGI 和 Python (注意,已經(jīng)不再需要把一個(gè)接口顯式傳遞給 run() 了)。

配置 Nginx

在 Nginx 上安裝 FastCGI 應(yīng)用有一些特殊,因?yàn)槿笔∏闆r下不傳遞 FastCGI 參數(shù)。

一個(gè) Nginx 的基本 FastCGI 配置如下:

location = /yourapplication { rewrite ^ /yourapplication/ last; }
location /yourapplication { try_files $uri @yourapplication; }
location @yourapplication {
    include fastcgi_params;
    fastcgi_split_path_info ^(/yourapplication)(.*)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
}

這個(gè)配置把應(yīng)用綁定到 /yourapplication 。如果你想要在根 URL 下運(yùn)行應(yīng)用非常簡(jiǎn)單,因?yàn)槟悴槐刂赋鋈绾斡?jì)算出 PATH_INFO 和 SCRIPT_NAME:

location / { try_files $uri @yourapplication; }
location @yourapplication {
    include fastcgi_params;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param SCRIPT_NAME "";
    fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
}

運(yùn)行 FastCGI 進(jìn)程

Nginx 和其他服務(wù)器不會(huì)載入 FastCGI 應(yīng)用,你必須自己載入。 Supervisor 可以管理 FastCGI 進(jìn)程。 在啟動(dòng)時(shí)你可以使用其他 FastCGI 進(jìn)程管理器或?qū)懸粋€(gè)腳本來(lái)運(yùn)行 .fcgi 文件,例如使用一個(gè) SysV init.d 腳本。如果是臨時(shí)使用,你可以在一個(gè) GNU screen 中運(yùn)行 .fcgi 腳本。運(yùn)行細(xì)節(jié)參見(jiàn) man screen ,同時(shí)請(qǐng)注意這是一個(gè)手動(dòng)啟動(dòng)方法, 不會(huì)在系統(tǒng)重啟時(shí)自動(dòng)啟動(dòng):

$ screen
$ /var/www/yourapplication/yourapplication.fcgi

調(diào)試

在大多數(shù)服務(wù)器上, FastCGI 部署難以調(diào)試。通常服務(wù)器日志只會(huì)告訴你類似 “ premature end of headers ”的內(nèi)容。為了調(diào)試應(yīng)用,查找出錯(cuò)的原因,你必須切換到正確的用戶并手動(dòng)執(zhí)行應(yīng)用。

下例假設(shè)你的應(yīng)用是 application.fcgi ,且你的網(wǎng)絡(luò)服務(wù)用戶為 www-data:

$ su www-data
$ cd /var/www/yourapplication
$ python application.fcgi
Traceback (most recent call last):
  File "yourapplication.fcgi", line 4, in <module>
ImportError: No module named yourapplication

上面的出錯(cuò)信息表示 “yourapplication” 不在 python 路徑中。原因可能有:

  • 使用了相對(duì)路徑。在當(dāng)前工作路徑下路徑出錯(cuò)。
  • 當(dāng)前網(wǎng)絡(luò)服務(wù)器設(shè)置未正確設(shè)置環(huán)境變量。
  • 使用了不同的 python 解釋器。

CGI

如果其他的部署方式都不管用,那么就只能使用 CGI 了。 CGI 適應(yīng)于所有主流服務(wù)器, 但是其性能稍弱。

這也是在 Google 的 App Engine 使用 Flask 應(yīng)用的方法,其執(zhí)行方式類似于 CGI 環(huán)境。

小心

請(qǐng)務(wù)必把 app.run() 放在 if __name__ == '__main__’: 內(nèi)部或者放在單獨(dú) 的文件中,這樣可以保證它不會(huì)被調(diào)用。因?yàn)?,每調(diào)用一次就會(huì)開(kāi)啟一個(gè)本地 WSGI 服務(wù)器。當(dāng)我們使用 CGI 或 App Engine 部署應(yīng)用時(shí),不需要使用本地服務(wù)器。

在使用 CGI 時(shí),你還必須確保代碼中不包含任何 print 語(yǔ)句,或者 sys.stdout 被重載,不會(huì)寫入 HTTP 響應(yīng)中。

創(chuàng)建一個(gè) .cgi 文件

首先,你需要?jiǎng)?chuàng)建 CGI 應(yīng)用文件。我們把它命名為 yourapplication.cgi:

#!/usr/bin/python
from wsgiref.handlers import CGIHandler
from yourapplication import app

CGIHandler().run(app)

服務(wù)器設(shè)置

設(shè)置服務(wù)器通常有兩種方法。一種是把 .cgi 復(fù)制為 cgi-bin (并且使用 mod_rewrite 或其他類似東西來(lái)改寫 URL );另一種是把服務(wù)器直接指向文件。

例如,如果使用 Apache ,那么可以把如下內(nèi)容放入配置中:

ScriptAlias /app /path/to/the/application.cgi

在共享的網(wǎng)絡(luò)服務(wù)器上,你可能無(wú)法變動(dòng) Apache 配置。在這種情況下,你可以使用你的公共目錄中的 .htaccess 文件。但是 ScriptAlias 指令會(huì)失效:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f # Don't interfere with static files
RewriteRule ^(.*)$ /path/to/the/application.cgi/$1 [L]

更多信息參見(jiàn)你所使用的服務(wù)器的文檔。

? Copyright 2013, Armin Ronacher. Created using Sphinx.