Q&A
flask-loginでappにログイン機能を実装し、ローカル環境ではログインするとうまくいきました。しかし、コアサーバーにそれをアップロードし、そこからログインしようとするとUnauthorizedのエラーが出てしまいます。
また、ブラウザchrome以外だとユーザー新規登録の時にエラーが発生、そしてChromeでもユーザー名などを日本語にするとエラーが起きてしまいます。(ローカルでは、日本語でも問題なく登録できた。)なぜこのようなエラーが出るのかを突き止めたいです。
※追記
index.pyを編集しました。
app─┬─index.py ├─index.cgi ├─.htaccess ├─┬templates┬register.html │ │ ├login.html │ │ └myhome.html │ └static─style.css └─user.db
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ /index.cgi/$1 [QSA,L] <Files ~ "\.py$"> deny from all </Files>
index.cgi
1#!/usr/local/bin/python3 2 3from wsgiref.handlers import CGIHandler 4from index import app 5 6CGIHandler().run(app) 7
index.py
1import os 2import random, string 3import math 4from flask import Flask, render_template, request, redirect, url_for, g, session, flash 5from flask_sqlalchemy import SQLAlchemy 6from flask_login import LoginManager, UserMixin, current_user, login_user, login_required, logout_user 7from werkzeug.security import generate_password_hash, check_password_hash 8 9app = Flask(__name__) 10app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///user.db' 11app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 12app.config['SECRET_KEY'] = os.urandom(24) 13db = SQLAlchemy(app) 14 15app.config['UPLOAD_FOLDER'] = 'static/images' 16app.config['MAX_CONTENT_LENGTH'] = 16 * 1000 * 1000 17 18login_manager = LoginManager() 19login_manager.init_app(app) 20 21 22 23class User(UserMixin, db.Model): 24 id = db.Column(db.Integer, primary_key=True) 25 username = db.Column(db.String(50)) 26 password = db.Column(db.String(25)) 27 mail = db.Column(db.String(64)) 28 msg = db.Column(db.String(500)) 29 voting = db.Column(db.String(3)) 30 video_query = db.Column(db.String(3)) 31 rep = db.Column(db.Float) 32 star = db.Column(db.Integer) 33 34 def get_id(self): 35 return self.id 36 37 def is_authenticated(self): 38 return True 39 40 def is_anonymous(self): 41 return False 42 43 def is_active(self): 44 return False 45 46class User_mail(UserMixin, db.Model): 47 id = db.Column(db.Integer, primary_key=True) 48 username = db.Column(db.String(50)) 49 mail = db.Column(db.String(64)) 50 51class Vote(UserMixin, db.Model): 52 __tablename__ = "vote" 53 id = db.Column(db.Integer, primary_key=True) 54 voted_mail = db.Column(db.String(64)) 55 vote_mail = db.Column(db.String(64)) 56 57class VideoVote(db.Model): 58 id = db.Column(db.Integer, primary_key=True) 59 video_voted_mail = db.Column(db.String(64)) 60 video_vote_mail = db.Column(db.String(64)) 61 62 63class Hit(db.Model): 64 id = db.Column(db.Integer, primary_key=True) 65 star_mail = db.Column(db.String(64)) 66 hit_mail = db.Column(db.String(64)) 67 hit_id = db.Column(db.String(64)) 68 69class VideoHit(db.Model): 70 id = db.Column(db.Integer, primary_key=True) 71 video_star_mail = db.Column(db.String(64)) 72 video_hit_mail = db.Column(db.String(64)) 73 video_hit_id = db.Column(db.Integer) 74 75class ForRep(db.Model): 76 id = db.Column(db.Integer, primary_key=True) 77 video_star_mail = db.Column(db.String(64)) 78 video_hit_mail = db.Column(db.String(64)) 79 80class GroupVideo(db.Model): 81 id = db.Column(db.Integer, primary_key=True) 82 one = db.Column(db.Integer) 83 two = db.Column(db.Integer) 84 three = db.Column(db.Integer) 85 four = db.Column(db.Integer) 86 five = db.Column(db.Integer) 87 group_id = db.Column(db.Integer) 88 89def randomname(n): 90 randlst = [random.choice(string.ascii_letters + string.digits) for i in range(n)] 91 return ''.join(randlst) 92 93db.create_all() 94 95 96@login_manager.user_loader 97def load_user(user_id): 98 return User.query.get(int(user_id)) 99 100@app.route('/') 101def index(): 102 return render_template('index.html') 103 104@app.route('/register', methods=['POST', 'GET']) 105def register(): 106 if request.method == "POST": 107 username = request.form.get('name') 108 password = request.form.get('password') 109 mailaddress = request.form.get('mail') 110 mailg ='@' in mailaddress 111 mailgd = '.' in mailaddress 112 print(mailg) 113 if mailg == False: 114 return redirect('/register_w3') 115 if mailgd == False: 116 return redirect('/register_w3') 117 print(username + ':' + password + ':' + mailaddress) 118 # Userのインスタンスを作成 119 if username == '': 120 return redirect('/register') 121 elif password == '': 122 return redirect('/register') 123 elif mailaddress == '': 124 return redirect('/register') 125 elif User_mail.query.filter_by(mail=mailaddress).first(): 126 return redirect('/register') 127 else: 128 user = User(username=username, password=generate_password_hash(password, method='sha256'), mail=mailaddress, msg="なし", rep=4, star=0) 129 db.session.add(user) 130 db.session.commit() 131 user_mail = User_mail(username=username, mail=mailaddress) 132 db.session.add(user_mail) 133 db.session.commit() 134 print(mailaddress) 135 return redirect('/login') 136 else: 137 return render_template('register.html') 138 139@app.route('/login', methods=['GET', 'POST']) 140def login(): 141 if request.method == "POST": 142 143 username = request.form.get('name') 144 password = request.form.get('password') 145 # Userテーブルからusernameに一致するユーザを取得 146 user = User.query.filter_by(username=username).first() 147 if user: 148 if check_password_hash(user.password, password): 149 login_user(user) 150 print(current_user.username) 151 return redirect('/myhome') 152 else: 153 return redirect('/login') 154 else: 155 return redirect('/login') 156 else: 157 return render_template('login.html') 158 159 160 161@app.route('/myhome') 162@login_required 163def myhome(): 164 if VideoHit.query.filter_by(video_hit_mail=current_user.mail).first(): 165 for i in VideoHit.query.filter_by(video_hit_mail=current_user.mail).all(): 166 db.session.delete(i) 167 db.session.commit() 168 elif VideoHit.query.filter_by(video_star_mail=current_user.mail).first(): 169 for i in VideoHit.query.filter_by(video_star_mail=current_user.mail).all(): 170 db.session.delete(i) 171 db.session.commit() 172 current_user.video_query = 'off' 173 current_user.voting = 'off' 174 db.session.commit() 175 blogarticles = User.query.all() 176 votes = Vote.query.filter_by(vote_mail = current_user.mail).all() 177 voted_mails = [] 178 for i in votes: 179 voted_mails.append(i.voted_mail) 180 return render_template('myhome.html', voted_mails=voted_mails, current_user=current_user, username=current_user.username, blogarticles=blogarticles, math=math, int=int, str=str, os=os) 181
register.html
1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>ログイン</title> 8 <link rel="stylesheet" href="static/style.css"> 9 10</head> 11<body> 12 13 <form action="/register" method="post"> 14 <p class="text">ユーザーネーム</p> 15 <textarea class="area" name="name" id=""></textarea> 16 <p class="text">パスワード</p> 17 <textarea class="pass area" name="password" type="password" id="" ></textarea> 18 </br> 19<button>始める</button> 20 </form> 21</body> 22</html>
login.html
1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>ログイン</title> 8 <link rel="stylesheet" href="static/style.css"> 9 10</head> 11<body> 12 <p class="logindis">ログイン画面</p> 13 <div class="login_form"> 14 <form method="post" action="/login"> 15 <p class="text">ユーザーネーム</p> 16 <textarea class="area" name="name" id=""></textarea> 17 <p class="text">パスワード</p> 18 <textarea class="pass area" name="password" type="password" id="" ></textarea> 19 </br> 20<button>始める</button> 21 </form> 22</body> 23</html>
myhome.html
1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <link rel="stylesheet" href="static/style.css"> 8 <title>Document</title> 9</head> 10<body> 11 <p>ログイン成功</p> 12</body> 13</html>
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2022/04/19 15:47
2022/04/20 01:36
2022/04/20 12:12
2022/04/21 02:01