У меня есть 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)
Спасибо в авансовый