500-кратная ошибка при развертывании веб-сайта GCP с Flask - PullRequest
0 голосов
/ 11 марта 2020

У меня есть sh веб-сайт, который работает правильно (VScode с живым сервером).

Я использую HTML / CSS / JScript с python Flask, sqlalchemy и werkzeug.

Файловая система состоит из:

stati c (img / data.db / style. css)

шаблонов (макет. html + все html файлов)

main.py:

import os
from flask import Flask, render_template, request, redirect, session
from functools import wraps
from sqlalchemy import update, select, MetaData, insert, Text, Table, Column, Integer, Numeric, String, create_engine
from werkzeug.security import check_password_hash


app = Flask(__name__)
app.config['SECRET_KEY'] = X

# access DB
metadata = MetaData()
users = Table('users', metadata,
              Column('id', Integer(), primary_key=True),
              Column('username', Text(50), index=True),
              Column('hash', Text()),
              Column('mon_o', Text(5)),
              Column('mon_c', Text(5)),
              Column('tue_o', Text(5)),
              Column('tue_c', Text(5)),
              Column('wed_o', Text(5)),
              Column('wed_c', Text(5)),
              Column('thu_o', Text(5)),
              Column('thu_c', Text(5)),
              Column('fri_o', Text(5)),
              Column('fri_c', Text(5)),
              Column('sat_o', Text(5)),
              Column('sat_c', Text(5)),
              Column('closed', Text(100)),
              Column('other', Text(100))
              )
# create engine for SQLite DB
engine = create_engine('sqlite:///P:\Code\WEB\RML\static\data.db')
# activate engines
metadata.create_all(engine)


def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if session.get("user_id") is None:
            return redirect("/")
        return f(*args, **kwargs)
    return decorated_function





@app.route("/")
def index():
    # Get DB
    connection = engine.connect()
    query = select([users]).where(users.c.id == 1)
    rp = connection.execute(query)
    result = rp.fetchall()
    first_row = result[0]
    return render_template("index.html", variable=first_row)


@app.route("/map")
def map():
    return render_template("map.html")


@app.route("/contact")
def rdv():
    return render_template("contact.html")


# form RDV
@app.route("/form")
def form():
    return render_template("form.html")
#


@app.route('/email')
def email():
    return render_template("email.html")


@app.route("/login", methods=['GET', 'POST'])
def login():

    # clear id session
    session.clear()

    if request.method == "GET":
        return render_template("login.html")

    else:  # POST
        if not request.form.get("username"):
            return render_template("index.html")
        elif not request.form.get("password"):
            return render_template("index.html")

        connection = engine.connect()

        # read DB
        query = select([users])
        rp = connection.execute(query)
        result = rp.fetchall()
        # check password
        if (not check_password_hash(result[0][users.c.hash], request.form.get("password"))) or (not (result[0][users.c.username]) == (request.form.get("username"))):
            return render_template("index.html")
        else:
            # session = user row value = id
            session["user_id"] = result[0]["id"]
            return render_template("upgrade.html")


# Form upgrade with decorator
@app.route("/upgrade", methods=['GET', 'POST'])
@login_required
def upgrade():
    if request.method == 'GET':
        return render_template("upgrade.html")
    else:  # POST

        id = session['user_id']

        # access DB
        sql = update(users).where(users.c.id == id)
        sql = sql.values(mon_o=request.form.get('mon_o'),
                         mon_c=request.form.get('mon_c'),
                         tue_o=request.form.get('tue_o'),
                         tue_c=request.form.get('tue_c'),
                         wed_o=request.form.get('wed_o'),
                         wed_c=request.form.get('wed_c'),
                         thu_o=request.form.get('thu_o'),
                         thu_c=request.form.get('thu_c'),
                         fri_o=request.form.get('fri_o'),
                         fri_c=request.form.get('fri_c'),
                         sat_o=request.form.get('sat_o'),
                         sat_c=request.form.get('sat_c'),
                         closed=request.form.get('closed'),
                         other=request.form.get('other')
                         )

        connection = engine.connect()
        # insert the statement into the DB
        result = connection.execute(sql)
        return render_template("index.html", variable=result[0])

макет. html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <!-- font awesome -->
    <script
      src="https://kit.fontawesome.com/a4abbdb9d0.js"
      crossorigin="anonymous"
    ></script>
    <!-- add font family -->
    <link
      href="https://fonts.googleapis.com/css?family=Roboto&display=swap"
      rel="stylesheet"
    />
    <!-- OSM -->
    <link
      rel="stylesheet"
      href="https://unpkg.com/leaflet@1.3.1/dist/leaflet.css"
      integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ=="
      crossorigin=""
    />
    <script
      src="https://unpkg.com/leaflet@1.3.1/dist/leaflet.js"
      integrity="sha512-/Nsx9X4HebavoBvEBuyp3I7od5tA0UzAxs+j83KgC8PU0kgB4XiK4Lfe4y4cgBtaRJQEIFCW+oC506aPT2L1zw=="
      crossorigin=""
    ></script>

    <link rel="stylesheet" href="/static/style.css" />
    <title>Radiologie Mont Lucas</title>
  </head>

  <body>
    {% block body %} {% endblock %}
  </body>
</html>

app.yaml:

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
  python_version: 3

needs.txt:

# requirement for rml app.py
gunicorn==19.9.0
sqlalchemy==1.3.11
werkzeug==0.16.0
jinja2==2.10.3
flask==1.1.1

У меня есть pu sh с локального на github

Затем с github на GCP:

новый проект => открыть в терминале

git клон

cd имя проекта

pip install -t lib -r needs.txt

gcloud init

приложение gcloud deploy

просмотр приложения gcloud

Нет ошибок, но когда я открываю браузер, я получаю:

Браузер:

Внутренняя ошибка сервера Сервер обнаружил внутреннюю ошибку и не смог выполнить ваш запрос. Либо сервер перегружен, либо в приложении произошла ошибка.

Консоль браузера:

Кодировка символов документа HTML не была объявлена. Документ будет отображаться с искаженным текстом в некоторых конфигурациях браузера, если документ содержит символы вне диапазона US-ASCII. Кодировка символов страницы должна быть объявлена ​​в документе или в протоколе передачи.

Я пробовал весь день другой вид туто, но не нашел ничего ясного. Последнее, что я сделал, это изменил app.yaml (и добавил gunicorn в файл require.txt).

Я не уверен, что я сделал с gunicorn.

I ' мы прочитали что-то о некоторых запросах https, которые не выполняются, потому что мой веб-сайт http Но я действительно не уверен.

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

Редактировать: добавление кода ошибки: IndexError: список индексов вне диапазона в индексе (/home/vmagent/app/main.py:59) в dispatch_request (/env/lib/python3.6/ site-packages / flask / app.py: 1935) в full_dispatch_request (/env/lib/python3.6/site-packages/flask/app.py:1949) при ререйзе (/ env / lib / python3). 6 / site-packages / flask / _compat.py: 39) в handle_user_exception (/env/lib/python3.6/site-packages/flask/app.py:1820) в full_dispatch_request (/ env / lib / python3 .6 / site-packages / flask / app.py: 1951) в wsgi_app (/env/lib/python3.6/site-packages/flask/app.py:2446)

Спасибо в авансовый

1 Ответ

1 голос
/ 12 марта 2020

В трассировке указано, в чем проблема:

@app.route("/")
def index():
    # Get DB
    connection = engine.connect()
    query = select([users]).where(users.c.id == 1)
    rp = connection.execute(query)
    result = rp.fetchall()
    first_row = result[0] # <- here you're trying to get 1st element \
    # but the the `result` is empty -> IndexError

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

...