Я получаю внутреннюю ошибку сервера для моего приложения Flask, размещенного на PythonAnywhere - PullRequest
0 голосов
/ 29 апреля 2019

Итак, когда я впервые развернул свое приложение, оно работало очень хорошо. Он показал все страницы, я был в состоянии писать и читать из моей базы данных PythonAnywhere MySQL. Затем через 10 минут я получаю сообщение об ошибке на внутреннем сервере. Затем, когда я перезагружаю приложение, оно работает в течение 10 минут, затем возвращается к внутренней ошибке сервера. Детали ниже показывают мой код, который связывается с моей базой данных, код ошибки server.log и код error.log, который я также получаю.

Журнал сервера:

2019-04-29 01:06:40 Mon Apr 29 01:06:40 2019 - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request / (ip 10.0.0.162) !!!

=============================================== ===============================

Журнал ошибок:

2019-04-29 01:06:40,959: Exception on / [GET]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/chronic007/TheCronica/index.py", line 21, in home_page
    cursor.execute(query)
  File "/usr/local/lib/python2.7/dist-packages/mysql/connector/cursor.py", line 393, in execute
    self._handle_result(self._connection.cmd_query(stmt))
  File "/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", line 586, in cmd_query
statement))
  File "/usr/local/lib/python2.7/dist-packages/mysql/connector/connection.py", line 386, in _send_cmd
packet_number)
  File "/usr/local/lib/python2.7/dist-packages/mysql/connector/network.py", line 104, in send_plain
    raise errors.OperationalError(str(err))
OperationalError: [Errno 32] Broken pipe

=============================================== ==============================

Вот мой файл фляги питона:

from flask import Flask
from flask import render_template
from flask import request
import mysql.connector

app = Flask(__name__)
db = mysql.connector.connect(
    host="xxxx.mysql.pythonanywhere-services.com",
    user="xxxxx",
    passwd="xxxxxx",
    database= "xxxxxx"
)

cursor = db.cursor()

@app.route('/')
def home_page():
    query = "SELECT * FROM Articles"
    cursor.execute(query)
    data = cursor.fetchall()
    return render_template('index.html', value=data)

@app.route('/static/index.html')
def static_home():
    query = "SELECT * FROM Articles"
    cursor.execute(query)
    data = cursor.fetchall()
    return render_template('index.html', value=data)

@app.route('/static/about.html')
def static_about():
    return render_template('about.html')

@app.route('/admin')
def admin_page():
    return render_template('admin.html')

@app.route('/admin', methods=['POST'])
def submit_form():
    query = "INSERT INTO Articles (Title, Author, Date, Description, Content, Link) VALUES (%s, %s, %s, %s, %s, %s)"
    if request.method == 'POST' :
        title = request.form.get('Title')
        author = request.form.get('Author')
        date = request.form.get('Date')
        description = request.form.get('Description')
        content = request.form.get('Content')
        link = request.form.get('Link')
    val = (title, author, date, description, content, link)
    cursor.execute(query, val)
    db.commit()
    return render_template('admin.html')

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Вы открываете соединение с БД на уровне модуля (вне функций вашего представления), поэтому оно может быть недействительным к моменту вызова представления; Соединения с базой данных отключаются, когда они некоторое время не используются, что объясняет проблему, с которой вы столкнулись. Вам следует либо создать объекты db и cursor внутри каждой функции представления, которая их использует, либо еще лучше использовать менеджер соединений с базой данных, такой как SQLAlchemy.

Эта страница справки PythonAnywhere содержит больше информации об управлении соединениями , и в этом посте блога есть пошаговое руководство по созданию веб-сайта с поддержкой баз данных с использованием Flask и SQLAlchemy в PythonAnywhere .

0 голосов
/ 29 апреля 2019

Сначала этот код находится вне оператора if

    val = (title, author, date, description, content, link)
        cursor.execute(query, val)
        db.commit()

Вам не нужны два представления для администрирования, просто сделайте это

@app.route('/admin', methods=['GET', 'POST'])
def submit_form():
    query = "INSERT INTO Articles (Title, Author, Date, Description, Content, Link) VALUES (%s, %s, %s, %s, %s, %s)"
    if request.method == 'POST' :
        title = request.form.get('Title')
        author = request.form.get('Author')
        date = request.form.get('Date')
        description = request.form.get('Description')
        content = request.form.get('Content')
        link = request.form.get('Link')
        val = (title, author, date, description, content, link)
        cursor.execute(query, val)
        db.commit()
        return render_template('admin.html', message="success")
    else:
        return render_template('admin.html')
...