Flask & Google API - RuntimeError: Работа вне контекста запроса - PullRequest
0 голосов
/ 18 октября 2019

Я новичок во флеше, API и программировании в целом, поэтому, пожалуйста, потерпите меня. Это мой первый практический проект, и он небольшой, но я хочу его завершить.

Итак, у меня есть веб-сайт, который принимает пользовательский ввод, помимо прочего, также выбор времени, на основании которого программа с использованием календаря GoogleAPI должен быть показан. Сама форма работает так же, как и часть повестки дня, если время вводится вручную, но я не могу понять, как извлечь выбранное время из формы.

Это часть регистрации, где время вводитсяпользователь:

import os
import secrets
from PIL import Image
from flask import render_template, url_for, flash, redirect, request
from sms_agenda import app, db, bcrypt, mail
from sms_agenda.forms import (RegistrationForm, LoginForm, UpdateAccountForm, 
                                RequestResetForm, ResetPasswordForm)
from sms_agenda.models import User, Post
from flask_login import login_user, logout_user, current_user, login_required
from flask_mail import Message

@app.route("/register", methods=['GET', 'POST'])
def register():
    if current_user.is_authenticated:
        return redirect(url_for('home'))
    form = RegistrationForm()
    if form.validate_on_submit():
        hashed_password = bcrypt.generate_password_hash(form.password.data).decode('utf-8')
        user = User(username=form.username.data, email=form.email.data, 
                    phone=form.phone.data, time=form.time.data, password=hashed_password)
        db.session.add(user)
        db.session.commit()
        flash(f'Your account has been created, you can now log in', 'success')
        return redirect(url_for('login'))
    return render_template('register.html', title='Register', form=form)

И это часть API в другом файле:

from __future__ import print_function
from twilio.rest import Client
import datetime
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from sms_agenda.routes import time

    chosen_int_time = ... # The time needs to be entered here
    amend_time = 24 - chosen_int_time

    now = datetime.datetime.utcnow()
    display_time = now.replace(hour=chosen_int_time)
    from_time = (display_time + (datetime.timedelta(hours=amend_time))).isoformat() + 'Z'
    to_time = (display_time + (datetime.timedelta(hours=(amend_time + 24)))).isoformat() + 'Z'

    events_result = service.events().list(calendarId='primary', timeMin=from_time, 
                                        timeMax=to_time, singleEvents=True,
                                        orderBy='startTime').execute()
    events = events_result.get('items', [])

    date = datetime.date.today()
    tomorrow = str(date + datetime.timedelta(days=1))
    agenda = ''
    if not events:
        print('No upcoming events found.')
    for event in events:
        start = event['start'].get('dateTime', event['start'].get('date'))
        event = start[11:16] + ' - ' + event['summary']
        agenda += (f"{event} \n")
    return (f"Your agenda for " + tomorrow + '\n' + agenda)

Я пробовал разные вещи, выбрасывая различные ошибки, но, похоже, проблема связана с контекстом запроса.

Одна вещь, которую я пытался добавить, это ниже def register():

def time():
    with app.app_context():
        form = RegistrationForm()
        if form.validate_on_submit():
            time_chosen = User.query.filter_by(email=form.time.data).first()
            return time_chosen

А затем использовать time() в chosen_int_time.

К сожалению, я не могуотладить это через официальную документацию.

РЕДАКТИРОВАТЬ: Извиняюсь, что не опубликовал весь код, я не знал, что невозможно дать какой-либо разумный совет таким образом.

Я обнаружил, чтопроблема не в том, чтобы были настроены какие-либо маршруты для действий, которые я хотел предпринять, я представлял, что вы можете просто вызывать функции без этого. Ну, может быть, вы можете ...

В любом случае, я добавил маршруты и внес небольшие изменения в функции, и теперь это работает. Но все еще далеко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...