Nginx的烧瓶“重定向(url_for)”和“ @login_required”错误

时间:2019-05-08 20:28:06

标签: python nginx flask raspberry-pi webserver

我在树莓派上托管了一个Web应用程序,我正试图从互联网上访问它。我正在使用Dataplicity(https://docs.dataplicity.com/docs/host-a-website-from-your-pi)来使用Nginx访问我的服务器。

在本地,一切正常。我会用

启动该应用
flask run --host=0.0.0.0 --port=8000

使用端口8000或80在浏览器中转到我的pi地址,并成功获取应用程序的主页。直到那时,该过程在数据重复性方面同样有效。

当我调用redirect(url_for)函数(包括@login_required)时出现问题。通过数据多样性调用它后,立即获得“ 503服务暂时不可用”。

当我在本地工作时(或在外部使用端口转发->这使我认为问题出在Dataplicity和nginx上),当我尝试访问我的/ camera view函数而不先登录时,看到以下GET请求到应用程序:

127.0.0.1 - - [07/May/2019 22:27:47] "GET /camera HTTP/1.0" 302 -
127.0.0.1 - - [07/May/2019 22:27:47] "GET /login?next=%2Fcamera HTTP/1.0" 200 -

当我尝试通过数据一致性访问它时,我只会得到:

127.0.0.1 - - [07/May/2019 22:28:37] "GET /camera HTTP/1.0" 302 -

:“ GET / login?next =%2Fcamera HTTP / 1.0” 200-不存在。

如果这可以解决问题,则数据重复性中的每个URL均显示为https,除非我单击redirect(url_for)或@login_requested函数,否则它将变为http。

我尝试了在Stack Overflow上找到的几种不同的Nginx配置,并且还尝试通过阅读文档来对其进行一些调整。这是徒劳的。我不会分享它们,因为我尝试过的所有变化都会产生相同的效果。

这是我实际的nginx配置:

server {
        listen 80 ;
        server_name _;
        access_log /var/log/app_access.log;
        error_log /var/log/app_error.log;
        location / {
            proxy_pass http://localhost:8000;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

这是我应用中的重要代码:

@app.route("/")
def index():
    return render_template('index.html', title='Cat')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if current_user.is_authenticated:
        return redirect(url_for('index'))
    form = LoginForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.username.data).first()
        if user is None or not user.check_password(form.password.data):
            flash('Invalid username or password')
            return redirect(url_for('login'))
        login_user(user, remember=form.remember_me.data)
        next_page = request.args.get('next')
        if not next_page or url_parse(next_page).netloc != '':
            next_page = url_for('index')
        return redirect(next_page)
    return render_template('login.html', title='Sign In', form=form)

@app.route("/camera")
@login_required
def stream():
    templateData = {
        'title' : "Stream"
    }
    return render_template('camera.html', **templateData)

我希望在外部(通过数据多样性,因为我不喜欢开放端口的想法)获得与在本地获得的相同体验。就是说,能够使用我的“登录”视图功能而不会在每次重定向时出现错误。

更新:

我的应用终于可以运行了。我认为答案是Gunicorn。我有以下supervisor文件,我几乎没有进行测试,因为我没有从文件中得到任何明确的反馈:

[program:app]
command=/var/www/html/app/sandbox/bin/gunicorn -b localhost:8000 -w 4 ...
directory=/var/www/html/app/
user=pi
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true

今天,尝试了太多时间后,该应用程序在我重新加载supervisorctl后才开始运行。我仍然必须找出是什么使此特定的nginx配置仅在Gunicorn运行时起作用。

flask run --host=0.0.0.0 --port=8000仍然无法正常工作。

gunicorn -b 0.0.0.0:8000 -w 4 app:app在工作。

0 个答案:

没有答案