我已经完成了一个运行正确语言环境的网站(带有实时服务器的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)
预先感谢
答案 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
为避免此错误,您必须在尝试使用其元素之前检查该集合是否为空。