3

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()
4

2 に答える 2

2

以下は今私のために働きます。

  1. .htaccess の RewriteBase をコメント化

  2. カスタマイズされた url_for で index.py を更新

    from flask import Flask, redirect, url_for
    
    app = Flask(__name__)
    
    def strip_url(orig):
       return orig.replace('index.fcgi/', '')
    
    @app.route('/', methods=['GET'])
    def home():
        return redirect(strip_url(url_for('login')))
    
    @app.route('/login', methods=['GET'])
    def login():
        return 'please login'
    
    if __name__ == "__main__":
        app.run()
    

結論を下す必要がある場合は、公式のFlask fastcgi ドキュメントで、コード内から開始されたリダイレクトでは機能しない URL から ***.fcgi を削除する RewriteRule が要求されていると思います。

于 2015-05-02T01:28:09.547 に答える
1

Flask 構成で次のように設定APPLICATION_ROOTします。

app.config["APPLICATION_ROOT"] = "/app"

を使用しないRewriteBaseでください。Flask は、URL を生成するために URL ルートについて知る必要があります。

于 2015-05-01T19:19:48.633 に答える