как мне решить проблему с развертыванием героку? - PullRequest
0 голосов
/ 10 июля 2020

, когда я запускаю веб-приложение на своем компьютере, используя flask, все в порядке. но когда я развертываю его на героку, он начинает вести себя странно. рассматриваемое приложение - приложение

вы можете видеть, что иногда приложение не регистрирует ваши входные данные, а иногда я получаю внутреннюю ошибку сервера, но если я продолжаю обновлять страницу, она работает .

похоже, что есть проблема с перенаправлением, или, может быть, что-то с сессиями?

есть что-то, чего мне не хватает, вы должны сделать при использовании heroku?

flask


from flask import Flask, render_template, session, redirect, url_for
from flask_session import Session
from tempfile import mkdtemp

app = Flask(__name__)

app.config["SESSION_FILE_DIR"] = mkdtemp()
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)

@app.route("/")
def index():

    if "board" not in session:
        session["board"] = [[None, None, None], [None, None, None], [None, None, None]]
        session["turn"] = "X"
    if draw(session["board"]) == True:
        return render_template("gameover.html", game=session["board"], draw=draw)
    if winner(session["board"]) is not None:
        return render_template("gameover.html", game=session["board"], winner=winner(session["board"]))

    return render_template("game.html", game=session["board"], turn=session["turn"])

@app.route("/reset")
def reset():
    session["board"] = [[None, None, None], [None, None, None], [None, None, None]]
    session["turn"] = "X"
    return redirect(url_for("index"))

@app.route("/play/<int:row>/<int:col>")
def play(row, col):
    session["board"][row][col] = session["turn"]
    if session["turn"] == "X":
        session["turn"] = "O"
    else:
        session["turn"] = "X"   
    return redirect(url_for("index"))

def winner(board):
    # check colums
    for i in range(3):
        if board[i][0] == board[i][1] == board[i][2] and board[i][0] != None:
            return board[i][0]
    # check rows
    for i in range(3):
        if board[0][i] == board[1][i] == board[2][i] and board[0][i] != None:
            return board[0][i]
    # check diagonal
    if board[0][0] == board[1][1] == board[2][2] or board[2][0] == board[1][1] == board[0][2] and board[1][1] != None:
        return board[1][1]

    return None

def draw(board):
    if sum(j.count(None) for j in board) == 0 and winner(board) is None:
        return True    

html


<!DOCTYPE html>
<html>
    <head>
        <title>Tic Tac Toe</title>
        <style>
            table {
                border-collapse: collapse;
            }
            td {
                border: 1px solid black;
                width: 150px;
                height: 150px;
                font-size: 30px;
                text-align: center;
            }
            td > a {
                font-size: 18px;
            }
        </style>
    </head>
    <body>
        <table>
            {% for i in range(3) %}
                <tr>
                    {% for j in range(3) %}
                        <td>
                            {% if game[i][j] %}
                                {{ game[i][j] }}
                            {% else %}
                                <a href="{{ url_for('play', row=i, col=j) }}">Play {{ turn }} here.</a>
                            {% endif %}
                        </td>
                    {% endfor %}
                </tr>
            {% endfor %}
        </table>
        <h1>
            <a href="/reset">reset board</a>
        </h1>
        <h1>
            <a href="/computer">let the computer play</a>
        </h1>
    </body>
</html>

код https://github.com/amitt1236/tictactoe-

Я буду рад получить некоторые рекомендации

спасибо

1 Ответ

1 голос
/ 11 июля 2020

Я наконец нашел проблему. для поддержания сеанса в flask вам необходимо использовать app.secret_key.

правильный код:

from flask import Flask, render_template, session, redirect, url_for
from flask_session import Session
from tempfile import mkdtemp

app = Flask(__name__)

app.config["SESSION_FILE_DIR"] = mkdtemp()
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)

app = Flask(__name__)
app.secret_key = "dev"

@app.route("/")
def index():

    if "board" not in session:
        session["board"] = [[None, None, None], [None, None, None], [None, None, None]]
        session["turn"] = "X"
    if draw(session["board"]) == True:
        return render_template("gameover.html", game=session["board"], draw=draw)
    if winner(session["board"]) is not None:
        return render_template("gameover.html", game=session["board"], winner=winner(session["board"]))

    return render_template("game.html", game=session["board"], turn=session["turn"])

@app.route("/reset")
def reset():
    session["board"] = [[None, None, None], [None, None, None], [None, None, None]]
    session["turn"] = "X"
    return redirect(url_for("index"))

@app.route("/play/<int:row>/<int:col>")
def play(row, col):
    session["board"][row][col] = session["turn"]
    if session["turn"] == "X":
        session["turn"] = "O"
    else:
        session["turn"] = "X"   
    return redirect(url_for("index"))

@app.route("/player")
def winner(board):
    # check colums
    for i in range(3):
        if board[i][0] == board[i][1] == board[i][2] and board[i][0] != None:
            return board[i][0]
    # check rows
    for i in range(3):
        if board[0][i] == board[1][i] == board[2][i] and board[0][i] != None:
            return board[0][i]
    # check diagonal
    if board[0][0] == board[1][1] == board[2][2] or board[2][0] == board[1][1] == board[0][2] and board[1][1] != None:
        return board[1][1]

    return None

def draw(board):
    if sum(j.count(None) for j in board) == 0 and winner(board) is None:
        return True    

добавлена ​​часть


app = Flask(__name__)
app.secret_key = "dev"

...