繁体   English   中英

Python/Flask 登录表单在 IIS 上引发 500 错误

[英]Python/Flask Login form throws 500 error on IIS

由于我的工作限制,我不得不依靠在IIS 7.5上托管我的 web 应用程序。 我将IIS配置为通过wfastcgi.py为应用程序提供服务

问题是,当单击登录按钮时,登录表单会在 IIS 上引发HTTP 500错误。 该网站被加载没有问题。 此外,当我在 Flask 开发服务器上运行代码时,代码工作得非常好。

我有代码的扩展版本,可以访问 sqlite 数据库。 我能够将问题缩小到登录会话创建部分。 我不确定问题是关于IIS如何使用wfastcgi.py处理POSTGET请求的方式,还是其他什么。

这是代码的简化版本,它抛出相同的错误: UPDATE : 将视图函数更改为正确的返回重定向。

import wiw_ad_controller as parser
import sys
from flask import Flask, flash, render_template, redirect, url_for, request, session, abort
import os



app = Flask(__name__)

@app.route('/')
@app.route('/index', methods=['GET', 'POST'])
def index():
    if not session.get('logged_in'):

        return render_template('login.html')        
    else:
        return render_template('index.html')        


@app.route('/login', methods=['POST'])
def login():
    if request.form['username'] == 'admin' and request.form['password'] == 'admin':
        session['logged_in'] = True
        flash("Login was successfull")
    else:
        flash("Wrong password!")
    return redirect(url_for('index')) 


@app.route('/search', methods=['GET','POST'])
def lookup_data():
    if (session.get('logged_in')==True):
        if request.method == 'POST' or request.method == 'GET':

            if (request.form['gpn'] and request.form['gpn'].isdigit()):

                #code removed - not needed
                return render_template('fetched_data.html', user_wiw=user_wiw, user_ad=user_ad)
            else:
                flash('Wrong ID')
            return index()
    return redirect(url_for('index')) 


@app.route("/logout")   
def logout():
    session['logged_in'] = False
    return redirect(url_for('index')) 


@app.errorhandler(500)
def internal_error(exception):
    app.logger.exception(exception)
    return render_template('500.html'), 500 


@app.errorhandler(404)
def internal_error(exception):
    app.logger.exception(exception)
    return render_template('404.html'), 404




if __name__ == '__main__':
    app.secret_key=os.urandom(12)
    app.run(debug=True)

发现问题了。 我没有意识到,通过wfastcgi.py调用我的脚本,主函数永远不会运行。

登录功能不起作用,因为它需要先运行app.secret_key=os.urandom(12)

我使用Miguel Grinberg的以下代码来找出问题所在,因为debug=True没有在IIS prod 环境中提供任何输出。

@app.errorhandler(500)
def internal_error(exception):
    app.logger.exception(exception)
    file_handler = RotatingFileHandler('C:\inetpub\wwwroot\logs.log', 'a', 1 * 1024 * 1024, 10)
    file_handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'))
    app.logger.setLevel(logging.INFO)
    file_handler.setLevel(logging.INFO)
    app.logger.addHandler(file_handler)
    app.logger.info('microblog startup')
    return render_template('500.html'), 500 

希望,这将帮助其他与我处于相同情况的人。

注意:必须在 wwwroot 和所有文件上设置读/写权限才能使其工作。

您还需要导入日志,从日志导入 RotatingFileHandler,从 Flask 导入 render_template,在 tempaltes 文件夹中创建 500.html 文件。

您的视图函数( search()login() )的返回不正确。 例如

return redirect(url_for('index'))

应该用于返回到索引页。

请参阅有关重定向的Flask 文档

我有同样的错误,但我的应用程序已经有一个密钥。

唉! 经过两天的搜索,我用你的函数来显示回溯,我缩小了我的问题。

执行应用程序的进程无权访问数据库。 这个问题和iis的配置有关。 应用程序池的身份必须有权访问数据库。 您可以按照此处的说明更改此身份

对于任何人在使用 Flask 的 iis 中面临的其他问题,我建议使用名称 asp.net 而不是 python 或 flask 来搜索它们,例如:使用:“IIS 内部服务器错误 asp.net”而不是:“IIS 内部服务器错误烧瓶”

伙计们,我遇到了同样的问题。 这是适用于大多数人的解决方案。 发生此问题是因为服务器在没有 secret_key 或其他东西的情况下连接到数据库。

确保将以下行放在 Flask 应用程序声明的正下方(在示例中 app = Flask())

app.secret_key=os.urandom(12)
app.run(debug=True)

有了上面的内容,您就可以轻松地调试问题了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM