前提・実現したいこと
Herokuにサーバーに値を送信するアプリ(ログイン機能あり)をデプロイしました。
フロントからサーバーに値を送信するときajaxを使用しています。
現在、Herokuにアプリをデプロイした際に、
値の送信が成功するパターンと成功しないパターンに分かれるなど挙動が安定しません。
おそらくajax周りに問題があるとは思います。
解決策を教えていただけると幸いです。
アプリの構成は以下のようにしています。
環境:Heroku フロントエンド: HTML, JavaScript(jQuery) サーバーサード: Python(Flask) ※Pythonは3.9.7を使用しています。
発生している問題
前述の通り、値の送信の挙動が安定しません。
ちなみにエラーの時は以下のように返ります。
Failed to load resource: the server responded with a status of 401 (UNAUTHORIZED)
なお以下の場合は問題なく安定してサーバーに値を送ることができます。
- ローカル環境下
- ログイン機能を取り除いた場合
試したこと
サーバーに送信する形式をJSONにしても結果は変わりませんでした。
###ディレクトリ
hoge_app │ ├─app.py │ ├─static │ Send.js │ └─templates index.html login.html
ソースコード
app
1#app.py 2# -*- coding: utf-8 -*- 3 4import os 5from flask_sqlalchemy import SQLAlchemy 6from flask import Flask, render_template, request 7from flask_login import UserMixin, LoginManager, login_user, login_required 8from werkzeug.security import check_password_hash 9import flask_wtf 10import wtforms 11from wtforms import validators 12from itsdangerous.url_safe import URLSafeTimedSerializer 13 14 15app = Flask(__name__) 16app.config['SQLALCHEMY_DATABASE_URI'] = variable.SQLALCHEMY_DATABASE_URI 17 18app.config['SECRET_KEY'] = os.urandom(24) 19 20db = SQLAlchemy(app) 21app.secret_key = os.urandom(24) 22SALT = os.urandom(24) 23currentDirctory = os.getcwd() 24login_manager = LoginManager() 25login_manager.init_app(app) 26 27class NewPwdForm(flask_wtf.FlaskForm): 28 token = wtforms.HiddenField('token', [ 29 validators.InputRequired()]) 30 new_pwd1 = wtforms.PasswordField('PW', [ 31 validators.InputRequired(), 32 validators.EqualTo('new_pwd2')]) 33 new_pwd2 = wtforms.PasswordField('PW', [ 34 validators.InputRequired()]) 35 36class AddressForm(flask_wtf.FlaskForm): 37 mail = wtforms.StringField('mail', [ 38 validators.Email(message='WRONG FORMATT'), 39 validators.InputRequired(message='PUT IN ADDEESS')]) 40 41class User(UserMixin, db.Model): 42 id = db.Column(db.Integer, primary_key=True) 43 username = db.Column(db.String(), nullable=False, unique=True) 44 password = db.Column(db.String()) 45 46@login_manager.user_loader 47def load_user(user_id): 48 return User.query.get(int(user_id)) 49 50 51@app.route('/', methods=['GET', 'POST']) 52def login(): 53 if request.method == "POST": 54 username = request.form.get('username') 55 password = request.form.get('password') 56 user = User.query.filter_by(username=username).first() 57 58 if user is None: 59 return render_template('login.html', login_Message="※NO USER※") 60 61 if check_password_hash(user.password, password): 62 login_user(user) 63 return render_template('index.html', username=str(user.username)) 64 else: 65 return render_template('login.html', login_Message="※WRONG PW※") 66 else: 67 return render_template('login.html') 68 69 70def create_token(user_id, secret_key, salt): 71 serializer = URLSafeTimedSerializer(secret_key) 72 return serializer.dumps(user_id, salt=salt) 73 74 75def load_token(token, secret_key, salt, max_age=600): 76 serializer = URLSafeTimedSerializer(secret_key) 77 return serializer.loads(token, salt=salt, max_age=3600) 78 79 80@app.route('/sendMovement', methods=['GET', 'POST']) 81@login_required 82def sendMovement(): 83 if request.method == "POST": 84 PostMonement = str(request.form['Monement']) 85 86 return render_template('index.html') 87 88if __name__ == "__main__": 89 app.run(host='0.0.0.0', threaded=True, debug=True) 90
Send
1//Send.js 2function one_click() { 3 Movement("move_one"); 4 return; 5} 6 7function two_click() { 8 Movement("move_two"); 9 return; 10} 11 12 13function three_click() { 14 Movement("move_three"); 15 return; 16} 17 18 19function Movement(strMovement) { 20 var fData = new FormData(); 21 fData.append('Monement', strMovement); 22 ajaxSend(fData, '/sendMovement') 23 return; 24} 25 26function ajaxSend(fData, urlFlask) { 27 //ajax 28 $.ajax({ 29 url: urlFlask, 30 type: 'POST', 31 async: false, 32 data: fData, 33 contentType: false, 34 processData: false, 35 success: function(data, dataType) { 36 console.log('Success', data); 37 alert("Success!"); 38 }, 39 error: function(XMLHttpRequest, textStatus, errorThrown) { 40 console.log('Error : ' + errorThrown); 41 alert("Error!"); 42 } 43 }); 44}
index
1<!-- index.html --> 2<!DOCTYPE html> 3<html> 4 5<body> 6 <button type="button" onclick="one_click();">ONE</button> 7 <button type="button" onclick="two_click();">TWO</button> 8 <button type="button" onclick="three_click();">THREE</button> 9 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script> 10 <script src="/static/SendToRPi.js?p=(new Date()).getTime() "></script> 11</body> 12 13</html>
回答1件
あなたの回答
tips
プレビュー