【发布时间】:2018-04-10 19:45:46
【问题描述】:
试图找到解决方案,失败了! :-(
我在具有蓝图授权的烧瓶应用程序上创建了一个小型 python。在 VM 中的 localhost 上一切正常,但在部署到 Apache AWS lightsail 后立即变成了一个野孩子。
这里有两个问题, 1)清除浏览器历史记录后,登录我的应用程序导致 500 内部服务器指向 user.py 中的 google_authorized 函数(无效的 google 响应)。第一次登录失败后登录没有问题。
error.log
rv = self.dispatch_request() 文件“/var/www/catalog/venv/lib/python3.5/site-packages/flask/app.py”,第 1598 行,在 dispatch_request 返回 self.view_functionsrule.endpoint
文件“/var/www/catalog/webapp/login/user.py”,第 42 行,在 google_authorized 中
resp = google.authorized_response()
文件“/var/www/catalog/venv/lib/python3.5/site-packages/flask_oauthlib/client.py”,第 677 行,在 authorized_response 数据 = self.handle_oauth2_response()
文件“/var/www/catalog/venv/lib/python3.5/site-packages/flask_oauthlib/client.py”,第 664 行,在 handle_oauth2_response type='invalid_response', data=data
flask_oauthlib.client.OAuthException:来自谷歌的无效响应
2) CRUD 按钮导致另一个 500 内部服务器。
Error.log
return appctx.app.handle_url_build_error(error, endpoint, values), referer: xxxx.com/login/google_authorized?code=4/2wVp8IC1ICD8zTV_Th81CJSjDtvtCvpCOzPI0gPrxNQ
文件“/var/www/catalog/venv/lib/python3.5/site-packages/flask/app.py”,第 1805 行,在 handle_url_build_error 中,引用:xxxx.com/login/google_authorized?code=4 /2wVp8IC1ICD8zTV_Th81CJSjDtvtCvpCOzPI0gPrxNQ
werkzeug.routing.BuildError:无法为端点“登录”构建 url。您的意思是“login.login”吗?,referer:xxxx.com/login/google_authorized?code=4/2wVp8IC1ICD8zTV_Th81CJSjDtvtCvpCOzPI0gPrxNQ
==================
Tree List of Directories and Files
1) catalog.wsgi,
with open(activator) as f:
exec(f.read(), {'__file__': activator})
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/catalog/")
from application import app as application
2) catalog.conf
<VirtualHost *:80>
ServerName xxxx.xxx
WSGIScriptAlias / /var/www/catalog/catalog.wsgi
<Directory /var/www/catalog/>
Order allow,deny
Allow from all
</Directory>
Alias /static /var/www/catalog/webapp/static
<Directory /var/www/catalog/webapp/static/>
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
3) /webapp/app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
from flask_oauthlib.client import OAuth
app = Flask(__name__)
# production configuration
# app.config.from_pyfile('/var/www/catalog/config.py')
app.config.from_object('config')
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
oauth = OAuth()
google = oauth.remote_app(
'google',
consumer_key=app.config.get('GOOGLE_CLIENT_ID'),
consumer_secret=app.config.get('GOOGLE_CLIENT_SECRET'),
request_token_params={
'scope': 'email'
},
base_url='https://www.googleapis.com/oauth2/v1/',
request_token_url=None,
access_token_method='POST',
access_token_url='https://accounts.google.com/o/oauth2/token',
authorize_url='https://accounts.google.com/o/oauth2/auth',
)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login" # set login view page
import webapp.models
import webapp.populate
import webapp.controllers
import webapp.forms
from webapp.login.user import user_login
app.register_blueprint(user_login)
db.create_all()
4) /webapp/controllers.py
from datetime import timedelta
from flask import request, render_template, flash, g, session, jsonify
from flask_login import login_required, current_user
from webapp.app import app
from webapp.forms import AddItem, EditItem, DeleteItem, AddCat, EditCat, flash_errors
from webapp.populate import insert_cat, update_cat, insert_item, update_item, delete_item, \
get_category, get_latest_items, get_item_by_cat, get_cat_for_item, get_all_items
@app.before_first_request
def initialize_user():
session.permanent = True # set permanent_session
app.permanent_session_lifetime = timedelta(days=7) # set
permanent_session valid for 7 days
if current_user.is_authenticated:
g.user = current_user
else:
g.user = None
@app.route('/', methods=['GET'])
def index():
# Main page of Catalog App #
# boolHome is a passing parameter to indicate the #
# render template is either a home page or editable page #
return render_template('index.html',
catLists=get_category(), lateLists=get_latest_items(), boolHome='True')
@app.route('/category/<string:name>/Items')
def category(name):
# Render template to display all items corresponding to the selected category
return render_template('index.html', catLists=get_category(),
countCats=get_cat_for_item(name),
catItems=get_item_by_cat(name),
boolHome='False', model='None')
@app.route('/category/add', methods=['GET', 'POST'])
@login_required
def add_cat():
# Render template to display all categories after creating a new category #
# modal is a passing parameter to either keep bootstrap modal open for #
# handling error events or render template for successful add/edit/delete #
form = AddCat(request.form)
if request.method == 'POST' and form.validate():
if insert_cat(form.name.data):
return render_template('index.html', catLists=get_category(), boolHome='True', modal='None')
else:
flash('Failed to create a new category. Try Again!', 'error')
else:
flash_errors(form)
return render_template('index.html', catLists=get_category(), lateLists=get_latest_items(), boolHome='True', form=form, modal='add-cat')
5) /webapp/login/user.py
from flask import Blueprint, redirect, url_for, request, session
from flask_login import logout_user
from webapp.app import google, facebook, login_manager
from webapp.login.models import User
from webapp.login.populate import auth_user
user_login = Blueprint("login", __name__)
@login_manager.user_loader
def load_user(id):
user = User.query.filter_by(email=id).first()
return user
@user_login.route('/login/<string:api>')
def login(api):
if api == 'google':
return
google.authorize(callback=url_for('login.google_authorized', _external=True))
else:
callback = url_for(
'login.facebook_authorized', next=request.args.get('next')
or request.referrer
or None, _external=True
)
return facebook.authorize(callback=callback)
@user_login.route("/logout")
def logout():
session.pop('facebook_token', None)
session.pop('google_token', None)
session.permanent = False
logout_user()
return redirect(url_for('index'))
@user_login.route('/login/google_authorized')
def google_authorized():
resp = google.authorized_response()
if resp is None:
return 'Access denied: reason=%s error=%s' % (
request.args['error_reason'],
request.args['error_description']
)
session['google_token'] = (resp['access_token'], '')
me = google.get('userinfo')
return auth_user(me.data, 'google')
@google.tokengetter
def get_google_oauth_token():
return session.get('google_token')
【问题讨论】:
标签: python apache amazon-web-services flask