![](/img/trans.png)
[英]How to deploy flask application to cgi-bin folder on shared hosting?
[英]How to get rid of extra cgi-bin url components running a Flask App using wsgiref CGIHandler?
我正在使用不直接支持 wsgi 應用程序的共享 cpanel 托管計划。 所以我必須使用 wsgiref CGIHandler 解決方法,如下所述: http ://flask.pocoo.org/docs/0.12/deploying/cgi/。
這一切都有效並產生了預期的結果,但 URL 中總是有這些額外的東西:“/cgi-bin/index.cgi/”,python 應用程序似乎正在自動添加(以匹配它在被 cgi 調用時檢測到的內容)處理程序)。
例如,我希望它是 myhost.com/login/ 而不是 myhost.com/cgi-bin/index.cgi/login/,或 myhost.com/ 而不是 myhost.com/cgi-bin/index.cgi /.
由於引擎重寫規則已經到位,所有這些較短版本的鏈接都運行良好。 我已經檢查過了。 這只是找到一種方法來告訴燒瓶應用程序擺脫“/cgi-bin/index.cgi/”的問題。
我的一些代碼:
cat www/.htaccess
# Redirect everything to CGI WSGI handler, but Don't interfere with static files
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /cgi-bin/index.cgi/$1 [L]
.
cat www/cgi-bin/index.cgi
#!/home/myhost/myhost.com/flasky/venv/bin/python
import os
import sys
sys.path.insert(0, '/home/myhost/myhost.com/flasky/venv/lib/python2.7/site-packages')
sys.path.insert(0, '/home/myhost/myhost.com/flasky')
from wsgiref.handlers import CGIHandler
from manage import app
CGIHandler().run(app)
.
cat www/flasky/manage.py
#!/usr/bin/env python
import os
from app import create_app, db
from app.models import User, Role, Permission
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand
app = create_app(os.getenv('FLASK_CONFIG') or 'default')
manager = Manager(app)
migrate = Migrate(app, db)
def make_shell_context():
return dict(app=app, db=db, User=User, Role=Role,
Permission=Permission)
manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
.
有什么想法嗎?
謝謝!
我找到了一個 hack ......但它只是一個 hack :-( 如果我在 wsgiref CGIHandler 腳本中覆蓋 SCRIPT_NAME 環境變量的值,那么它就可以完美運行。
這是更新后的代碼:
cat www/cgi-bin/index.cgi
#!/home/myhost/myhost.com/flasky/venv/bin/python
import os
import sys
sys.path.insert(0, '/home/myhost/myhost.com/flasky/venv/lib/python2.7/site-packages')
sys.path.insert(0, '/home/myhost/myhost.com/flasky')
from wsgiref.handlers import CGIHandler
from manage import app
os.environ['SCRIPT_NAME'] = ''
CGIHandler().run(app)
.
基本上,無論os.environ['SCRIPT_NAME']值是什么,每次請求頁面時,它都會以 Flask 應用 url 為前綴。
我仍然在尋找一個更優雅的“pythonic”解決方案。。
cat www/cgi-bin/index.cgi
#!/home/myhost/myhost.com/flasky/venv/bin/python
import os
import sys
sys.path.insert(0, '/home/myhost/myhost.com/flasky/venv/lib/python2.7/site-packages')
sys.path.insert(0, '/home/myhost/myhost.com/flasky')
from wsgiref.handlers import CGIHandler
from manage 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)
CGIHandler().run(app)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.