質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1119閲覧

アプリをデプロイしましたが、フロントから値を安定してサーバーに送ることができません。

hekatonkeiru

総合スコア9

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/07 05:18

編集2021/12/07 05:26

前提・実現したいこと

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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/12/07 10:02

Web アプリがうまく動かない場合、HTTP リクエストとレスポンスの内容を観察して、期待する値がやりとりできてるかを確認するのが重要かと。(そのためには HTTP の基礎知識が必要ですが…。) https://my-terrace.com/chrome_http_res/
hekatonkeiru

2021/12/08 00:01

hoshi-takanori様 コメントありがとうございます。 参考にさせていただきます。
guest

回答1

0

自己解決

すいません。
自己解決できました。
app.pyの@login_requiredが余計でした。

なので

app

1#app.py 2@app.route('/sendMovement', methods=['GET', 'POST']) 3@login_required 4def sendMovement(): 5 if request.method == "POST": 6 PostMonement = str(request.form['Monement']) 7 8 return render_template('index.html')

app

1#app.py 2@app.route('/sendMovement', methods=['GET', 'POST']) 3def sendMovement(): 4 if request.method == "POST": 5 PostMonement = str(request.form['Monement']) 6 7   return render_template('index.html') 8  return redirect('/')

に変更しました。

以上よろしくお願いいたします。

投稿2021/12/08 02:44

hekatonkeiru

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問