Bluehost のルート ディレクトリの下のサブ ディレクトリに「app」という非常に単純な Flask アプリケーションをデプロイしました。うまくいけば、example.com はホームページを指し、example.com/app は私の Flask アプリケーションを指します。実際、スクリプト index.py が次のようになっている場合、Flask アプリケーションは問題なく動作します。
from flask import Flask
app = Flask(__name__)
@app.route('/', methods=['GET'])
def home():
return 'Hello world'
if __name__ == "__main__":
app.run()
しかし、doc 構造と index.py が次のような単純なログイン機能を導入したため、事態は悪化しました。
ドキュメント構造:
public_html
|--app
|--.htaccess
|--index.fcgi
|--index.py
|--static
|--login.html
|--templates
|--home.html
index.py:
from flask import Flask, url_for, request, render_template, redirect, session
app = Flask(__name__)
@app.route('/', methods=['GET'])
def home():
if not session.get('user'):
return redirect(url_for('login')) #go to login page if not logined
else:
return render_template('home.html') #otherwise go to home page
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return app.send_static_file('login.html')
else:
user = request.form.get('user')
password = request.form.get('password')
if user == 'joy' and password == 'joy':
session['user'] = user
return render_template('home.html')
else:
return 'LOGIN FAILED'
if __name__ == "__main__":
app.run()
ただし、example.com/app にアクセスすると、URL が example.com/login に変更され、example.com/login がどのドキュメントにもマップされないため、妥当な 404 エラーが発生します。
return redirect(url_for('login'))
url_for('login') は、example.com/app/login ではなく example.com/login を返します。そのため、後者のバージョンの index.py は機能しません。私は非常に多くのことを試しましたが、修正に出くわしませんでした。助けてください。ありがとう!
私の .htaccess:
Options +ExecCGI
AddHandler fcgid-script .fcgi
RewriteEngine On
#RewriteBase /app/ # Neither RewriteBase / or RewriteBase /app/ work
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]
私のindex.fcgi:
import sys
sys.path.insert(0, '/path_to_my_python_site-packages')
from flup.server.fcgi import WSGIServer
from index 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()