takuminatyan
@takuminatyan

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

データベースを更新してもそれが反映されません

ロリポップのレンタルサーバーを借りてflaskでwebアプリを作ろうと思っています。ログイン後、トップページに"〇〇さんこんにちは"と表示し、登録名を変えるinput boxも置いておき、それに新しい名前を入力するとuserlist.jsonの中の登録名を書き換え、再度トップページにアクセスすることで"△△さんこんにちは"のように表示される名前を変えたいのですが、何故か変わりません。
キャッシュが関係しているのかと考え、キャッシュを消してリロードしても表示内容は変わりません。
自分のパソコンでターミナルでapp.pyを実行するとうまくいくのですが、、、
また、一旦ログアウトしてから再度ログインするときちんと表示内容は変わっています。
初心者でつまらない質問かもしれませんが、ご教授いただけると幸いです。

階層
hogehoge.com
├templates
|| login.html
|└ top.html
├data
|└ userlist.json
|app.py
|login.py
|data_use.py
|index.cgi
└.htaccess

app.py

from flask import Flask, render_template, redirect, request
import os, datetime
import data_use
import login

app = Flask(__name__)
app.secret_key = 'abcdefg'

#最初の画面
@app.route('/')
def index():
    return render_template('login.html')

#ログイン直後
@app.route('/try_login', methods=['POST'])
def try_login():
    mail = request.form.get('mail','')

    if login.try_login(mail):
        return redirect('/index.cgi/top')

    return redirect('/')

#ログイン後のトップページ
@app.route('/top')
def top():
    #ログインしてるかどうか
    if not login.is_login():
        return redirect('/')

    mail = request.form.get('mail','')
    userlist=data_use.load_data()
    
    #名前を得る
    username=userlist[mail]
    return render_template('top.html', username=username)

#名前変更直後
@app.route('/top/change_name', methods=['POST'])
def change_name():
    #ログインしてるかどうか
    if not login.is_login():
        return redirect('/')
    newname=request.form.get('newname','')
    mail=login.get_mail()

    data_use.change_data(mail, newname)

    return redirect('/index.cgi/top')


if __name__ == '__main__':
    app.run()

login.py

from flask import session
import data_use

# ログインしているか調べる
def is_login():
    return 'mail' in session

# ログイン処理
def try_login(mail):
    userlist=data_use.load_data()
    # 該当ユーザーか?
    if mail in userlist:
        session['mail'] = mail
        return True

    return False

# メールを渡す
def get_mail():
    if is_login(): return session['mail']
    return 'not login'

# ログアウト処理
def try_logout():
    session.pop('mail', None)
    return True

data_use.py

import os, json

# 保存先のファイルを指定
BASE_DIR = os.path.dirname(__file__)
SAVE_FILE = BASE_DIR + '/data/userlist.json'

# ユーザーリスト(JSON形式)を読み出す
def load_data():
    with open(SAVE_FILE, 'rt', encoding='utf-8') as f:
        return json.load(f)

# ユーザーリストへ書き出す
def save_data(data_list):
    with open(SAVE_FILE, 'wt', encoding='utf-8') as f:
        json.dump(data_list, f, ensure_ascii=False, indent=2)

# 名前を変える
def change_data(mail, newname):
    data_list = load_data()
    data_list[mail]=newname
    save_data(data_list)

top.html

<!DOCTYPE html>
<html lang="ja"><head><meta charset="UTF-8">
  <meta name="viewport"
    content="width=device-width, initial-scale=1.0">
  <title>トップページ</title>
</head><body><div>
  <h1>{{ username }}さん、こんにちは<h1>
  <form action="/index.cgi/top/change_name" method="POST">
    <legend>名前を変更するなら、入力してください</legend>
    <fieldset>

      <label for="newname">新しい名前</label>
      <input type="text" name="newname" id="newname">

      <button type="submit">
     変更</button>
    </fieldset>
  </form>
</div></body></html>

login.html

<!DOCTYPE html>
<html lang="ja"><head><meta charset="UTF-8">
  <meta name="viewport"
    content="width=device-width, initial-scale=1.0">
  <title>ログインページ</title>
</head><body><div>
  <h1>ログインページ<h1>
  <form action="/index.cgi/try_login" method="POST">
    <legend>メールアドレスを入力してください</legend>
    <fieldset>

      <label for="mail">メールアドレス</label>
      <input type="text" name="mail" id="mail">

      <button type="submit">
      ログイン</button>
    </fieldset>
  </form>
</div></body></html>

userlist.json

{
  "a@gmail.com": "山田",
  "b@gmail.com": "佐藤"
}

index.cgi

#!/usr/local/bin/python3
from wsgiref.handlers import CGIHandler
from app import app
CGIHandler().run(app)

.htaccess

<ifmodule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$       https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTPS}     off
RewriteRule ^(.*)$       https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\index.cgi -f
RewriteRule ^(.*)$ $1index.cgi [L]
</ifmodule>
0

1Answer

Your answer might help someone💌