簡體   English   中英

如何使用 wsgiref CGIHandler 去除運行 Flask 應用程序的額外 cgi-bin url 組件?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM