使用Flask部署GCP网站时出现500内部错误

时间:2020-03-11 20:44:27

标签: google-app-engine web flask google-cloud-platform

我已经完成了一个运行正确语言环境的网站(带有实时服务器的VScode)。

我将HTML / CSS / JScript与python Flask,sqlalchemy和werkzeug一起使用。

文件系统由以下组成:

静态(img / data.db / style.css)

模板(layout.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])

layout.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

requirements.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

我已经从本地推送到github

然后从github转到GCP:

新项目=>在终端中打开

git clone

cd项目名称

pip install -t lib -r requirements.txt

gcloud初始化

gcloud应用部署

gcloud应用浏览

没有错误,但是当我打开浏览器时,我得到了:

浏览器:

内部服务器错误 服务器遇到内部错误,无法完成您的请求。服务器过载或应用程序错误。

浏览器控制台:

未声明HTML文档的字符编码。如果文档包含来自US-ASCII范围之外的字符,则在某些浏览器配置中,文档将呈现乱码。页面的字符编码必须在文档或传输协议中声明。

我一整天都在尝试不同类型的tuto,但我发现并不清楚。我要做的最后一件事是修改app.yaml(并在requirements.txt中添加gunicorn)。

我不确定我对古尼康做了什么。

由于我的网站是http,我已经阅读了一些有关失败的https请求的信息。但是我真的不确定。

我不知道要在GCP中部署我的Flask Web应用程序的去向。

编辑:添加错误代码: IndexError:在full_dispatch_request()处dispatch_request(/env/lib/python3.6/site-packages/flask/app.py:1935)处索引(/home/vmagent/app/main.py:59)的索引超出范围/env/lib/python3.6/site-packages/flask/app.py:1949)在handle_user_exception(/ env)处提高(/env/lib/python3.6/site-packages/flask/_compat.py:39) /lib/python3.6/site-packages/flask/app.py:1820),位于wsgi_app(/ env / lib)的full_dispatch_request(/env/lib/python3.6/site-packages/flask/app.py:1951) /python3.6/site-packages/flask/app.py:2446)

预先感谢

1 个答案:

答案 0 :(得分:1)

回溯表明问题所在:

@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

为避免此错误,您必须在尝试使用其元素之前检查该集合是否为空。