いつもお世話になっております。
ログイン認証の後にサイトを表示させるというコードを作成しました。
これをXreaサーバー上でFlaskを動作させるべく、SSH接続からFlask等のインストールを行い、ローカルサーバーでエラーなく動作した各種ファイルをアップロードしました。
しかし、ローカルのディレクトリ構成をそのままアップロードしても文字化けした文字列が表示されるばかりでした。
そこで、以下のページを参考に『CGIモードでの動作』を試みました。
https://kumahiyo.com/flask-coreserver/
すると、login.html(ログインページ)、error.html(ログイン失敗ページ)は意図した通りに表示されました。
ところが、肝心のhome.html(ログイン成功後のページ)がNotFoundとなってしまいます。
index.pyを経由させた場合、ルーティングの設定を変えねばならないのかとも考えましたが、ログインページや失敗ページがしっかり表示されている以上、ログイン成功ページもローカルサーバーでの構成と同じでなければならないと思います。
XREAサーバー上のディレクトリ構造は以下の通りです。
public_html
┗seiseki_system
__┗main.py
__┗index.py
__┗main.py
__┗.htaccess
__┗templates
____┗home.html
____┗login.html
____┗error.html
Flaskでルーティングを記述したmain.pyは以下の通りです。
Python3
1#!/usr/local/bin/python3 2# -*- coding: utf-8 -*- 3 4import sqlite3 5from flask import Flask, render_template, request,Response, abort, redirect, session 6from flask_login import LoginManager, login_user, logout_user, login_required, UserMixin 7from collections import defaultdict 8 9# Flask使用準備 10app = Flask(__name__) 11login_manager = LoginManager() 12login_manager.init_app(app) 13app.config['SECRET_KEY'] = "secret" 14 15# 辞書User定義 16class User(UserMixin): 17 def __init__(self, id, name, password): 18 self.id = id 19 self.name = name 20 self.password = password 21 22# seiseki.dbから名簿データ取得+ログイン用ユーザー辞書作成 23users={} 24db = 'seiseki.db' 25conn = sqlite3.connect(db) 26c = conn.cursor() 27c.execute('SELECT * FROM meibo') 28for i, row in enumerate(c): 29 users[i+1] = User(i+1,str(row[0]),str(row[2])) 30conn.commit() 31conn.close() 32 33# ユーザーチェックに使用する辞書作成 34nested_dict = lambda: defaultdict(nested_dict) 35user_check = nested_dict() 36for i in users.values(): 37 user_check[i.name]["password"] = i.password 38 user_check[i.name]["id"] = i.id 39 40@login_manager.user_loader 41def load_user(user_id): 42 return users.get(int(user_id)) 43 44####################################################### 45 46@app.route('/', methods=["GET", "POST"]) 47def login(): 48 if(request.method == "POST"): 49 # ユーザーチェック 50 if(request.form["username"] in user_check and request.form["password"] == user_check[request.form["username"]]["password"]): 51 # ユーザーが存在した場合はログイン 52 login_user(users.get(user_check[request.form["username"]]["id"])) 53 session["player_ID"] = request.form["username"] 54 【・・・データ処理省略・・・】 55 return redirect("/home/") 56 else: 57 return render_template("error.html") 58 else: 59 return render_template("login.html") 60 61@app.route('/home/') 62@login_required 63def home(): 64 return render_template("home.html") 65 66@app.route('/logout/') 67@login_required 68def logout(): 69 logout_user() 70 return Response(''' 71 ログアウトしました。<br /> 72 <a href="/">login</a> 73 ''') 74 75if __name__ == '__main__': 76 app.run(debug=True)
CGI化のコードが書かれたindex.pyは以下の通りです。
Python3
1#!/usr/local/bin/python3 2# coding: utf-8 3 4import cgitb 5cgitb.enable() 6 7from wsgiref.handlers import CGIHandler 8from main import app 9CGIHandler().run(app)
.htaccessは以下の通りです。
AddHandler cgi-script .py RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.py/$1 [QSA,L]
上記コードのどの部分に不備があるか、ご指導頂きたく存じます。
以上、何卒宜しくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。