web-dev-qa-db-fra.com

Variable globale et python flask

Ce que je veux faire, c'est simplement afficher le premier événement d'une API. La variable est appelée "premier événement" et la valeur doit s'afficher sur la page Web. Mais le premier événement est à l'intérieur d'un def, donc je le change en une variable globale et j'espère qu'il peut être utilisé à travers différentes fonctions. Mais il montre "NameError: le nom global 'firstevent' n'est pas défini". Voici ce que je fais:

définir une variable globale

global firstevent

envoyer à cette variable une valeur aléatoire, supposée être events['items'][1]['end']

firstevent = 1

afficher la valeur de firstevent sur le site Web.

@app.route("/")
def index():
    return 'User %s' % firstevent

Je ne sais pas ce qui se passe maintenant, c'est peut-être un problème de portée? J'ai vérifié de nombreuses réponses en ligne mais je ne trouve toujours pas la solution.

Voici les détails (pas le code entier)

import os

# Retrieve Flask, our framework
# request module gives access to incoming request data
import argparse
import httplib2
import os
import sys
import json

from flask import Flask, request
from apiclient import discovery
from oauth2client import file
from oauth2client import client
from oauth2client import tools

from apiclient.discovery import build
from oauth2client.client import OAuth2WebServerFlow

import httplib2

global firstevent  
app = Flask(__name__)

def main(argv):
  # Parse the command-line flags.
  flags = parser.parse_args(argv[1:])

  # If the credentials don't exist or are invalid run through the native client
  # flow. The Storage object will ensure that if successful the good
  # credentials will get written back to the file.
  storage = file.Storage('sample.dat')
  credentials = storage.get()
  if credentials is None or credentials.invalid:
    credentials = tools.run_flow(FLOW, storage, flags)

  # Create an httplib2.Http object to handle our HTTP requests and authorize it
  # with our good Credentials.
  http = httplib2.Http()
  http = credentials.authorize(http)

  # Construct the service object for the interacting with the Calendar API.
  calendar = discovery.build('calendar', 'v3', http=http)
  created_event = calendar.events().quickAdd(calendarId='[email protected]', text='Appointment at Somewhere on June 3rd 10am-10:25am').execute()
  events = calendar.events().list(calendarId='[email protected]').execute()
  #firstevent = events['items'][1]['end']

  firstevent = 1
  #print events['items'][1]['end']

 # Main Page Route
@app.route("/")
def index():
    return 'User %s' % firstevent


# Second Page Route
@app.route("/page2")
def page2():
  return """<html><body>
  <h2>Welcome to page 2</h2>
    <p>This is just amazing!</p>
    </body></html>"""


# start the webserver
if __name__ == "__main__":
    app.debug = True
    app.run()
20
user2592038

Oui, c'est un problème de portée. Au début de votre fonction main(), ajoutez ceci:

global firstevent

Cela devrait le faire. Toute variable qui n'est pas définie à l'intérieur d'une fonction, est une variable globale. Vous pouvez y accéder directement depuis n'importe quelle fonction. Cependant, pour modifier la variable, vous devrez écrire global var dans votre fonction.

Exemple

Cela crée une variable locale "firstevent" sur la fonction:

firstevent = 0
def modify():
    firstevent = 1

Et cela modifie la variable globale "premier événement"

firstevent = 0
def modify():
    global firstevent
    firstevent = 1
24
aIKid