2016-05-07 2 views
1

Я пытаюсь это в течение нескольких недель, пытаясь устранить все глупые ошибки, которые я делаю (новичок!). Это моя фабрика приложений. Я использую учебник по учебным приложениям для Google приложений и получая свои сиськи и биты и пытаясь сформировать что-то свое. Я застрял в функциях входа в систему. Я использую структуру пакета.cant access session при использовании библиотеки oauth2 в фляже

from woles_search import search#this is blueprint object 
from PTE import PTE#this is blueprint object 
from Home import home#this is blueprint object 
from flask import current_app, Flask, redirect, request, session, url_for,g 
import json 
import config 
import logging 
import httplib2 
infouser=""#tried to make this variable global and pass it in it templates but didnt worked 

# [START include] 
from oauth2client.contrib.flask_util import UserOAuth2 

oauth2 = UserOAuth2() 
# [END include] 
#creates a app instance in main directory 
def create_app(config): 
    app=Flask(__name__) 
    app.config.from_object(config) 
    #app.config['SECRET-KEY']="secret" 
    print app.config['SECRET_KEY'] 
    from app_folder.woles_search import search 
    from app_folder.PTE import PTE 
    from app_folder.Home import home 
    with app.app_context(): 
     model = get_model() 
     model.init_app(app) 

    oauth2.init_app(
    app, 
    scopes=['email', 'profile'], 
    authorize_callback=_request_user_info) #configuring oauth 

    app.register_blueprint(search,url_prefix="/search") 
    app.register_blueprint(PTE,url_prefix="/PTE") 
    app.register_blueprint(home,url_prefix="/home") 

    return app 

def get_model(): 
    model_backend = current_app.config['DATA_BACKEND'] 
    print model_backend 
    if model_backend == 'datastore': 
     from auth_package import model_datastore 
     model = model_datastore 
    else: 
     raise ValueError(
      "No appropriate databackend configured. " 
      "Please specify datastore, cloudsql, or mongodb") 

    return model 


    # [START request_user_info] 
def _request_user_info(credentials): 
    """ 
    Makes an HTTP request to the Google+ API to retrieve the user's basic 
    profile information, including full name and photo, and stores it in the 
    Flask session. 
    """ 
    http = httplib2.Http() 
    credentials.authorize(http) 
    resp, content = http.request(
     'https://www.googleapis.com/plus/v1/people/me') 

    if resp.status != 200: 
     current_app.logger.error(
      "Error while obtaining user profile: %s" % resp) 
     return None 


    infouser = json.loads(content.decode('utf-8')) 
    #current_app.logger.info(infouser)#this works 
    session['profile'] = infouser 
    current_app.logger.info(session['profile']) 
    #this is a test for session,since it does not show up in templates,it works, get printed out in console 

Это главный .py и app.yaml (копия и вставить, ничего особенного) main.py

import config 
from flask import render_template,current_app,session 
from app_folder.app import create_app 

app = create_app(config) 
app.config.from_object(config) 
print app.config['SECRET_KEY'] 


    # Add a logout handler. 
@app.route('/logout') 
def logout(): 
    # Delete the user's profile and the credentials stored by oauth2. 
    del session['profile'] 
    oauth2.storage.delete() 
    return redirect(request.referrer or '/') 
    # [END logout] 


@app.route('/') 
def index(): 
    return render_template('base.html')</code> 

это app.yaml

runtime: python27 
api_version: 1 
threadsafe: yes 
handlers: 
- url: /.* # This regex directs all routes to main.app 
    script: main.app 
ibraries: 
- name: jinja2 
    version: latest 

Вот шаблон

<html lang="en"> 
    <head> 
    <title>Bookshelf - Python on Google Cloud Platform</title> 
    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"> 
    </head> 
    <body> 
    <div class="navbar navbar-default"> 
     <div class="container"> 
     <div class="navbar-header"> 
      <div class="navbar-brand">Bookshelf</div> 
     </div> 
     <ul class="nav navbar-nav"> 
      <li><a href="/books">Books</a></li> 
      <li><a href="/books/mine">My Books</a></li> 
     </ul> 
     {# [START profile] #} 
     {{session.profile.displayName}} 
     <p class="navbar-text navbar-right"> 
     {% if session.profile %} 
      <a href="/logout"> 
      {% if session.profile.image %} 
       <img class="img-circle" src="{{session.profile.image.url}}" width="24"> 
      {% endif %} 
      {{session.profile.displayName}} 
      </a> 
     {% else %} 
      <a href="/oauth2authorize">Login</a> 
     {% endif %} 
     </p> 
     {# [END profile] #} 
     </div> 
    </div> 
    <div class="container"> 
     {% block content %}{% endblock %} 
    </div> 
    {{user}} 
    </body> 
</html> 
</code> 

Отсутствует e использование {{session.profile.displayname}} вне блока if, это должно было увидеть, что было ошибкой, но в конечном итоге оно также перестало показывать ошибку (??) в файле base.html, но все еще показывает ошибку при выходе из системы view throwing error «не было найдено ключевого профиля». Я могу видеть информацию о пользователе в моем выпуске консоли. У меня есть файл конфигурации в корне. Я проверил его, он загружает учетные данные google и секретный ключ. Я использую google cloud sdk shell поскольку мой dev_appserver.py больше не распознается в cmd на окнах после gcloud sdk update.I отменил учетные данные на оболочке оболочки sdk, чтобы убедиться, что это не интерферирует (если это так!), а также попытался, пока он был авторизирован. I попытался сделать COOKIE_SECURE_PATH = Ложно и много вещей, о которых я мог думать, но никаких результатов. Пожалуйста, помогите !!!

ответ

1

Слишком много нерешенных ссылок для проверки кода. Я предлагаю вам написать тестовые примеры для небольших функций и, если возможно, попробовать еще одну oauth-структуру для приложения python, например simpleauth, если она сработает для вас. https://github.com/crhym3/simpleauth Я тоже боролся с расширенными платформами входа, которые не работали до тех пор, пока простота не сработала. Любые причины не использовать его? Я могу помочь тебе. Вы можете прочитать мой вопрос об Oauth в appengine здесь How to update User with webapp2 and simpleauth?

+0

. Спасибо за совет. Но мой мотив - это больше обучения, чем building.I особенно находят отладки очень полезный способ обучения, хотя и сильно разочаровывает. Как-никак .. я нашел преступника ..Это было SESSION_COOKIE_HTTPONLY в конфигурации по умолчанию для флэшей, которая по умолчанию соответствует true.see http://flask.pocoo.org/docs/0.10/config, после того, как вы изменили ее на False, я вижу сессию в разных представлениях в разных чертежах, хотя все же не удалось получить доступ к html-шаблонам. Также, извините, я до сих пор не знаю, как писать unittests ... они действительно кажутся сложными. –

+0

Если вы нашли решение, разместите свои результаты как [self-answer] (http://stackoverflow.com/help/self-answer). – Adam

Смежные вопросы