Flask应用程序不与包含的文件通信

时间:2016-05-27 11:57:11

标签: nginx flask python-3.4 uwsgi

我正在关注教程here

我的nginx文件:

server {
    listen 80 default_server;
    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri @application;
    }
    location @application {
        include uwsgi_params;
        uwsgi_pass unix:/tmp/uwsgi.sock;
    }
}

终端事物 - 激活virtualenv之后:

uwsgi -s /tmp/uwsgi.sock --module runserver --callable app --enable-threads --uid www-data --gid www-data

cat runserver.py

from __init__ import app

import routes

if __name__ == '__main__':
    app.debug = True
    app.secret_key = "BuckyCaptainAmericaHydraStarkTonyWidowBlack"
    app.run(host='0.0.0.0', port=8080)

cat routes.py

from flask import Flask, render_template,request, session, redirect, url_for, flash, make_response
import datetime
import json
from bson.json_util import dumps
from controller import actionController
from controller import dataController
from controller import usersController
from controller import authController
import base64
from flask.ext.paginate import Pagination
from __init__ import app

@app.route('/')
def index():
        return "<h1>Hello World</h1>"

这很完美!

但是,而不是Hello World ..如果做常规的话。

@app.route('/')
def index():
        if 'loggedin' in session:
                authController.Auth.forward()

它会引发内部服务器错误。

当我删除配置并执行:

python3 runserver.py

它没有任何问题,并且通过shell启动时效果惊人!

因此,如果我调用包含的文件(通过导入),并使用uwsgi,他们就会停止工作。

1 个答案:

答案 0 :(得分:1)

Flask使用密钥对会话cookie进行签名。你给它分配一个这样的值:

if __name__ == '__main__':
    # snip
    app.secret_key = "BuckyCaptainAmericaHydraStarkTonyWidowBlack"
    # snip

此块仅在您直接执行runserver.py时运行。这就是

的原因
$ python3 runserver.py

的工作原理。但是,当您通过uWSGI运行应用程序时,检查的计算结果为false,并且永远不会设置密钥。

要解决此问题,请将app.secret_key = ...移到if块之外。更好的是,将其移至__init__.py,在那里实例化app。这样你的应用程序将始终拥有其密钥。