提问者:小点点

全局变量和python flask[重复]


我想做的只是从一个API显示第一个事件。该变量被称为“firstevent”,该值应显示在网页上。但是firstevent是在def里面,所以我把它变成了一个全局变量,希望它可以在不同的函数中使用。但它显示"NameError:未定义全局名称'firstevent'"。这就是我正在做的:

定义全局变量

global firstevent

给这个变量一个随机值,它应该是事件['项目'][1]['结束']

firstevent = 1

在网站上显示firstevent的值。

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

我不确定现在发生了什么,也许是范围问题?我在网上查了很多答案,但还是找不到答案。

以下是详细信息(不是全部代码)

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='XXXX@gmail.com', text='Appointment at Somewhere on June 3rd 10am-10:25am').execute()
  events = calendar.events().list(calendarId='XXXX@gmail.com').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()

共1个答案

匿名用户

是的,这是一个范围问题。在你的main()函数的开头,添加以下内容:

global firstevent

那应该可以了。任何未在函数中定义的变量都是全局的。您可以直接从任何函数访问它。但是,要修改变量,您需要在函数中写入global var

示例

这将在函数上创建一个局部变量“firstevent”:

firstevent = 0
def modify():
    firstevent = 1

这修改了全局变量“第一事件”

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