3

我对 Web 开发和 Python 相当陌生,正在尝试使用 python 烧瓶制作一个 facebook 应用程序。在本教程中找到了一些我用来入门的代码:http ://ryaneshea.com/facebook-authentication-for-flask-apps

Facebook OAuth 身份验证正在运行,用户第一次使用该应用程序时,系统会要求他们授予该应用程序权限。之后,它们应该被重定向到应用程序索引站点。如果在 Facebook 中使用该应用程序,则会显示消息:“405 方法不允许”。如果从 Facebook 外部(从我的 apache Web 服务器)使用该应用程序,则重定向有效。

当从 Facebook 外部使用该应用程序时,只会发出 GET 请求,但当从 Facebook 内部使用时,这是给出 405 错误的 POST 请求:

"POST /?fb_source=search&ref=br_tf HTTP/1.1""

关于如何接受来自 Facebook 的 POST 请求以便重定向用户的任何建议?

以下是代码的相关部分:

from flask import render_template, url_for, request, session, redirect

from flask_oauth import OAuth

oauth = OAuth()

facebook = oauth.remote_app('facebook',

                        base_url='https://graph.facebook.com/',
                        request_token_url=None,
                        access_token_url='/oauth/access_token',
                        authorize_url='https://www.facebook.com/dialog/oauth',
                        consumer_key=FACEBOOK_APP_ID,
                        consumer_secret=FACEBOOK_APP_SECRET,
                        request_token_params={'scope': 'email, '}
)

app = Flask(__name__)

@facebook.tokengetter
def get_facebook_token():
    return session.get('facebook_token')

def pop_login_session():
    session.pop('logged_in', None)
    session.pop('facebook_token', None)

@app.route("/")
def index():
    return render_template('index.html')

@app.route("/facebook_login")
def facebook_login():
    return facebook.authorize(callback=url_for('facebook_authorized',
                                               next=request.args.get('next'), _external=True))

@app.route("/facebook_authorized")
@facebook.authorized_handler
def facebook_authorized(resp):
    next_url = request.args.get('next') or url_for('index')
    if resp is None or 'access_token' not in resp:
        return redirect(next_url)

    session['logged_in'] = True
    session['facebook_token'] = (resp['access_token'], '')

    return redirect(next_url)
4

1 回答 1

3

我通过为适当的路由指定 GET 和 POST 方法来修复它。必须重新启动 apache 才能使其正常工作。

这是语法:

@app.route("/facebook_authorized", methods=['GET', 'POST'])
于 2013-11-06T04:38:23.230 回答